我有一些代码应该在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);
}
}
有人可以告诉我为什么它不能正常工作吗?
答案 0 :(得分:2)
您已设法通过调用:
完全打破了油漆链m.paint(null);
应该是:
m.repaint();
调用repaint()
后,paint(Graphics)
方法将自动调用,但带有有效图形对象。
请注意,覆盖添加到paintComponent(Graphics)
(或窗口,applet或对话框)的JPanel
的{{1}}方法通常被认为更好。 )。
覆盖任一方法时要做的事情是在执行任何其他操作之前调用super方法。
答案 1 :(得分:2)
我相信您要做的就是致电frame.repaint();
。但是,这仍然不能解决您的问题,因为您的paint()
方法实际上并未覆盖JFrame
的{{1}}方法,因为您的类没有扩展paint()
,它只是在构造函数中创建JFrame
。
所以,你可以 做最后一分钟覆盖并将你的绘画方法移动到那里(根据polypiel的答案),或者(我个人认为更有说服力)你可以让你的类扩展JFrame,像这样;
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
方法可能会更好。抱歉胡扯,我希望这会有所帮助。
答案 2 :(得分:1)
应该覆盖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
}
}
答案 3 :(得分:0)
不要在外部调用绘图并在paint()方法中调用super.paint。
public void paint(Graphics g)
{
super.paint(g);
//....
}
并删除m.paint(null)。