2013-03-03 22 views
2

我希望在按下按鈕時繪製一個矩形,但它似乎不起作用。 這裏是我的代碼:WindowsBuilder:按下按鈕時如何繪製組件?

package draw.rect; 

import java.awt.BorderLayout; 
import java.awt.EventQueue; 

import javax.swing.JFrame; 
import javax.swing.JPanel; 
import javax.swing.border.EmptyBorder; 
import javax.swing.JButton; 
import java.awt.event.ActionListener; 
import java.awt.event.ActionEvent; 

public class DR extends JFrame { 

    private JPanel contentPane; 

    /** 
    * Launch the application. 
    */ 
    public static void main(String[] args) { 
     EventQueue.invokeLater(new Runnable() { 
      public void run() { 
       try { 
        DR frame = new DR(); 
        frame.setVisible(true); 
       } catch (Exception e) { 
        e.printStackTrace(); 
       } 
      } 
     }); 
    } 

    /** 
    * Create the frame. 
    */ 
    public DR() { 
     setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); 
     setBounds(100, 100, 458, 312); 
     contentPane = new JPanel(); 
     contentPane.setBorder(new EmptyBorder(5, 5, 5, 5)); 
     setContentPane(contentPane); 
     contentPane.setLayout(null); 

     JButton btnDrawRrect = new JButton("Draw Rrect"); 
     btnDrawRrect.addActionListener(new ActionListener() { 
      public void actionPerformed(ActionEvent arg0) { 
       System.out.print("hello"); 
       RectangleComponent r2 = new RectangleComponent(); 
       contentPane.add(r2); 
       r2.revalidate(); 
       contentPane.revalidate(); 
      } 
     }); 
     btnDrawRrect.setBounds(10, 11, 89, 23); 
     contentPane.add(btnDrawRrect);  
    } 
} 

package draw.rect; 

import java.awt.Graphics; 
import java.awt.Graphics2D; 
import java.awt.Rectangle; 

import javax.swing.JComponent; 

public class RectangleComponent extends JComponent { 

     Rectangle rect; 

     public RectangleComponent() 
     { 
     rect = new Rectangle(50, 50, 120, 130); 
     } 

     public void paintComponent(Graphics g) 
     { 
     Graphics2D g2 = (Graphics2D) g; 
     g2.draw(rect); 
     } 
} 

的問題是,當動作事件監聽器被調用時,JComponent的正確構建,但它沒有添加到幀。 在此先感謝

回答

5

您正在使用空佈局,並且當您這樣做時,您完全負責設置使用容器添加到空佈局的所有組件的大小和位置。你忽略了這個責任,並沒有給你添加的JComponent一個大小或位置,所以當它被添加到容器時,它的大小爲0就不能被看到。爲了向你自己證明這一點,添加一個System.out。 println()打印出添加的組件是否可見以及它的界限是什麼,你將親自看到它。第二個問題是添加組件後,您不打電話給repaint(),但這並非總是必要的,也不是導致當前問題的原因。快速解決方法是設置新添加的組件的邊界,但我不建議您這樣做。相反,我建議:

  • 我強烈建議你不要使用空佈局,因爲他們使你的代碼不靈活,非常難以維護和升級。
  • 在教程中閱讀並使用佈局管理器。
  • 從容器中取出或添加組件後,請在容器上調用revalidate(),然後調用repaint()
+0

我實際上使用WindowsBuilder Pro來構建我的JFrame,所以這就是爲什麼佈局設置爲空。這是爲什麼矩形沒有繪製的問題嗎? – 2013-03-03 07:29:53

+0

@ user2109278:再次,該矩形未顯示,因爲保存它的組件的大小爲0,0。請注意,WindowsBuilderPro不會強制您使用空佈局,您仍然可以使用此工具使用所有佈局管理器,但我建議您在理解Swing之前不要使用代碼生成庫。 – 2013-03-03 07:32:06

相關問題