【问题标题】:Loading a panel from a different class从不同的类加载面板
【发布时间】:2015-02-09 11:26:20
【问题描述】:

我有两节课。主类有一个 JFrame 并持有一个按钮,单击该按钮后,它会从不同的类加载一个面板并将其定位在框架的按钮中。

我可以做到,但我必须重新调整框架大小,然后附加面板才会出现,否则它会被隐藏。

这是我的代码:

public class PanelLoader {

    public static void main(String[] args) {
        // TODO code application logic here
        JFrame frame = new JFrame("Layout");
        frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        frame.setSize(400, 300);
        JPanel mainPanel = new JPanel(new BorderLayout());

        JButton press = new JButton("press");
        press.addActionListener(new ActionListener(){ //ActionListener, on click it opens a file choser, 
           @Override                                      //selects a directory then gives it to srcDirField
           public void actionPerformed(java.awt.event.ActionEvent event){
                JPanel mine = ClassWhereStored.newJPanel();
                mainPanel.add(mine, BorderLayout.SOUTH);
           }
        });

        mainPanel.add(press, BorderLayout.NORTH);
        frame.add(mainPanel);

        frame.setVisible(true);
    }
}

二等:

public class ClassWhereStored {
    public static JPanel newJPanel(){
        JPanel panel = new JPanel();
        panel.setBackground(Color.yellow);
        JLabel test= new JLabel("Some Text");
        panel.add(test);
        return panel;
    }
}

那么这个只有在我重新调整框架大小时才显示附加面板的框架有什么问题?

【问题讨论】:

    标签: java swing jframe jpanel


    【解决方案1】:

    使用CardLayout,添加空白/空JPanel 和您要显示的JPanel。单击按钮时,只需让CardLayout 切换面板即可。

    详情请见How to Use CardLayout

    例如...

    package javaapplication765;
    
    import java.awt.BorderLayout;
    import java.awt.CardLayout;
    import java.awt.EventQueue;
    import java.awt.event.ActionEvent;
    import java.awt.event.ActionListener;
    import javax.swing.JButton;
    import javax.swing.JFrame;
    import javax.swing.JLabel;
    import javax.swing.JPanel;
    import javax.swing.UIManager;
    import javax.swing.UnsupportedLookAndFeelException;
    import javax.swing.border.EmptyBorder;
    
    public class Test {
    
        public static void main(String[] args) {
            new Test();
        }
    
        public Test() {
            EventQueue.invokeLater(new Runnable() {
                @Override
                public void run() {
                    try {
                        UIManager.setLookAndFeel(UIManager.getSystemLookAndFeelClassName());
                    } catch (ClassNotFoundException | InstantiationException | IllegalAccessException | UnsupportedLookAndFeelException ex) {
                        ex.printStackTrace();
                    }
    
                    JFrame frame = new JFrame("Testing");
                    frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
                    frame.add(new BasePane());
                    frame.pack();
                    frame.setLocationRelativeTo(null);
                    frame.setVisible(true);
                }
            });
        }
    
        public class BasePane extends JPanel {
    
            public BasePane() {
                setLayout(new BorderLayout());
                CardLayout cl = new CardLayout();
                JPanel mainView = new JPanel(cl);
                mainView.add(new JPanel(), "empty");
                mainView.add(new BananaPane(), "banana");
                add(mainView);
    
                JButton btn = new JButton("Fruit loop");
                btn.addActionListener(new ActionListener() {
                    @Override
                    public void actionPerformed(ActionEvent e) {
                        cl.show(mainView, "banana");
                    }
                });
                add(btn, BorderLayout.NORTH);
            }
    
        }
    
        public class BananaPane extends JPanel {
    
            public BananaPane() {
                setLayout(new BorderLayout());
                setBorder(new EmptyBorder(25, 25, 25, 25));
                add(new JLabel("I'm a banana"));
            }
    
        }
    
    }
    

    【讨论】:

      【解决方案2】:
      1. 尽可能避免使用静态方法,因为这可能会增加耦合并降低内聚。
      2. 至于您的问题,您最好使用 CardLayout 并将新的 JPanel 添加到使用 CardLayout 的容器中,该 JPanel 位于 SOUTH 中,但被隐藏,例如被同样添加到同一 CardLayout 的 JLabel 覆盖- 使用容器并且正在显示。这样,只要在创建 gui 时添加“卡片”组件,容器(使用 CardLayout 的南部 JPanel)的大小就可以容纳它包含的所有“卡片”。

      【讨论】:

        猜你喜欢
        • 2011-11-21
        • 1970-01-01
        • 2011-10-31
        • 2012-07-25
        • 1970-01-01
        • 2020-09-19
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多