Интересно, должны ли вы иметь имена портов, хранящиеся в классе модели без графического интерфейса и получаемые из него, а не из "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();
}
}