2011-12-28 195 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