Доступ к компонентам из другого класса
Я очень новичок в Java.
У меня есть класс, где я создаю графический интерфейс пользователя, и другой класс (основной класс), я получаю доступ к классу графического интерфейса пользователя. В классе GUI я создаю некоторые компоненты и возвращаю их.
класс гуй,
public class Gui {
public Component getTopPanelContent(){
Jpanel jp = new Jpanel();
JComboBox cbo1 = new JComboBox();
JComboBox cbo2 = new JComboBox();
JComboBox cbo3 = new JComboBox();
JComboBox cbo4 = new JComboBox();
JComboBox cbo5 = new JComboBox();
JButton button = new JButton();
jp.add(cbo1);
jp.add(cbo2);
jp.add(cbo3);
jp.add(cbo4);
jp.add(cbo5);
jp.add(button);
return jp;
}
}
основной класс,
public void addComponents(int id){
Gui g = new Gui();
Jpanel container = new Jpanel();
if(id == 1){
container.add(g.getTopPanelContent);
}
}
до этого его работает нормально.
В основном классе есть JTextArea. Всякий раз, когда я открываю файл, мне нужно отобразить список стран в cbo1, файл содержит список стран, которые должны быть отображены,
String[] countries = editArea.getContents().split("\n");
Как передать значения страны в cbo1
Спасибо
4 ответа
Ну, я обычно вижу класс GUI, имеющий компоненты свинга в качестве атрибутов класса. Вы сделали что-то вроде класса 'util' для своего GUI, так что вам придется охотиться за своим JComboBox
Я предлагаю вам перейти к полнофункциональному классу для представления вашего графического интерфейса, например:
import javax.swing.*;
public class Gui extends JPanel {
private JComboBox cbo1 = new JComboBox();
private JComboBox cbo2 = new JComboBox();
private JComboBox cbo3 = new JComboBox();
private JComboBox cbo4 = new JComboBox();
private JComboBox cbo5 = new JComboBox();
private JButton button = new JButton();
public Gui() {
add(cbo1);
add(cbo2);
add(cbo3);
add(cbo4);
add(cbo5);
add(button);
}
}
Также добавьте геттеры и сеттеры;-).
Если вы хотите сохранить свой код по-своему, вы можете искать в выпадающем списке по индексу:
System.out.println( jp.getComponent(0) );
Или, лучше, вы можете назвать свой JComboBox, а затем искать его по имени:
cbo1.setName("countryCombo");
jp.add(cbo1);
а потом:
public Component findCbo1() {
for (Component comp : this.getComponents()) {
if(comp.getName() != null && comp.getName().equals("countryCombo")) {
return comp;
}
}
return null;
}
Два способа сделать это....
Сделайте cbo1 как,
static
... так что вам придется объявить это вне метода в области видимости класса...Так будет и так..
for(String s: countries){ Gui.cbo1.addItem(s); }
Или использовать
Singleton principle
иметьGui
класс какSingleton
, а затем использоватьComposition
получить доступ к JComboBox cbo1
Вот что вы можете сделать:
public class Gui {
public Component getTopPanelContent(){
Jpanel jp = new Jpanel();
JComboBox cbo1 = new JComboBox();
...
return jp;
}
public void addItemsToCBo1(String[] items){
for(String item : items){
cbo1.addItem(item);
}
}
}
Основной класс:
public void addComponents(int id){
Gui g = new Gui();
Jpanel container = new Jpanel();
if(id == 1){
container.add(g.getTopPanelContent);
g.addItemsToCBo1(editArea.getContents().split("\n"));
}
}
Вы можете переместить свои компоненты вверх, чтобы они стали переменными класса и добавить общедоступные методы получения. Эти получатели будут доступны из вашего основного класса.
Gui Class ->
public class Gui {
private JPanel jp;
private JComboBox cbo1;
private JComboBox cbo2;
private JComboBox cbo3;
private JComboBox cbo4;
private JComboBox cbo5;
private JButton button;
public Component getTopPanelContent(){
jp = new JPanel();
cbo1 = new JComboBox();
cbo2 = new JComboBox();
cbo3 = new JComboBox();
cbo4 = new JComboBox();
cbo5 = new JComboBox();
button = new JButton();
jp.add(cbo1);
jp.add(cbo2);
jp.add(cbo3);
jp.add(cbo4);
jp.add(cbo5);
jp.add(button);
return jp;
}
/**
* @return the jp
*/
public JPanel getJp() {
return jp;
}
/**
* @return the cbo1
*/
public JComboBox getCbo1() {
return cbo1;
}
/**
* @return the cbo2
*/
public JComboBox getCbo2() {
return cbo2;
}
/**
* @return the cbo3
*/
public JComboBox getCbo3() {
return cbo3;
}
/**
* @return the cbo4
*/
public JComboBox getCbo4() {
return cbo4;
}
/**
* @return the cbo5
*/
public JComboBox getCbo5() {
return cbo5;
}
/**
* @return the button
*/
public JButton getButton() {
return button;
}
}
Основной класс ->
public void addComponents(int id){
Gui g = new Gui();
g.getCbo1().addItem("text");
}
Хотя это решает вашу проблему, напрашивается вопрос, есть ли конкретная причина, по которой вы создаете класс только для хранения компонентов GUI? Существуют лучшие способы обработки компонентов, чем это (особенно, если ваше приложение будет больше).