Java передать объект из JFrame в JPanel - PullRequest
4 голосов
/ 28 февраля 2012

Я занимаюсь разработкой автономного приложения на Java с использованием NetBeans, которое получает и отправляет данные через последовательный порт. Я использую отличный API для последовательной связи, который называется java simple serial connector http://code.google.com/p/java-simple-serial-connector/

Пожалуйста, скачайте следующий проект NetBeans, который я создал: http://netload.in/dateiN9xmwRtn19.htm Даже если у вас нет NetBeans, вы все равно можете просмотреть код.

Выше приведен небольшой пример проекта, который я сделал, чтобы объяснить, чего я хочу достичь. Пример содержит JFrame, который содержит основной метод. Этот JFrame содержит 2 панели: панель с навигационными кнопками и панель, отображающую панель 1 и панель 2 с использованием CardLayout.

enter image description here

enter image description here

В JFrame у меня есть метод, который получает список имен портов, используя метод getPortNames () API jssc. Мой вопрос заключается в том, как передать эти строковые значения имен портов из JFrame в Panel 1 без использования следующего, поскольку он не будет работать: MyJFrame myjframe = new MyJFrame (); myjframe.getPortNames ();

Судно на воздушной подушке, полное угрей Еще раз большое спасибо за ваше объяснение, оно стоит золота. Теперь я понимаю, что моя проблема не в Java, а в NetBeans. Я недостаточно знаком с ним, но я все равно предпочел бы использовать его из-за размера и сложности моего проекта. Ниже я загрузил еще 2 снимка экрана, которые показывают, как я пытался передать ссылку "this" объекта JFrame моему объекту JPanel в NetBeans. Как вы можете видеть на скриншоте MyJFrame.java, NetBeans подчеркнула ссылку «this» как ошибку. Не могли бы вы помочь мне с этой проблемой? Кроме того, в первом предложении вашего объяснения вы упоминаете, что методы последовательного порта должны быть в отдельном классе, а не в JFrame, так как они не являются методами GUI. Я полностью согласен с вами и предпочел бы сделать это таким образом, поскольку это правильный объектно-ориентированный подход. Но, делая это таким образом, я снова сталкиваюсь с той же проблемой в NetBeans. Как теперь передать ссылку на объект из класса SerialPorts.java в JFrame, JPanel и т. Д. Таким образом, чтобы я не создавал новый объект SerialPorts все время, помните, что мне нужно, чтобы соединение оставалось открытым все время (например, без используя SerialPorts sp = new SerialPorts ();). Большое вам спасибо за вашу помощь.

Добавление «этого» в настройщик кода для Panel 1 Adding

MyJFrame.java - редактор подчеркивает ссылку «это» как ошибку MyJFrame.java - editor underlines reference

1 Ответ

12 голосов
/ 28 февраля 2012

Интересно, должны ли вы иметь имена портов, хранящиеся в классе модели без графического интерфейса и получаемые из него, а не из "JFrame", но независимо от вашего вопроса, это конкретный пример более общего вопроса: как сделать Вы передаете информацию от одного объекта GUI к другому, и это может быть обобщено далее: как вы передаете информацию от одного объекта к другому.

Простой ответ состоит в том, чтобы один объект вызывал метод для другого, что вы и пытались сделать, и что должно работать, но проблема с вашей попыткой состоит в том, что вы вызываете его не для того объекта , У вас есть объект JFrame, который уже создан, который видим и содержит необходимую вам информацию, и , - это объект, для которого вы должны вызывать свой метод, а не new JFrame объект. Конечно, новый объект построен из того же класса, но поймите, что это совершенно другой объект, чем тот, который отображается, который вам нужен.

Итак, теперь ваша проблема сводится к следующему - как мне получить ссылку на визуализированный JFrame в другой объект? Есть много способов сделать это, но самый простой способ сделать это, вероятно, передать ссылку от одного класса другому через параметр конструктора или метода.

...

Так, например, скажем, у вас есть класс с именем FooFrame, который расширяет JFrame, и он содержит объект FooPanel, который расширяет JPanel, и предположим, что вы хотите, чтобы объект FooPanel вызывал someMethod() метод FooFrame:

public class FooFrame extends JFrame {

   public String someMethod() {
      return myTextField .getText();
   }
}

Вы можете заставить FooPanel создать новый объект FooFrame и вызвать этот метод, как вы пытаетесь это сделать:

class FooPanel extends JPanel {

   public void otherMethod() {
      FooFrame fooFrame = new FooFrame();
      fooFrame.someMethod();
   }
}

Но затем вы сталкиваетесь с той же проблемой, с которой столкнулись выше. Созданный здесь объект FooFrame не отображается, и поэтому содержимое JTextField будет пустым и не очень полезным. Решение, которое я предлагаю, состоит в том, чтобы передать ссылку из исходного JFrame в JPanel через параметр конструктора, например, так:

class FooPanel extends JPanel {
   private FooFrame fooFrame;

   // constructor accepts a reference to a FooFrame object
   public FooPanel(FooFrame fooFrame) {
      this.fooFrame = fooFrame; // and sets its field with it
   }

   public void otherMethod() {
      // no longer needed!
      // FooFrame fooFrame = new FooFrame(); 


      // now method is called on the right object!
      fooFrame.someMethod(); 
   }
}

Затем вы можете создать свой объект FooPanel в FooFrame и передать в него объект FooFrame (this).

public class FooFrame extends JFrame {

   private JTextField myTextField = new JTextField(10);
   private FooPanel fooPanel;

   public FooFrame() {
      // the current FooFrame object is this!
      fooPanel = new FooPanel(this);
      add(fooPanel);
   }

   public String someMethod() {
      return myTextField .getText();
   }
}
...