Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/389.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
如何从另一个子JPanel(JavaSwing)中的输入触发一个子JPanel中的操作?_Java_Swing_Jpanel_Actionlistener_Cardlayout - Fatal编程技术网

如何从另一个子JPanel(JavaSwing)中的输入触发一个子JPanel中的操作?

如何从另一个子JPanel(JavaSwing)中的输入触发一个子JPanel中的操作?,java,swing,jpanel,actionlistener,cardlayout,Java,Swing,Jpanel,Actionlistener,Cardlayout,我正在尝试用JavaSwing实现GUI(我是Swing新手)。我有一个包含两个面板的父面板。一个左面板和一个右面板。左侧面板有一个JComboBox下拉菜单。右侧面板是一个包含7张卡的卡片布局。我想根据左面板JComboBox中的选项更改右面板中显示的卡。所有3个面板都是独立的类:LeftPanel.java、RightPanel.java和ParentPanel.java。我很难找到一个地方为这个动作安排听众。LeftPanel无法查看RightPanel的CardLayout,Parent

我正在尝试用JavaSwing实现GUI(我是Swing新手)。我有一个包含两个面板的父面板。一个左面板和一个右面板。左侧面板有一个JComboBox下拉菜单。右侧面板是一个包含7张卡的卡片布局。我想根据左面板JComboBox中的选项更改右面板中显示的卡。所有3个面板都是独立的类:LeftPanel.java、RightPanel.java和ParentPanel.java。我很难找到一个地方为这个动作安排听众。LeftPanel无法查看RightPanel的CardLayout,ParentPanel也无法访问子RightPanel的CardLayout。我看到一些关于访问另一个JPanel的CardLayout的帖子,但到目前为止,这些方法都不适合我。我的设计有缺陷吗?还是有可能做到这一点

编辑 谢谢你到目前为止的建议。下面是我的MCVE。请注意,每个类都在自己的(.java)文件中。我这样做,而不是把所有的东西都放在Frame类中,只是为了便于维护。以前我把所有东西都放在一个类中,它工作得很好,但是它变成了一个包含2000多行代码和20多个面板的长文件

//类包含主方法的大型机:

包tempgui; 公共类大型机扩展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扩展了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);
}
private JPanel LeftPanel;
private JComboBox J1;

public LeftPanel(){

    LeftPanel = new JPanel();

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

    J1 = new JComboBox(Arr);

    LeftPanel.add(J1);

    add(LeftPanel);
}
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);
}
private JPanel RP1;
private JLabel JRP1;

public RP1Panel(){

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

public RP2Panel(){

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

//类左面板: 公共类LeftPanel扩展了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);
}
private JPanel LeftPanel;
private JComboBox J1;

public LeftPanel(){

    LeftPanel = new JPanel();

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

    J1 = new JComboBox(Arr);

    LeftPanel.add(J1);

    add(LeftPanel);
}
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);
}
private JPanel RP1;
private JLabel JRP1;

public RP1Panel(){

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

public RP2Panel(){

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

//类右面板: 公共类RightPanel扩展了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);
}
private JPanel LeftPanel;
private JComboBox J1;

public LeftPanel(){

    LeftPanel = new JPanel();

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

    J1 = new JComboBox(Arr);

    LeftPanel.add(J1);

    add(LeftPanel);
}
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);
}
private JPanel RP1;
private JLabel JRP1;

public RP1Panel(){

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

public RP2Panel(){

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

//RP1类面板: 公共类RP1Panel扩展了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);
}
private JPanel LeftPanel;
private JComboBox J1;

public LeftPanel(){

    LeftPanel = new JPanel();

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

    J1 = new JComboBox(Arr);

    LeftPanel.add(J1);

    add(LeftPanel);
}
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);
}
private JPanel RP1;
private JLabel JRP1;

public RP1Panel(){

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

public RP2Panel(){

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

//RP2Panel类: 公共类RP2Panel扩展了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);
}
private JPanel LeftPanel;
private JComboBox J1;

public LeftPanel(){

    LeftPanel = new JPanel();

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

    J1 = new JComboBox(Arr);

    LeftPanel.add(J1);

    add(LeftPanel);
}
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);
}
private JPanel RP1;
private JLabel JRP1;

public RP1Panel(){

    RP1 = new JPanel();
    JRP1 = new JLabel("RP1 Panel");
    RP1.add(JRP1);
    add(RP1);
}
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);
    }
}
它们主要可以绑在一起:

// 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);
    }
}
导入java.awt.BorderLayout;
导入java.awt.CardLayout;
导入java.awt.GridLayout;
导入java.awt.event.ActionListener;
导入javax.swing.*;
公共类FooGui{
公共静态void main(字符串[]args){
新主机();
}
}
类大型机扩展JFrame{
jframe1;
公共主机(){
Frame1=新的JFrame();
Frame1.setDefaultCloseOperation(关闭时退出);
Frame1.getContentPane().add(新建父面板(),BorderLayout.CENTER);
框架1.设置尺寸(800600);
Frame1.setLocationRelativeTo(空);
Frame1.pack();
Frame1.setVisible(true);
}
}
//类父面板:
类ParentPanel扩展了JPanel{
私人JPanel家长小组;
私人左面板左面板;
私人右面板右面板;
公共家长小组(){
ParentPanel=newjpanel();
leftPanel=新的leftPanel(新字符串[]{RP1Panel.NAME,RP2Panel.NAME});
rightPanel=新的rightPanel();
setLayout(新的GridLayout(1,2));
ParentPanel.add(leftPanel);
ParentPanel.add(右面板);
添加(父面板);
// !!
leftPanel.comboAddActionListener(e->{
字符串选择=leftPanel.getComboSelection();
右面板。显示卡(选择);
});
}
}
//类左面板:
类LeftPanel扩展了JPanel{
私人JPanel leftPanel;
专用JComboBox组合框;//!!
// !!
公共左面板(字符串[]组合文本){
leftPanel=newjpanel();
comboBox=新的JComboBox(ComboText);/!!
添加(组合框);
添加(左面板);
}
// !!
公共字符串getComboSelection(){
返回comboBox.getSelectedItem().toString();
}
// !!
public void comboAddActionListener(ActionListener listener){
comboBox.addActionListener(listener);
}
}
//类右面板:
类RightPanel扩展了JPanel{
私人JPanel rightPanel;
私人RP1面板右面板1;
私人RP2面板右面板2;
私人卡布局卡布局;
公共权利小组(){
rightPanel=newjpanel();
rightPanel1=新的RP1Panel();
rightPanel2=新的RP2Panel();
cardLayout=新的cardLayout();
右面板。设置布局(卡片布局);
rightPanel.add(rightPanel1,RP1Panel.NAME);/!!
rightPanel.add(rightPanel2,RP2Panel.NAME);/!!
cardLayout.show(右面板,RP1Panel.NAME);/!!
添加(右面板);
}
// !! 
公共作废展示卡(字符串名称){
cardLayout.show(右面板,名称);
}
}
//RP1类面板:
类RP1Panel扩展了JPanel{
// !!
公共静态最终字符串NAME=“右面板1”;
私人JPanel RP1;
私人JLabel JRP1;
公共RP1Panel(){
集合名(名称);
RP1=新的JPanel();
JRP1=新的JLabel(“RP1面板”);
RP1.add(JRP1);
添加(RP1);
}
}
//RP2Panel类:
类RP2Panel扩展了JPanel{
// !!
公共静态最终字符串NAME=“右面板2”;
私人JPanel RP2;
私人JLabel JRP2;
公共RP2Panel(){
集合名(名称);
RP2=新的JPanel();
JRP2=新的JLabel(“RP2面板”);
RP2.add(JRP2);
添加(RP2);
}
}
“或者有可能实现这一点吗?”
——是的,非常肯定<代码>“我的设计有缺陷吗?”——如果没有相关的代码,最好是有效的,就不可能说出问题所在。再次,考虑创建和发布一个MVE,一个小程序,足够小,可以作为代码格式化的文本发布在您的问题中,编译并运行,这说明了您的问题。这不是你的整个程序,它没有所有的功能,但它运行f