【发布时间】:2017-07-24 14:59:54
【问题描述】:
我正在尝试在 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 扩展 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 扩展 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);
}
}
【问题讨论】:
-
"Or is it possible to achieve this?"-- 是的,非常肯定。"Is there a flaw in my design?"-- 没有相关代码,最好是有效的minimal reproducible example,无法说出您的问题出在哪里。同样,考虑创建和发布一个 MCVE,一个小程序,小到可以作为代码格式的文本发布在您的问题中,一个可以编译和运行的程序,它可以向我们展示您的问题。它不是你的整个程序,它没有它的所有功能,但它再次为我们运行,它向我们展示了问题。 -
“所有 3 个面板都是单独的类” 解决这个难题的第一步可能是“不要不必要地扩展组件类”。您能在这里解释一下扩展面板的情况吗?
标签: java swing jpanel actionlistener cardlayout