如何从另一个子JPanel(JavaSwing)中的输入触发一个子JPanel中的操作?
我正在尝试用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{如何从另一个子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
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