使用按钮绘制矩形

3

我是初学者,正在开始一个简单的GUI项目。点击按钮应该在窗体上绘制一个矩形。使用以下代码不会绘制矩形,但如果我将相同的2行代码放在监听器外面,它肯定可以工作。我将非常感激任何帮助。

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);
  } 
}

谢谢你使用我们的服务。
4个回答

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及以上版本中,框架本身可以重新验证。


请简要告诉我,为什么框架本身不能重新验证?我尝试了frame.revalidate(),它也可以工作。我不确定,但是这是JDK 7或之前版本的某些差异。毫无疑问,以前我们使用getRootPane()做很多事情。 - nIcE cOw
哎呀,看起来我们可以在JRE7中重新验证JFrame了!这是新的。对于所有之前的版本:使用rootPane或重新验证子组件。 - Andreas Dolk
我只是使用带有JDK 7的记事本,它运行得非常顺畅Component.revalidate()。感谢您提供的信息,我的错误是我很快就离开了之前的JDK版本,我不应该这样做,似乎JDK 7还没有进入状态,所以我有很多问题需要澄清。尽管如此,还是要给你一个赞,因为你提供了很好的信息 :-) 致意 - nIcE cOw

3

我认为您需要对框架进行重新验证(revalidate())。

frame.revalidate();

像这样放置:

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

JFrame不是JComponent,但自JDK7以来,组件支持重新验证(感谢@AndreasD提供信息),因此已删除此负评。 - kleopatra

1
矩形 = 新建矩形(20, 20, 30, 30); 另一个问题是你的组件没有首选大小。由于将组件添加到边框布局的中心,因此组件的首选大小被忽略,所以组件在简单框架中显示。然而,如果您尝试使用其他布局管理器时,这种方法将无效。 您还应该重写getPreferredSize()方法以返回组件的首选大小,最少需要使用:
return new Dimension(50, 50);

为了适应绘制矩形的大小和位置。


1
尝试使用LineBorder。创建一个带有LineBorder的JPanel,并将JButton添加到JPanel中。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接