Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/306.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 在多个JPanel中绘制_Java_Swing_Jframe_Jpanel_Paintcomponent - Fatal编程技术网

Java 在多个JPanel中绘制

Java 在多个JPanel中绘制,java,swing,jframe,jpanel,paintcomponent,Java,Swing,Jframe,Jpanel,Paintcomponent,我在一个主框架内有三个JPanel。从左边顺时针方向看,在第一个面板中,我计划使用一些控件来指示面板2上的图形。第三个底部面板将显示一些信息 我的理解是,我必须覆盖paintComponent,以便在第二个面板上实现所需的效果。现在我只想测试一下,我是否能在这个面板上画出简单的文本 但事实上,我很难在三个面板中画出任何东西 下面给出了代码,我不知道是什么问题 public class Demo extends JFrame{ private JSplitPane splitPan

我在一个主框架内有三个JPanel。从左边顺时针方向看,在第一个面板中,我计划使用一些控件来指示面板2上的图形。第三个底部面板将显示一些信息

我的理解是,我必须覆盖paintComponent,以便在第二个面板上实现所需的效果。现在我只想测试一下,我是否能在这个面板上画出简单的文本

但事实上,我很难在三个面板中画出任何东西

下面给出了代码,我不知道是什么问题

    public class Demo extends JFrame{
    private JSplitPane splitPaneV;
    private JSplitPane splitPaneH;
    private JPanel panel1;
    private JPanel panel2;
    private JPanel panel3;

    public Demo(String string) {
        // TODO Auto-generated constructor stub
        setTitle(string);
        setBackground( Color.gray );

        JPanel topPanel = new JPanel();
        topPanel.setLayout( new BorderLayout() );
        getContentPane().add( topPanel );

        // Create the panels
        new MyJPanel1();
        new MyJPanel2();
        new MyJPanel3();


        // Create a splitter pane
        splitPaneV = new JSplitPane( JSplitPane.VERTICAL_SPLIT );
        topPanel.add( splitPaneV, BorderLayout.CENTER );

        splitPaneH = new JSplitPane( JSplitPane.HORIZONTAL_SPLIT );
        splitPaneH.setLeftComponent( panel1 );
        splitPaneH.setRightComponent( panel2 );

        splitPaneV.setLeftComponent( splitPaneH );
        splitPaneV.setRightComponent( panel3 );
        /*setContentPane(new MyJPanel1());
        setContentPane(new MyJPanel2());
        setContentPane(new MyJPanel3());*/

    }

    private class MyJPanel1 extends JPanel{

        public MyJPanel1(){
            panel1 = new JPanel();
            panel1.setLayout( new BorderLayout() );
            panel1.setPreferredSize(new Dimension(200,500));
        }

        @Override 
        public void paintComponent(Graphics g) { 
            //super.paintComponent(g); 

            g.drawString("BLAH1", 20, 20); 
            g.drawRect(200, 200, 200, 200); 
            //setVisible(true);
        } 


    }

    private class MyJPanel2 extends JPanel{

        public MyJPanel2(){
            panel2 = new JPanel();
            panel2.setLayout( new FlowLayout() );
            panel2.setPreferredSize(new Dimension(1000,500));
        }

        @Override 
        public void paintComponent(Graphics g) {
            super.paintComponent(g); 

            g.drawString("BLAH2", 20, 20); 
            g.drawRect(200, 200, 200, 200); 
    } 


    }


    private class MyJPanel3 extends JPanel{

        public MyJPanel3(){
            panel3 = new JPanel();
            panel3.setLayout( new BorderLayout() );
            panel3.setPreferredSize( new Dimension( 400, 100 ) );
            panel3.setMinimumSize( new Dimension( 100, 50 ) );

        }

        @Override 
        public void paintComponent(Graphics g) { 
            //super.paintComponent(g); 

            g.drawString("BLAH3", 20, 20); 
            g.drawRect(200, 200, 200, 200); 
        } 


    }




    public static void main(String[] args) {
        //Schedule a job for the event-dispatching thread:
        //creating and showing this application's GUI.
        javax.swing.SwingUtilities.invokeLater(new Runnable() {
            public void run() {
                createAndShowGUI();
            }
        });
    }

    private static void createAndShowGUI() {
        //Create and set up the window.
        Demo frame = new Demo("Demo");
        frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        frame.setBounds(50, 50, 1200, 700);
        frame.pack();
        frame.setVisible(true);


    }
}

所有JPanel变量都引用普通的JPanel,而不是重写的类

请考虑改变这个:

private JPanel panel1;
private JPanel panel2;
private JPanel panel3;

public Demo(String string) {
    // ...

    JPanel topPanel = new JPanel();
    topPanel.setLayout( new BorderLayout() );
    getContentPane().add( topPanel );

    // Create the panels
    new MyJPanel1();
    new MyJPanel2();
    new MyJPanel3();


    // ...
}

private class MyJPanel1 extends JPanel{

    public MyJPanel1(){
        panel1 = new JPanel();
        panel1.setLayout( new BorderLayout() );
        panel1.setPreferredSize(new Dimension(200,500));
    }

    @Override 
    public void paintComponent(Graphics g) { 
        //super.paintComponent(g); 

        g.drawString("BLAH1", 20, 20); 
        g.drawRect(200, 200, 200, 200); 
        //setVisible(true);
    } 


}
//.... etc
为此:

private JPanel panel1;
private JPanel panel2;
private JPanel panel3;

public Demo(String string) {
    // ...

    JPanel topPanel = new JPanel();
    topPanel.setLayout( new BorderLayout() );
    getContentPane().add( topPanel );

    // Create the panels
    panel1 = new MyJPanel1();
    panel2 = new MyJPanel2();
    panel3 = new MyJPanel3();


    // ...
}

private class MyJPanel1 extends JPanel{

    public MyJPanel1(){
        // panel1 = new JPanel();
        setLayout( new BorderLayout() );
        setPreferredSize(new Dimension(200,500));
    }

    @Override 
    public void paintComponent(Graphics g) { 
        //super.paintComponent(g); 

        g.drawString("BLAH1", 20, 20); 
        g.drawRect(200, 200, 200, 200); 
        //setVisible(true);
    } 


}
//.... do the same with the other JPanel classes

尝试进行以下更改:

在类的构造函数中-
MyJPanel1
MyJPanel2
MyJPanel3

  • 删除这些类型的行
    panel3=new JPanel()
  • 并将这些类型的行
    panel3.set…
    替换为
    this.set…
并更改以下行:

new MyJPanel1();
new MyJPanel2();
new MyJPanel3();


对不起,还有一件事。你能告诉我一些如何将actionlistener附加到这个图形(比如矩形)上的想法吗?这样我就可以在下一个面板上提供更多关于它的信息。@Suyesh:你只能在按钮和菜单上使用actionlistener,但在这里你可以使用鼠标侦听器。例如,请看一下我的代码:对不起,还有一件事。你能给我一些关于如何将actionlistener附加到这个图形(比如矩形)的想法吗?这样,当我点击这个矩形时,我可以在下一个面板上提供更多关于它的信息。可能吗?
panel1 = new MyJPanel1();
panel2 = new MyJPanel2();
panel3 = new MyJPanel3();