Java 在JFrame中绘制矩形不工作
我有一段代码,应该在Java 在JFrame中绘制矩形不工作,java,swing,jframe,Java,Swing,Jframe,我有一段代码,应该在JFrame上画一个矩形,但是当我在Eclipse上运行程序时,它只是打开了框架,但没有在上面画圆 代码如下: import javax.swing.*; import java.awt.*; public class Infout { Infout(){ JFrame frame = new JFrame(); frame.setSize(300, 400); frame.setTitle("An Empty Fr
JFrame
上画一个矩形,但是当我在Eclipse上运行程序时,它只是打开了框架,但没有在上面画圆
代码如下:
import javax.swing.*;
import java.awt.*;
public class Infout {
Infout(){
JFrame frame = new JFrame();
frame.setSize(300, 400);
frame.setTitle("An Empty Frame");
frame.setDefaultCloseOperation(3);
frame.setVisible(true);
}
public static void main(String[] args) {
// TODO Auto-generated method stub
Infout m = new Infout();
m.paint(null);
}
public void paint(Graphics g)
{
g.drawRect(5, 5, 105, 105);
}
}
有人能告诉我为什么它不能正常工作吗 通过调用以下命令,您已经成功地完全打破了绘制链:
m.paint(null);
应该是:
m.repaint();
调用repaint()
,将自动调用paint(Graphics)
方法,但使用有效的图形对象
请注意,通常认为最好覆盖添加到JFrame
(或窗口、小程序或对话框…)的JPanel
的paintComponent(Graphics)
方法
重写任一方法时要做的事情是在执行任何其他操作之前调用super方法。我相信您要做的是调用
frame.repaint()代码>取而代之。但是,这仍然不能解决您的问题,因为您的paint()
方法实际上并没有覆盖JFrame
的paint()
方法,因为您的类没有扩展JFrame
,它只是在构造函数中创建一个JFrame
因此,您可以在最后一分钟进行重写,并将您的paint方法移动到其中(根据polypiel的回答),或者(我个人认为更有说服力)您可以让您的类扩展JFrame,如下所示
import javax.swing.*;
import java.awt.*;
public class Infout extends JFrame{
Infout(){
setSize(300, 400);
setTitle("An Empty Frame");
setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
setVisible(true);
}
public static void main(String[] args) {
Infout m = new Infout();
m.repaint();
}
@Override
public void paint(Graphics g)
{
g.drawRect(5, 5, 105, 105);
}
}
然而,正如其他人指出的那样,paintComponent()
是更好的重写选择,您应该记住在新的重写方法开始时对super()
进行适当的调用。然后,您必须创建一个新的JPanel
以放入JFrame
中,因为JFrame
没有要覆盖的paintComponent()
方法
为此,您可以从类中完全删除paint()
方法,并在构造函数中添加以下最后一分钟重写:
setLayout(new BorderLayout());
add(new JPanel(){
@Override
public void paintComponent(Graphics g){
super.paintComponent(g);
g.drawRect(5, 5, 105, 105);
}
}, BorderLayout.CENTER);
但是,为了实现可扩展性和良好的面向对象设计,从长远来看,您最好定义自己的JPanel
子类,并覆盖paintComponent(Graphics)
方法。很抱歉,我希望这会有所帮助。不要在外部调用paint,而是在paint()方法中调用super.paint
并删除m.paint(null)。应该覆盖JFrame的paint方法。Infout
中的绘制方法无效
import javax.swing.*;
import java.awt.*;
public class Infout {
Infout(){
JFrame frame = new JFrame() {
@Override public void paint(Graphics g) {
g.drawRect(5, 5, 105, 105);
}
};
frame.setSize(300, 400);
frame.setTitle("An Empty Frame");
frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
frame.setVisible(true);
}
public static void main(String[] args) {
// TODO Auto-generated method stub
Infout m = new Infout();
// You shouldn't need to call repaint
}
}
在哪里调用paint方法[参考此链接]+1,以便使用有效的SSCCE发布您的问题。“frame.setDefaultCloseOperation(3);
”当存在定义的常量时,不要使用幻数。这就是@Override注释有用的原因自定义绘制需要在paintComponent()中执行JComponent的
调用super()
方法。需要在JComponent的
调用super()
方法的paintComponent()
中执行自定义绘制。@alex2410-一次解决一个问题,他们需要了解自己做错了什么,以及当前代码为什么不工作。我将编辑我的答案,以表明paintComponent()是一个更好的替代选择。如果OP没有询问这一点,您需要建议他使用更好的方法来避免将来出现问题。添加一个paintComponent示例,我将给您投票。@alex2410-适当的paintComponent(图形)代码示例
added:)需要在JComponent
的paintComponent()
中通过调用super()
方法执行自定义绘制。
import javax.swing.*;
import java.awt.*;
public class Infout {
Infout(){
JFrame frame = new JFrame() {
@Override public void paint(Graphics g) {
g.drawRect(5, 5, 105, 105);
}
};
frame.setSize(300, 400);
frame.setTitle("An Empty Frame");
frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
frame.setVisible(true);
}
public static void main(String[] args) {
// TODO Auto-generated method stub
Infout m = new Infout();
// You shouldn't need to call repaint
}
}