Обращение одного jFrame к элиментам другого jFrame

250
03 января 2018, 19:12

Здравствуйте, есть ли возможность обращаться с одного jFrame к элементам другого jFrame?.

Если есть тогда к примеру у меня есть jFrame1 (в этом находится кнопка) и jFrame2 (в этом есть текстовое поле). Как реализовать что-бы при нажатии на кнопку в текстовом поле вывелось "Hello"?

Answer 1

Конечно, любой класс может обращаться к членам любого класса. Для этого методы и поля, к которым происходит обращение извне пакета, должны быть описаны с ключевым словом public. Если классы находятся в одном пакете, то такие члены могут быть оставлены без указания области видимости (т. н. "default access level", уровень доступности по умолчанию, или по другому "package access"). Почитайте подробнее на https://docs.oracle.com/javase/tutorial/java/javaOO/accesscontrol.html или в русскоязычной литературе о доступе к членам классов. По реализации взаимодействия между окнами есть более-менее общепринятые практики. Обычно с элементом, который должен реагировать на события системы (в вашем случае кнопка, реагирующая на нажатие) связывается т. наз. "слушатель" (listener) - это объект, в котором содержится метод, вызываемый системой при нажатии кнопки. Этот метод может установить текст в другой форме, если у соотв. элемента этой другой формы достаточный уровень доступности. Что-то типа такого:

... 
Button button = new Button("Button");  // Создаете кнопку
button.addActionListener(buttonListener); // Привязываете слушатель
...
// отдельное поле - Слушатель - объект анонимного класса, 
// производного от  ActionListener 
ActionListener buttonListener = new ActionListener() { 
  @Override      // переопределяем метод, который будет вызван при нажатии кнопки,
                 // чтобы он делал, что нам надо
  public void actionPerformed(ActionEvent e) { 
    jframe2.ourText.setText("Кнопка нажата"); // Устанавливаем текст во второй форме
  }
} 

Другая форма пр иэтом должна содержать такое описание:

public Text ourText = ...  

Есть более изящные способы записать то же самое, но в такой форме (на мой взгляд) принцип виден наиболее отчетливо.

В большенстве случаев, однако, лучше бывает не делать публичными элементы формы, а сделать в ней специальные публичные методы для управления формой. Это позволит в будущем легче изменить дизайн формы и/или ее функциональность, не меняя всю остальную программу. Напр. так:

  // Слушатель:   
  public void actionPerformed(ActionEvent e) { 
    jframe2.setImportantText("Кнопка нажата"); // Вызов метода 
  }
  ...
  // Вторая форма: 
  private Text ourText = ... // Элемент недоступен извне
  ....   
  public void setImportantText(String text) { // Метод доступа (сеттер)
    // Тут можно делать что-нибудь -- напр, проверить или изменить текст 
    ourText.setText(modifiedText);
    // И можно сделать еще что-нибудь -- перевести на китайский и произнести вслух
  } 

Об этом подробнее можно прочитать тут https://docs.oracle.com/javase/tutorial/uiswing/events/actionlistener.html или в русской литературе про события и слушатели.

READ ALSO
Загрузка фото VK API. Java

Загрузка фото VK API. Java

Работаю в Android StudioС помощью моей программы можно опубликовать пост в сообществе ВК

318
Как заполнить двумерный массив в Java

Как заполнить двумерный массив в Java

C Новым Годом) никак не могу понять как заполнить двумерный массив цифрами от 1 до 8 размерностью 8 на 8Кроме как заполнить его вручную

397
Очень короткий код на Java: [требует правки]

Очень короткий код на Java: [требует правки]

Здравствуйте, прошу Вас о помощи Очень короткий код на Java:

421
Проблема с запуском после добавления SharedPreferences

Проблема с запуском после добавления SharedPreferences

После добавления этих строк приложение перестало запускаться и телефон выдаёт что там угроза

289