Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/309.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 创建可以具有不同显示的零部件_Java_Swing - Fatal编程技术网

Java 创建可以具有不同显示的零部件

Java 创建可以具有不同显示的零部件,java,swing,Java,Swing,我正在尝试用java创建自己的图形组件。 我希望他能有不同类型的展示: 一个显示JPanel的显示器,中间包含一个JLabel(图1) 用GridLayout(3,3)表示JPanel的显示器。在这个JPanel中,将有9个JPanel。其中一些可能在中间包含JLabel(图2和图3) 所以我想知道如何继续:我应该扩展JComponent还是JPanel。。? 我还希望能够从一个显示转到另一个显示,即,在执行操作之后,能够通过简单的方法调用来修改组件的视图 我还没有一个代码,我只是在寻找一

我正在尝试用java创建自己的图形组件。 我希望他能有不同类型的展示:

  • 一个显示JPanel的显示器,中间包含一个JLabel(图1)
  • 用GridLayout(3,3)表示JPanel的显示器。在这个JPanel中,将有9个JPanel。其中一些可能在中间包含JLabel(图2和图3)
  • 所以我想知道如何继续:我应该扩展JComponent还是JPanel。。? 我还希望能够从一个显示转到另一个显示,即,在执行操作之后,能够通过简单的方法调用来修改组件的视图


    我还没有一个代码,我只是在寻找一个轨道开始这门课。提前谢谢你

    实现这一点的一种方法是创建自己的JPanel并使用它

    请参见下面的一个小示例:

    public class MyPanel extends JPanel{
    
        final static String PANEL1 = "p1";
        final static String PANEL2 = "p2";
    
        public MyPanel(){
            super();
            this.setLayout(new CardLayout());
            this.add(getFirstDisplay(),PANEL1); 
            this.add(getSecondDisplay(),PANEL2);
        }
    
        private JPanel getFirstDisplay() {
            JPanel p = new JPanel();
    
            p.add(new JLabel("9"));
    
            return p;
        }
    
        private JPanel getSecondDisplay() {
            JPanel p = new JPanel();
    
            p.setLayout(new GridLayout(3, 3));
    
            int counter = 1;
    
            for (int i = 0; i < 3; i++) {
                for (int j = 0; j < 3; j++) {
                    p.add(new JLabel(""+counter));
                    counter++;
                }
            }
    
            return p;
        }
    
        public void loadPanel(String name) {
    
            CardLayout cl = (CardLayout)(this.getLayout());
            cl.show(this, name);
    
        }
    
        public static void main(String[] args) {
    
            JFrame frame = new JFrame("Sample");
    
            frame.setSize(400, 400);
    
            MyPanel myPanel = new MyPanel();
    
            JButton b1 = new JButton("show 1");
            b1.addActionListener(new ActionListener() {
    
                @Override
                public void actionPerformed(ActionEvent e) {
                    myPanel.loadPanel(PANEL1);
                }
            });
    
            JButton b2 = new JButton("show 2");
            b2.addActionListener(new ActionListener() {
    
                @Override
                public void actionPerformed(ActionEvent e) {
                    myPanel.loadPanel(PANEL2);
                }
            });
    
            JPanel bot = new JPanel();
            bot.setLayout(new GridLayout(1,2));
            bot.add(b1);
            bot.add(b2);
    
            frame.setLayout(new BorderLayout());
            frame.add(myPanel, BorderLayout.CENTER);
            frame.add(bot, BorderLayout.SOUTH);
    
            frame.setVisible(true);
    
        }
    
    }
    
    公共类MyPanel扩展了JPanel{
    最终静态字符串PANEL1=“p1”;
    最终静态字符串PANEL2=“p2”;
    公共事务委员会(){
    超级();
    此.setLayout(新的CardLayout());
    add(getFirstDisplay(),PANEL1);
    add(getSecondDisplay(),PANEL2);
    }
    私有JPanel getFirstDisplay(){
    JPanel p=新的JPanel();
    p、 添加(新的JLabel(“9”));
    返回p;
    }
    私有JPanel getSecondDisplay(){
    JPanel p=新的JPanel();
    p、 setLayout(新的GridLayout(3,3));
    int计数器=1;
    对于(int i=0;i<3;i++){
    对于(int j=0;j<3;j++){
    p、 添加(新JLabel(“+计数器”);
    计数器++;
    }
    }
    返回p;
    }
    公共void加载面板(字符串名称){
    CardLayout cl=(CardLayout)(this.getLayout());
    cl.show(此,名称);
    }
    公共静态void main(字符串[]args){
    JFrame=新JFrame(“样本”);
    框架。设置尺寸(400400);
    MyPanel MyPanel=新建MyPanel();
    JButton b1=新JButton(“显示1”);
    b1.addActionListener(新ActionListener(){
    @凌驾
    已执行的公共无效操作(操作事件e){
    myPanel.loadPanel(面板1);
    }
    });
    JButton b2=新JButton(“显示2”);
    b2.addActionListener(新ActionListener(){
    @凌驾
    已执行的公共无效操作(操作事件e){
    myPanel.loadPanel(面板2);
    }
    });
    JPanel bot=新的JPanel();
    bot.setLayout(新网格布局(1,2));
    添加(b1);
    bot.add(b2);
    frame.setLayout(新的BorderLayout());
    frame.add(myPanel,BorderLayout.CENTER);
    框架。添加(机器人,边界布局。南部);
    frame.setVisible(true);
    }
    }
    
    它创建了一个:

    “所以我想知道如何继续:我应该扩展JComponent还是JPanel?”-这在很大程度上取决于您希望如何管理代码。例如,您可以通过工厂方法简单地创建面板,工厂方法只是实例化
    JPanel
    并设置组件。如果标签/组件需要其他功能(如监视鼠标),那么定制组件可能是合适的,因为它封装了功能并使其更易于重用。你也应该考虑是否有“共同”的功能,它们都是共享的,“我也希望能够从一个显示器到另一个显示器,也就是说,执行一个动作”——然后我建议看一下<代码>卡布局>代码>,这样你就可以轻松地在不同的视图之间切换。