2013-03-03 40 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