2012-02-14 164 views
3

我是一个初学者,在GUI上开始一个简单的项目。 RectangleComponent应该通过单击按钮在窗体上绘制一个Rectangle。矩形不会使用以下代码进行绘制,但如果将相同的两行代码放在侦听器外部,它当然可以工作。我将不胜感激任何帮助。用按钮绘制矩形

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


public class EllipseRectViewer { 
/** 
* @param args 
*/ 
public static void main(String[] args) 
{ 
    final JFrame frame = new JFrame(); 

    final int FRAME_WIDTH = 400; 
    final int FRAME_HEIGHT = 400; 
    frame.setSize(FRAME_WIDTH, FRAME_HEIGHT); 
    frame.setTitle("Rectangle and Ellipse Draw"); 
    frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); 
    frame.setLayout(new BorderLayout()); 

    JPanel panel = new JPanel(); 
    frame.add(panel, BorderLayout.NORTH); 

    class RectangleDrawListener implements ActionListener 
    { 
    public void actionPerformed(ActionEvent event) 
    { 
     RectangleComponent r2 = new RectangleComponent(); 
     frame.add(r2); 
    }  
    } 
    JButton rectButton = new JButton("Rectangle"); 
    ActionListener rectDrawListener = new RectangleDrawListener(); 
    rectButton.addActionListener(rectDrawListener); 
    panel.add(rectButton); 

    frame.setVisible(true); 
    } 
} 

import java.awt.Rectangle; 
import java.awt.Graphics; 
import java.awt.Graphics2D; 
import javax.swing.JComponent; 

public class RectangleComponent extends JComponent 
{ 
    Rectangle rect; 

    public RectangleComponent() 
    { 
    rect = new Rectangle(20, 20, 30, 30); 
    } 

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

谢谢。

回答

3

我认为你需要重新验证()框架。

frame.revalidate();

把这样的:

public void actionPerformed(ActionEvent event) 
{ 
    RectangleComponent r2 = new RectangleComponent(); 
    frame.add(r2); 
    frame.revalidate(); 
}  
+0

不... JFrame是 - 不是JComponent - 但自从jdk7一个组件支持重新验证(谢谢@AndreasD的信息),所以删除了downvote – kleopatra 2012-02-14 08:22:21

1

尝试使用LineBorder。使用LineBorder创建一个JPanel并将JButton添加到JPanel。

4

添加RectangleComponent到帧之后,或者重新验证新添加的组分或该帧的根窗格:

public void actionPerformed(ActionEvent event) { 
    RectangleComponent r2 = new RectangleComponent(); 
    frame.add(r2); 
    // Option 1 
    r2.revalidate(); 
    // Option 2 
    frame.getRootPane().revalidate(); 
} 

注1:帧本身不能被重新验证(高达JDK 1.6)
注2:框架本身可以被重新验证(JDK 1.7+)

+0

请你可以简要地告诉我,至于为什么框架本身不能被重新验证?我试过frame.revalidate(),它也在工作。我不确定,但在JDK 7或以前的版本中有所不同。毫无疑问,以前我们用getRootPane()来做很多事情。 – 2012-02-14 07:33:10

+0

啊,看起来,我们可以使用JRE7重新验证'JFrame'! [这是新的](http://docs.oracle.com/javase/7/docs/api/java/awt/Component.html#revalidate%28%29)。对于以前的所有版本:使用rootPane或重新验证子组件。 – 2012-02-14 07:46:49

+0

我只是简单地在JDK 7上使用记事本,它的工作完美[Component.revalidate()](http://docs.oracle.com/javase/7/docs/api/java/awt/Component.html#重新验证())。 Thankyou的信息,我不好,我离开JDK以前的版本很快,我不应该这样做,JDK 7还没有进入凹槽似乎,所以只是清除我的头问题很多。 +1虽然为好的信息:-)问候 – 2012-02-14 07:49:39

1

RECT =新的Rectangle(20,20,30,30);

第二个问题是您的组件没有首选大小。您的组件以简单的框架显示,因为您将组件添加到BorderLayout的中心,因此组件的首选大小将被忽略。但是,如果您在使用其他布局管理器时尝试使用该组件,这将不起作用。

你也应该覆盖的getPreferredSize()方法,在你需要使用一个最低回报您的组件的首选尺寸:

return new Dimension(50, 50); 

以适应画矩形的大小和位置。