[英]In Java Swing trigger an update in a JPanel when a ComboBox changes in another JPanel
我想根據另一個JPanel中的ComboBox的值更新JPanel。
我有一個JFrame,其中要添加兩個面板:
package gui;
import java.awt.BorderLayout;
import java.awt.EventQueue;
import java.awt.GridBagConstraints;
import java.awt.GridBagLayout;
import javax.swing.JFrame;
import javax.swing.JPanel;
import javax.swing.border.EmptyBorder;
public class MainFrame extends JFrame {
public MainFrame() {
}
private JPanel contentPane;
/**
* Launch the application.
*/
public static void main(String[] args) {
EventQueue.invokeLater(new Runnable() {
public void run() {
try {
MainFrame frame = new MainFrame();
frame.setSize(1200, 1200);
PanelClass1 panelClass1= new PanelClass1 ();
PanelClass2 panelClass2= new PanelClass2 ();
frame.getContentPane().add(panelClass1.contentPanel, BorderLayout.PAGE_START);
frame.getContentPane().add(panelClass2.contentPanel, BorderLayout.PAGE_END);
frame.setVisible(true);
} catch (Exception e) {
e.printStackTrace();
}
}
});
}
}
現在在Panel1中,我有一個ComboBox,其中需要根據其值隱藏或顯示Panel2中的字段。 我將這個ComboBox的值保存為單例。
public class PanelClass1 extends JPanel {
testComboBox = new JComboBox<ComboItem>();
testComboBox.setEditable(true);
testComboBox.addActionListener(new ActionListener() {
public void actionPerformed(ActionEvent arg0) {
POJOSingleton.getInstance().setValor(testComboBox.getSelectedItem().toString());
checkFields();
}
});
}
然后在PanelClass2中,我正在讀取該變量,然后根據該值使某些組件可見或不可見。 panelClass2的整個邏輯基於我在第一個JPanel中設置的值。
public class panelClass2 extends JPanel {
public panelClass2 () {
if(POJOSingleton.getInstance().getValor() != null) {
int value1 = posicionesTenion.get(0);
pos1.setVisible(true);
lblPos1TensionAT.setVisible(true);
...
更改ComboBox時,我應該在第二個面板中觸發刷新嗎?
最好的方法可能是使用觀察者模式 。
這樣做的方法是將一個Observable字段添加到PanelClass1中 ,並在觸發JComboBox的ActionListener時通知所有Observer。
public class PanelClass1 extends JPanel {
private JComboBox<?> testComboBox;
private Observable obs;
public PanelClass1() {
obs = new Observable();
testComboBox = new JComboBox<SingletonClass>();
testComboBox.setEditable(true);
testComboBox.addActionListener(new ActionListener() {
public void actionPerformed(ActionEvent arg0) {
SingletonClass.getInstance().setValue(testComboBox.getSelectedIndex());
obs.notifyObservers();
}
});
}
public void addObserver(Observer observer) {
obs.addObserver(observer);
}
public void removeObserver(Observer observer) {
obs.deleteObserver(observer);
}
}
現在,讓您的PanelClass2實現Observer,並在收到通知時執行代碼,如下所示:
public class PanelClass2 extends JPanel implements Observer {
public PanelClass2() {
}
@Override
public void update(Observable o, Object arg) {
int value = SingletonClass.getInstance().getValue();
// do your stuff here
}
}
說您的單例對象看起來像這樣:
public class SingletonClass {
private static final SingletonClass singleton = new SingletonClass();
private int value; // this doesn't have to be an integer, I am just using this as an example
private SingletonClass() {
}
public static SingletonClass getInstance() {
return singleton;
}
public int getValue() {
return value;
}
public void setValue(int value) {
this.value = value;
}
}
您現在可以在PanelClass2的update()方法中訪問SingletonClass實例的value字段。
大型機級只需要一個變化:您需要在PanelClass2對象添加到您的PanelClass1對象作為一個觀察者。
public class MainFrame extends JFrame {
public MainFrame() {
}
/**
* Launch the application.
*/
public static void main(String[] args) {
EventQueue.invokeLater(new Runnable() {
public void run() {
try {
MainFrame frame = new MainFrame();
frame.setSize(1200, 1200);
PanelClass1 panelClass1 = new PanelClass1();
PanelClass2 panelClass2 = new PanelClass2();
panelClass1.addObserver(panelClass2);
frame.getContentPane().add(panelClass1,BorderLayout.PAGE_START);
frame.getContentPane().add(panelClass2, BorderLayout.PAGE_END);
frame.setVisible(true);
} catch (Exception e) {
e.printStackTrace();
}
}
});
}
}
我希望這可以幫助您解決問題。
干杯
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.