簡體   English   中英

在Java Swing中,當另一個JPanel中的ComboBox更改時,將觸發JPanel中的更新

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM