簡體   English   中英

如何從另一個子JPanel中的輸入觸發一個子JPanel中的動作(Java Swing)?

[英]How to trigger action in one child JPanel from input in another child JPanel (Java Swing)?

我正在嘗試在Java Swing中實現GUI(我是Swing的新手)。 我有一個包含2個面板的父面板。 左面板和右面板。 左側面板上有一個JComboBox下拉菜單。 右側面板是7張卡片的CardLayout。 我想根據左側面板中JComboBox中的選擇更改右側面板中顯示的卡。 所有3個面板都是單獨的類:LeftPanel.java,RightPanel.java和ParentPanel.java。 我很難找到一個放置動作監聽器的地方。 LeftPanel無法看到RightPanel的CardLayout,並且ParentPanel也無法訪問子級RightPanel的CardLayout。 我看到了一些有關訪問另一個JPanel的CardLayout的帖子,但是到目前為止,這些方法都沒有對我有用。 我的設計有缺陷嗎? 還是有可能實現這一目標?

編輯感謝到目前為止的建議。 以下是我的MCVE。 請注意,每個類都在其自己的(.java)文件中。 我這樣做不是為了方便維護而將所有內容都放在Frame類中。 我以前把所有內容都放在一個類中,並且運行良好,但是變成了一個長文件,包含2000多個代碼行和20多個面板。

//包含Main方法的MainFrame類:

包tempgui; 公共類MainFrame擴展了JFrame {

JFrame Frame1;

public static void main(String[] args){

    new MainFrame();
}

public MainFrame(){

    Frame1 = new JFrame();
    Frame1.setDefaultCloseOperation(EXIT_ON_CLOSE);

    Frame1.getContentPane().add(new ParentPanel(), BorderLayout.CENTER);        

    Frame1.setSize(800, 600);
    Frame1.setLocationRelativeTo(null);
    Frame1.pack();

    Frame1.setVisible(true);
}

}

// // ParentPanel類:公共類ParentPanel擴展了JPanel {

private JPanel ParentPanel;
private LeftPanel LP;
private RightPanel RP;

public ParentPanel(){

    ParentPanel = new JPanel();
    LP = new LeftPanel();
    RP = new RightPanel();

    ParentPanel.setLayout(new GridLayout(1,2));

    ParentPanel.add(LP);
    ParentPanel.add(RP);

    add(ParentPanel);
}

}

// // LeftPanel類:公共類LeftPanel擴展了JPanel {

private JPanel LeftPanel;
private JComboBox J1;

public LeftPanel(){

    LeftPanel = new JPanel();

    String[] Arr = {"RP1","RP2"};

    J1 = new JComboBox(Arr);

    LeftPanel.add(J1);

    add(LeftPanel);
}

}

// // RightPanel類:公共類RightPanel擴展了JPanel {

private JPanel RightPanel;
private RP1Panel RP1;
private RP2Panel RP2;
private CardLayout C1;

public RightPanel(){

    RightPanel = new JPanel();
    RP1 = new RP1Panel();
    RP2 = new RP2Panel();

    C1 = new CardLayout();

    RightPanel.setLayout(C1);

    RightPanel.add(RP1, "RP1");
    RightPanel.add(RP2, "RP2");
    C1.show(RightPanel, "RP1");

    add(RightPanel);
}

}

// // RP1Panel類:公共類RP1Panel擴展了JPanel {

private JPanel RP1;
private JLabel JRP1;

public RP1Panel(){

    RP1 = new JPanel();
    JRP1 = new JLabel("RP1 Panel");
    RP1.add(JRP1);
    add(RP1);
}

}

// // RP2Panel類:公共類RP2Panel擴展了JPanel {

private JPanel RP2;
private JLabel JRP2;

public RP2Panel(){

    RP2 = new JPanel();
    JRP2 = new JLabel("RP2 Panel");
    RP2.add(JRP2);
    add(RP2);
}

}

我將嘗試給我的類方法允許其他類從它們中提取“ 狀態 ”信息,例如組合框的狀態,並允許其他類對其進行突變,例如允許將偵聽器添加到組合框。 例如:

// Class LeftPanel:
class LeftPanel extends JPanel {
    private JPanel leftPanel;
    private JComboBox<String> comboBox; //!!

    // !!
    public LeftPanel(String[] comboTexts) {
        leftPanel = new JPanel();
        comboBox = new JComboBox<>(comboTexts); // !!
        leftPanel.add(comboBox);
        add(leftPanel);
    }

    // !!
    public String getComboSelection() {
        return comboBox.getSelectedItem().toString();
    }

    // !!
    public void comboAddActionListener(ActionListener listener) {
        comboBox.addActionListener(listener);
    }
}

然后其他類可以偵聽對組合框的更改,並在需要時提取選擇。 右面板同樣會具有允許更改其顯示的“卡片” JPanel的方法。 就像是:

// Class RightPanel:
class RightPanel extends JPanel {
    private JPanel rightPanel;
    private RP1Panel rightPanel1;
    private RP2Panel rightPanel2;
    private CardLayout cardLayout;

    public RightPanel() {
        rightPanel = new JPanel();
        rightPanel1 = new RP1Panel();
        rightPanel2 = new RP2Panel();
        cardLayout = new CardLayout();
        rightPanel.setLayout(cardLayout);
        rightPanel.add(rightPanel1, RP1Panel.NAME); //!!
        rightPanel.add(rightPanel2, RP2Panel.NAME);  // !!
        cardLayout.show(rightPanel, RP1Panel.NAME); // !!
        add(rightPanel);
    }

    // !! 
    public void showCard(String name) {
        cardLayout.show(rightPanel, name);
    }
}

它們可以在主要方面捆綁在一起:

// Class ParentPanel:
class ParentPanel extends JPanel {
    private JPanel ParentPanel;
    private LeftPanel leftPanel;
    private RightPanel rightPanel;

    public ParentPanel() {
        ParentPanel = new JPanel();
        leftPanel = new LeftPanel(new String[] {RP1Panel.NAME, RP2Panel.NAME});
        rightPanel = new RightPanel();
        ParentPanel.setLayout(new GridLayout(1, 2));
        ParentPanel.add(leftPanel);
        ParentPanel.add(rightPanel);
        add(ParentPanel);

        // !!
        leftPanel.comboAddActionListener(e -> {
            String selection = leftPanel.getComboSelection();
            rightPanel.showCard(selection);
        });
    }
}

整個MCVE可能看起來像:

import java.awt.BorderLayout;
import java.awt.CardLayout;
import java.awt.GridLayout;
import java.awt.event.ActionListener;

import javax.swing.*;

public class FooGui {
    public static void main(String[] args) {
        new MainFrame();
    }
}

class MainFrame extends JFrame {
    JFrame Frame1;

    public MainFrame() {
        Frame1 = new JFrame();
        Frame1.setDefaultCloseOperation(EXIT_ON_CLOSE);
        Frame1.getContentPane().add(new ParentPanel(), BorderLayout.CENTER);
        Frame1.setSize(800, 600);
        Frame1.setLocationRelativeTo(null);
        Frame1.pack();
        Frame1.setVisible(true);
    }
}

// Class ParentPanel:
class ParentPanel extends JPanel {
    private JPanel ParentPanel;
    private LeftPanel leftPanel;
    private RightPanel rightPanel;

    public ParentPanel() {
        ParentPanel = new JPanel();
        leftPanel = new LeftPanel(new String[] {RP1Panel.NAME, RP2Panel.NAME});
        rightPanel = new RightPanel();
        ParentPanel.setLayout(new GridLayout(1, 2));
        ParentPanel.add(leftPanel);
        ParentPanel.add(rightPanel);
        add(ParentPanel);

        // !!
        leftPanel.comboAddActionListener(e -> {
            String selection = leftPanel.getComboSelection();
            rightPanel.showCard(selection);
        });
    }
}

// Class LeftPanel:
class LeftPanel extends JPanel {
    private JPanel leftPanel;
    private JComboBox<String> comboBox; //!!

    // !!
    public LeftPanel(String[] comboTexts) {
        leftPanel = new JPanel();
        comboBox = new JComboBox<>(comboTexts); // !!
        leftPanel.add(comboBox);
        add(leftPanel);
    }

    // !!
    public String getComboSelection() {
        return comboBox.getSelectedItem().toString();
    }

    // !!
    public void comboAddActionListener(ActionListener listener) {
        comboBox.addActionListener(listener);
    }
}

// Class RightPanel:
class RightPanel extends JPanel {
    private JPanel rightPanel;
    private RP1Panel rightPanel1;
    private RP2Panel rightPanel2;
    private CardLayout cardLayout;

    public RightPanel() {
        rightPanel = new JPanel();
        rightPanel1 = new RP1Panel();
        rightPanel2 = new RP2Panel();
        cardLayout = new CardLayout();
        rightPanel.setLayout(cardLayout);
        rightPanel.add(rightPanel1, RP1Panel.NAME); //!!
        rightPanel.add(rightPanel2, RP2Panel.NAME);  // !!
        cardLayout.show(rightPanel, RP1Panel.NAME); // !!
        add(rightPanel);
    }

    // !! 
    public void showCard(String name) {
        cardLayout.show(rightPanel, name);
    }
}

// Class RP1Panel:
class RP1Panel extends JPanel {
    // !!
    public static final String NAME = "right panel 1";
    private JPanel RP1;
    private JLabel JRP1;

    public RP1Panel() {
        setName(NAME);
        RP1 = new JPanel();
        JRP1 = new JLabel("RP1 Panel");
        RP1.add(JRP1);
        add(RP1);
    }
}

// Class RP2Panel:
class RP2Panel extends JPanel {
    // !!
    public static final String NAME = "right panel 2";
    private JPanel RP2;
    private JLabel JRP2;

    public RP2Panel() {
        setName(NAME);
        RP2 = new JPanel();
        JRP2 = new JLabel("RP2 Panel");
        RP2.add(JRP2);
        add(RP2);
    }
}

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

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