且构网

分享程序员开发的那些事...
且构网 - 分享程序员编程开发的那些事

这个JPanel代码好吗?单击按钮时不显示其他JPanel

更新时间:2023-02-05 22:24:08


这个JPanel代码好吗?

Is this JPanel code good?

不是真的(对不起),你应该使用 CardLayout 要使其正常工作,请参阅如何使用CardLayout

Not really (sorry), you should be using a CardLayout to get this to work, see How to Use CardLayout

您还通过重新声明变量来隐藏变量(面板并且 panel_1 )在你的构造函数中。

You're also shadowing your variables by redeclaring your variables (panel and panel_1) inside your constructor.

你还应该避免使用 null 布局,像素完美布局是现代ui设计中的一种幻觉。影响组件个体大小的因素太多,您无法控制。 Swing旨在与布局管理人员合作,放弃这些将导致问题和问题的结束,您将花费越来越多的时间来纠正

You should also avoid using null layouts, pixel perfect layouts are an illusion within modern ui design. There are too many factors which affect the individual size of components, none of which you can control. Swing was designed to work with layout managers at the core, discarding these will lead to no end of issues and problems that you will spend more and more time trying to rectify

你也永远不要将 panel_1 添加到 contentPane ,以便调用 setVisible on它(假设变量阴影是固定的)将不会做任何事情

You also never add panel_1 to the contentPane so calling setVisible on it (assuming the variable shadowing is fixed) won't do anything

通常不鼓励直接从 JFrame扩展或其他***容器,你没有在类中添加任何新功能并将自己锁定在一个用例中

It's also generally discouraged to extend directly from JFrame or other top level containers, you're not adding any new functionality to the class and are locking yourself into a single use case

所以你可能会做一些事情更像是......

So you might, instead, do something more like...

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 Govinda());
                frame.pack();
                frame.setLocationRelativeTo(null);
                frame.setVisible(true);
            }
        });
    }

    public class Govinda extends JPanel {

        /**
         *
         */
        private static final long serialVersionUID = 1L;
        private JPanel panel;
        private JPanel panel_1;

        /**
         * Create the frame.
         */
        public Govinda() {
            setBorder(new EmptyBorder(5, 5, 5, 5));
            setLayout(new CardLayout(0, 0));

            JPanel panel = new JPanel();
            add(panel, "name_273212774632866");

            JButton btnNewButton = new JButton("New button");
            btnNewButton.addActionListener(new ActionListener() {
                public void actionPerformed(ActionEvent e) {
                    ((CardLayout) getLayout()).show(Govinda.this, "name_273214471684839");
                }
            });
            panel.add(btnNewButton);

            JPanel panel_1 = new JPanel();
            add(panel_1, "name_273214471684839");

            JLabel lblHaiiiiiiiii = new JLabel("HAIIIIIIIII");
            panel_1.add(lblHaiiiiiiiii);
        }
    }
}

您可能还考虑使用更多模型 - 视图 - 控制器方法导航,因此用于确定下一个视图的逻辑将由控制器根据模型的要求进行,例如,查看听众放置坚持传统(非中介)MVC模式

You might also consider using more a Model-View-Controller approach to the navigation, so the logic that is used to determine which view is next would be made by a controller, based on the requirements of a model, for example, have a look at Listener Placement Adhering to the Traditional (non-mediator) MVC Pattern