【问题标题】:Drawing a rectangle with a button用按钮画一个矩形
【发布时间】:2012-02-14 05:28:21
【问题描述】:

我是一个初学者,在 GUI 上开始一个简单的项目。 RectangleComponent 应该通过单击按钮在表单上绘制一个 Rectangle。使用以下代码不会绘制矩形,但是如果我将相同的 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);
  } 
}

谢谢。

【问题讨论】:

    标签: java swing jcomponent paintcomponent


    【解决方案1】:

    将 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() 来做很多事情。
    • 啊,看起来,我们可以使用 JRE7 重新验证 JFrameThis is new。对于所有以前的版本:使用 rootPane 或重新验证子组件。
    • 我只是在使用带有 JDK 7 的记事本,它工作完美Component.revalidate()。谢谢你的信息,我的错我很快就离开了 JDK 以前的版本,我不应该那样做,JDK 7 似乎还没有进入最佳状态,所以只是用很多问题来清理我的脑袋。 +1 虽然提供了很好的信息:-) 问候
    【解决方案2】:

    我认为您需要 revalidate() 框架。

    frame.revalidate();

    这样说:

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

    【讨论】:

    • no ... JFrame 不是 JComponent - 但由于 jdk7 组件支持重新验证(感谢@AndreasD 提供的信息),因此删除了反对票
    【解决方案3】:

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

    【讨论】:

      【解决方案4】:

      rect = new Rectangle(20, 20, 30, 30);

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

      您还应该重写 getPreferredSize() 方法,以至少返回您需要使用的组件的首选大小:

      return new Dimension(50, 50);
      

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

      【讨论】:

        猜你喜欢
        • 2017-03-21
        • 2014-03-31
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多