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青蛙不会,因为它与问题的原因无关。