Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/image-processing/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 用按钮绘制矩形_Java_Swing_Jcomponent_Paintcomponent - Fatal编程技术网

Java 用按钮绘制矩形

Java 用按钮绘制矩形,java,swing,jcomponent,paintcomponent,Java,Swing,Jcomponent,Paintcomponent,我是一个初学者,在GUI上开始一个简单的项目。矩形组件应该通过单击按钮在窗体上绘制一个矩形。矩形不会使用以下代码绘制,但如果我将相同的2行代码放在侦听器外部,它肯定会工作。我将感谢任何帮助 import java.awt.event.ActionEvent; import java.awt.event.ActionListener; import java.awt.BorderLayout; import javax.swing.JButton; import javax.swing.JFram

我是一个初学者,在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);
  } 
}

谢谢。

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

frame.revalidate()

这样说:

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

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

将矩形组件添加到框架后,重新验证新添加的组件或框架的根窗格:

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+)

rect=新矩形(20,20,30,30)

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

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

return new Dimension(50, 50);

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

请简要告诉我,为什么框架本身无法重新验证?我试过frame.revalidate(),它也能正常工作。我不确定,但它是否与JDK 7或以前的版本有所不同。毫无疑问,以前我们用getRootPane()做很多事情。啊,看起来,我们可以用JRE7重新验证
JFrame
。对于所有以前的版本:使用rootPane或重新验证子组件。我只是在JDK 7中使用一个记事本,它工作得完美无缺。谢谢你提供的信息,我的坏消息是我很快就离开了JDK上一个版本,我不应该这么做,JDK 7似乎还没有进入最佳状态,所以我有很多问题要问+1但是对于好的信息:-)关于。。。JFrame不是JComponent,但由于jdk7是一个支持重新验证的组件(感谢@AndreasD提供的信息),所以删除了否决票