Java 矩形不显示

Java 矩形不显示,java,swing,paintcomponent,Java,Swing,Paintcomponent,按下按钮时什么也没发生,我做错了什么??我想在按下按钮时绘制矩形。代码有什么问题 import java.awt.*; import java.awt.event.*; import javax.swing.*; import java.awt.geom.*; class rectangle{ public static void main(String args[]){ EventQueue.invokeLater(new Runnable(){

按下按钮时什么也没发生,我做错了什么??我想在按下按钮时绘制矩形。代码有什么问题

import java.awt.*;
import java.awt.event.*;
import javax.swing.*;
import java.awt.geom.*;

    class rectangle{
    public static void main(String args[]){
        EventQueue.invokeLater(new Runnable(){
            public void run(){
                final JFrame frame=new JFrame("RECTANGLE");
                final JPanel panel=new JPanel();
                JButton button=new JButton("DRAW");
                panel.add(button);
                frame.add(panel);
                frame.setSize(400,400);
                frame.setVisible(true);
                frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
                button.addActionListener(new ActionListener(){
                    public void actionPerformed(ActionEvent event){
                        panel.add(new drawrectangle());
                    }
                });
            }
        });
    }
}

class drawrectangle extends JComponent{
    public void paintComponent(Graphics g){
        Graphics2D g2=(Graphics2D) g;
        g2.setPaint(Color.PINK);
        Rectangle2D rect=new Rectangle2D.Double(50,50,200,200);
        g2.draw(rect);
        g2.fill(rect);
    }
}

您需要在
JFrame
上调用
repaint()

 button.addActionListener(new ActionListener(){
      public void actionPerformed(ActionEvent event){
              drawrectangle rec= new drawrectangle();
              panel.add(rec);
              rec.paintComponent();
              frame.repaint();
      }
 });
简单地写下:

frame.validate();
frame.repaint();

您的组件没有大小。您需要重写
getPreferredSize()
并返回矩形的大小,或者需要通过调用
setSize()
在其构造函数中设置其大小。矩形没有出现的原因是,它在其区域之外绘制,而Java 2D图形正在剪裁您在组件之外绘制的部分(即全部)

您不需要调用
repaint()
validate()
,因为当您将矩形添加到面板时,它会自动重新布局并将自身标记为需要重新绘制


但是,请注意,每次触发事件时都会添加一个新矩形。这就是你想要的吗?另外,
rectangle
drawrectangle
应该以大写字母开头,以符合正常的Java命名约定,尽管也有一个
Java.awt.rectangle
类,所以
rectangle
可能不是最好的名称。

只需将window.visibility添加到true即可。

其中:查看我的编辑。为什么?因为对任何组件调用repaint()都会向重绘管理器添加一个请求来绘制该组件。@user3798851哇,冷静点。试试我的编辑。您需要在drawRectangle上调用paintComponent。请尝试我的编辑。您需要在drawRectangle上调用paintComponent。@lolkidoki问题是添加到面板的组件没有大小,而不是它没有被绘制。对于downvoter:这可能不是有史以来最大的问题,但它有一个完整的、自包含的示例,非常简单,并显示了问题,并清楚地说明了预期结果(您看到的是一个矩形)和实际结果(您没有看到一个矩形)。它起作用了,谢谢:),您能告诉我pack()方法的用法吗?描述是这样的:“pack方法调整框架的大小,使其所有内容都处于或高于其首选大小。”the说“使此窗口的大小适合其子组件的首选大小和布局。“你的答案显示在质量较低的帖子评论队列中,因为它的长度较短。请考虑扩展你的答案,以指示在哪里添加你提到的代码,以及为什么它会修正OP的问题。@ AZUR青蛙不会,因为它与问题的原因无关。