Это мой FrameGUI
public FrameGUI(String title) {
super(title);
setLayout(new BorderLayout());
final JTextArea textArea = new JTextArea(); // *****
detailsPanel = new DetailsPanel();
Container c = getContentPane();
c.add(textArea, BorderLayout.CENTER);
c.add(detailsPanel, BorderLayout.NORTH);
}
Я хочу обновить этот textArea из других классов. прямо сейчас im выводят на консоль, но я хочу добавить текстовую область, созданную из этого. Я могу добавить это легко в этом классе, добавив кнопку и обработчик событий, но я хочу сделать это из другого класса, где происходят разные процессы.
Спасибо за помощь.
Ваш вопрос не зависит от Swing или GUI, но является частью более общего Java-вопроса:
Как объект одного класса может изменить состояние поля объекта другого класса?
Один из способов сделать это - с помощью методов setter. Например, вы можете дать классу, который содержит JTextArea публичный метод, который даст другим классам возможность сделать это.
Например,
// assuming the class holds a descriptionArea
// JTextArea field
public void appendToDescriptionArea(String text) {
descriptionArea.append(text);
}
Таким образом, поле JTextArea может оставаться закрытым, но все же другие классы, содержащие правильную ссылку на отображаемый графический интерфейс, который содержит это поле, могут вызывать этот метод и обновлять текст JTextArea. Обратите внимание, что распространенная ошибка заключается в том, чтобы дать классу, который хочет добавить текст, новую и полностью уникальную ссылку на класс, который содержит JTextArea, но если вы это сделаете, вы будете устанавливать текст графического интерфейса, который не отображается. Поэтому убедитесь, что вы вызываете этот метод на правильном визуализированном экземпляре.
Если этот ответ не поможет вам решить вашу проблему, рассмотрите возможность публикации дополнительной информации о соответствующих классах, включая соответствующий код и справочную информацию. Более конкретная и полезная информация, которую вы можете получить нам, обычно более конкретна и полезна для ответов, которые мы можем получить.
редактировать
Относительно этой ошибки:
"textArea не может быть разрешено"
И этот код:
public FrameGUI(String title) {
super(title);
setLayout(new BorderLayout());
final JTextArea textArea = new JTextArea(); // *****
detailsPanel = new DetailsPanel();
Container c = getContentPane();
c.add(textArea, BorderLayout.CENTER);
c.add(detailsPanel, BorderLayout.NORTH);
}
Ваша проблема заключается в том, что вы объявляете переменную textArea внутри конструктора FrameGUI, и при этом видимость переменной или "область" ограничивается только этим конструктором. Вне конструктора он не существует и не может быть использован.
Решение состоит в том, чтобы объявить переменную textArea вне конструктора, чтобы сделать его полем класса. например,:
public class FrameGUI extends JFrame { // I'm not a fan of extending JFrames.
// this variable is now visible throughout the class
private JTextArea textArea = new JTextArea(15, 40); // 15 rows, 40 columns
public FrameGUI(String title) {
super(title);
setLayout(new BorderLayout());
// final JTextArea textArea = new JTextArea(); // *** commented out
detailsPanel = new DetailsPanel();
Container c = getContentPane();
c.add(new JScrollPane(textArea), BorderLayout.CENTER); // put textarea into a scrollpane
c.add(detailsPanel, BorderLayout.NORTH);
}
public void appendToTextArea(String text) {
textArea.append(text);
}