如何从单独的面板更改 CardLayout 面板?
How to change CardLayout panels from a separate panel?
我的软件布局有点基于向导。所以基本面板分为两个JPanel
。一个永远不会改变的左面板。和一个与 CardLayout
一起使用的右侧面板。它有许多子面板,并通过一种方法显示每个子面板。
我可以轻松地从一个内部面板转到另一个内部面板。但我想在左侧面板中有一个按钮并在右侧更改面板。
这是一个示例代码,您可以 运行 它:
基地:
public class Base {
JFrame frame = new JFrame("Panel");
BorderLayout bl = new BorderLayout();
public Base(){
frame.setLayout(bl);
frame.setSize(800, 600);
frame.add(new LeftBar(), BorderLayout.WEST);
frame.add(new MainPanel(), BorderLayout.CENTER);
frame.setLocationRelativeTo(null);
frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
frame.setVisible(true);
}
/**
* @param args the command line arguments
*/
public static void main(String[] args) throws IOException {
// TODO code application logic here
new Base();
}
}
左侧
public class LeftBar extends JPanel{
JButton button;
MainPanel mainPanel = new MainPanel();
public LeftBar(){
setPreferredSize(new Dimension(200, 40));
setLayout(new BorderLayout());
setBackground(Color.black);
button = new JButton("Show Second Page");
button.addActionListener(new ActionListener(){
@Override
public void actionPerformed(ActionEvent ae) {
mainPanel.showPanel("secondPage");
}
});
add(button, BorderLayout.NORTH);
}
}
右侧
public class MainPanel extends JPanel {
private CardLayout cl = new CardLayout();
private JPanel panelHolder = new JPanel(cl);
public MainPanel(){
FirstPage firstPage = new FirstPage(this);
SecondPage secondPage = new SecondPage(this);
setLayout(new GridLayout(0,1));
panelHolder.add(firstPage, "firstPage");
panelHolder.add(secondPage, "secondPage");
cl.show(panelHolder, "firstPage");
add(panelHolder);
}
public void showPanel(String panelIdentifier){
cl.show(panelHolder, panelIdentifier);
}
}
右侧的内面板:
public class FirstPage extends JPanel {
MainPanel mainPanel;
JButton button;
public FirstPage(MainPanel mainPanel) {
this.mainPanel = mainPanel;
setBackground(Color.GRAY);
button = new JButton("Show page");
button.addActionListener(new ActionListener(){
@Override
public void actionPerformed(ActionEvent ae) {
mainPanel.showPanel("secondPage");
}
});
add(button);
}
}
public class SecondPage extends JPanel{
MainPanel mainPanel;
JButton button;
public SecondPage(MainPanel mainPanel){
this.mainPanel = mainPanel;
setBackground(Color.white);
add(new JLabel("This is second page"));
}
}
这张图片可以让你明白:
正如我所解释的,我可以使用以下方法将 "from first" 页面移动到 "second page":mainPanel.showPanel("secondPage");
或 mainPanel.showPanel("firstPage");
.
但我在左侧栏中也有一个 JButton
,我调用相同的方法来显示 CardLayout 的第二个面板。但它不起作用。虽然它没有给出任何错误。
知道如何从面板外部更改这些 CardLayout
面板吗?
问题是 LeftBar
有 mainPanel
成员初始化为 MainPanel
的新实例。所以你有两个 MainPanel
实例,一个在 Base
中分配并添加到框架中,另一个在 LeftBar
中分配。
所以 LeftBar
在 MainPanel
的第二个实例上执行 mainPanel.showPanel("secondPage");
,它甚至不是视觉层次结构的一部分。要解决此问题,只需将 MainPanel
的现有实例传递给 LeftBar
的构造函数即可。您已在 FirstPage
和 SecondPage
中执行此操作。
我的软件布局有点基于向导。所以基本面板分为两个JPanel
。一个永远不会改变的左面板。和一个与 CardLayout
一起使用的右侧面板。它有许多子面板,并通过一种方法显示每个子面板。
我可以轻松地从一个内部面板转到另一个内部面板。但我想在左侧面板中有一个按钮并在右侧更改面板。
这是一个示例代码,您可以 运行 它:
基地:
public class Base {
JFrame frame = new JFrame("Panel");
BorderLayout bl = new BorderLayout();
public Base(){
frame.setLayout(bl);
frame.setSize(800, 600);
frame.add(new LeftBar(), BorderLayout.WEST);
frame.add(new MainPanel(), BorderLayout.CENTER);
frame.setLocationRelativeTo(null);
frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
frame.setVisible(true);
}
/**
* @param args the command line arguments
*/
public static void main(String[] args) throws IOException {
// TODO code application logic here
new Base();
}
}
左侧
public class LeftBar extends JPanel{
JButton button;
MainPanel mainPanel = new MainPanel();
public LeftBar(){
setPreferredSize(new Dimension(200, 40));
setLayout(new BorderLayout());
setBackground(Color.black);
button = new JButton("Show Second Page");
button.addActionListener(new ActionListener(){
@Override
public void actionPerformed(ActionEvent ae) {
mainPanel.showPanel("secondPage");
}
});
add(button, BorderLayout.NORTH);
}
}
右侧
public class MainPanel extends JPanel {
private CardLayout cl = new CardLayout();
private JPanel panelHolder = new JPanel(cl);
public MainPanel(){
FirstPage firstPage = new FirstPage(this);
SecondPage secondPage = new SecondPage(this);
setLayout(new GridLayout(0,1));
panelHolder.add(firstPage, "firstPage");
panelHolder.add(secondPage, "secondPage");
cl.show(panelHolder, "firstPage");
add(panelHolder);
}
public void showPanel(String panelIdentifier){
cl.show(panelHolder, panelIdentifier);
}
}
右侧的内面板:
public class FirstPage extends JPanel {
MainPanel mainPanel;
JButton button;
public FirstPage(MainPanel mainPanel) {
this.mainPanel = mainPanel;
setBackground(Color.GRAY);
button = new JButton("Show page");
button.addActionListener(new ActionListener(){
@Override
public void actionPerformed(ActionEvent ae) {
mainPanel.showPanel("secondPage");
}
});
add(button);
}
}
public class SecondPage extends JPanel{
MainPanel mainPanel;
JButton button;
public SecondPage(MainPanel mainPanel){
this.mainPanel = mainPanel;
setBackground(Color.white);
add(new JLabel("This is second page"));
}
}
这张图片可以让你明白:
正如我所解释的,我可以使用以下方法将 "from first" 页面移动到 "second page":mainPanel.showPanel("secondPage");
或 mainPanel.showPanel("firstPage");
.
但我在左侧栏中也有一个 JButton
,我调用相同的方法来显示 CardLayout 的第二个面板。但它不起作用。虽然它没有给出任何错误。
知道如何从面板外部更改这些 CardLayout
面板吗?
问题是 LeftBar
有 mainPanel
成员初始化为 MainPanel
的新实例。所以你有两个 MainPanel
实例,一个在 Base
中分配并添加到框架中,另一个在 LeftBar
中分配。
所以 LeftBar
在 MainPanel
的第二个实例上执行 mainPanel.showPanel("secondPage");
,它甚至不是视觉层次结构的一部分。要解决此问题,只需将 MainPanel
的现有实例传递给 LeftBar
的构造函数即可。您已在 FirstPage
和 SecondPage
中执行此操作。