Короткий ответ: не используйте наследование, чтобы попытаться облегчить общение между дочерними и родительскими объектами. Это не то, для чего предназначено наследование, и не как оно работает (как вы выяснили). Вместо этого используйте состав - передайте экземпляр object1 в object2, используя параметры конструктора или метода, и вызовите открытые методы для передачи информации.
Таким образом, ваш 2-й класс может иметь конструктор, который принимает параметр SSCCE, позволяет вам передать его, затем установить поле SSCCE, и это может позволить вам вызывать открытые методы вашего текущего объекта SSCCE.
Далее, как только вы исправите это, ваш код будет нарушать правила потоков Swing - вы должны только мутировать компоненты Swing в потоке событий Swing. Пожалуйста, прочитайте Урок: параллелизм в Swing
Более подробный ответ идет ....
Например, скажем, вы хотите подключить Swing GUI к Socket для простого общения в чате. Мы могли бы создать новый класс GUI, скажем, под названием SSCCE2, что-то вроде ....
import java.awt.BorderLayout;
import java.awt.event.ActionEvent;
import java.io.IOException;
import java.io.PrintWriter;
import java.net.Socket;
import javax.swing.*;
@SuppressWarnings("serial")
public class SSCCE2 extends JPanel {
private static final int GAP = 4;
private Action submitAction = new SubmitAction("Submit");
private JTextField textField = new JTextField(40);
private JTextArea textArea = new JTextArea(20, 40);
private JButton submitButton = new JButton(submitAction);
private PrintWriter printWriter = null;
private ChatWorker chatWorker = null;
public SSCCE2(Socket socket) throws IOException {
printWriter = new PrintWriter(socket.getOutputStream());
chatWorker = new ChatWorker(this, socket);
chatWorker.execute();
textArea.setFocusable(false);
JScrollPane scrollPane = new JScrollPane(textArea);
scrollPane.setVerticalScrollBarPolicy(JScrollPane.VERTICAL_SCROLLBAR_ALWAYS);
textField.setAction(submitAction);
JPanel bottomPanel = new JPanel();
bottomPanel.setLayout(new BoxLayout(bottomPanel, BoxLayout.LINE_AXIS));
bottomPanel.add(textField);
bottomPanel.add(submitButton);
setBorder(BorderFactory.createEmptyBorder(GAP, GAP, GAP, GAP));
setLayout(new BorderLayout(GAP, GAP));
add(scrollPane);
add(bottomPanel, BorderLayout.PAGE_END);
}
// Action (acts as an ActionListener) that gets text from
// JTextField and puts it into JTextArea
// And also sends it via PrintWriter to the Socket
private class SubmitAction extends AbstractAction {
public SubmitAction(String name) {
super(name);
}
@Override
public void actionPerformed(ActionEvent e) {
String text = textField.getText();
textField.selectAll();
// send this to the socket for chatting....
if (printWriter != null) {
printWriter.println(text);
}
textArea.append(text);
textArea.append("\n");
}
}
// public method to allow outside objects to append to the JTextArea
public void append(String text) {
textArea.append(text);
textArea.append("\n");
}
}
с открытым методом, скажем, public void append(String text)
, который позволяет внешним классам присоединяться к JTextArea, тогда мы передадим экземпляр этого в нужное место, здесь: chatWorker = new ChatWorker(this, socket);
, передав this
. Тогда наш ChatWorker может вызывать публичные методы:
import java.io.IOException;
import java.net.Socket;
import java.util.List;
import java.util.Scanner;
import javax.swing.SwingWorker;
//better if the threading is done with a SwingWorker
//to not run afoul of Swing threading rules
public class ChatWorker extends SwingWorker<Void, String> {
private SSCCE2 sscce2 = null;
private Scanner scanner = null;
public ChatWorker(SSCCE2 sscce2, Socket socket) throws IOException {
this.sscce2 = sscce2; // get the instance and assign to field
scanner = new Scanner(socket.getInputStream());
}
@Override
protected Void doInBackground() throws Exception {
// this is called in a background thread
while (scanner.hasNextLine()) {
publish(scanner.nextLine());
}
return null;
}
@Override
protected void process(List<String> chunks) {
// this is called on the Swing event thread
for (String text : chunks) {
sscce2.append(text); // append the texts as they come in
}
}
}