2011-12-28 197 views
2

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

我的理解是,我必须重写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); 


    } 
} 

回答

2

所有的JPanel变量都指向普通的vanilla 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 
+0

是,现在似乎确定。 – SASM

+0

@Suyesh:很高兴你有它的工作! –

+0

对不起,还有一件事。你能否给我一些关于如何将actionlistener附加到这些绘图(比如矩形)的想法,以便我可以在下一个面板上提供更多关于它的信息。 – SASM

2

请尝试以下变化:

在构造函数的类 - MyJPanel1MyJPanel2MyJPanel3

  • 删除这些类型的线panel3 = new JPanel();
  • 并用this.set...替换这些类型的线panel3.set...

,并更改以下行:

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

panel1 = new MyJPanel1(); 
panel2 = new MyJPanel2(); 
panel3 = new MyJPanel3(); 
+0

谢谢,这有所帮助。 – SASM

+0

没问题。 YW。 –

+0

对不起,还有一件事。你能给我一些关于如何将actionlistener附加到这些图形上的想法(比如矩形),这样我可以在下一个面板上提供更多关于它的信息,当我点击那个矩形时。可能吗? – SASM