[英]how to trigger an action in parent JPanel when a component in a child JPanel is updated (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.