我在框架中绘制了两个字符串的简单Java应用程序的一部分。第一个字符串被渲染,但第二个字符串不是。
import java.awt.*;
//Begin troublesome section
class NewFrame extends Frame {
public void paint (Graphics g)
{
g.drawString ("Foo", 70, 70);
}
public void paint2 (Graphics g)
{
g.drawString ("Bar", 600, 600);
}
}
//End troublesome section
public class FooBar {
public static void main (String[] argv)
{
NewFrame nf = new NewFrame ();
nf.setTitle ("Foo Bar");
nf.setResizable (true);
nf.setBackground (Color.cyan);
nf.setSize (700, 700);
nf.setVisible (true);
}
}
有问题的代码部分是所谓的“麻烦部分”。
答案 0 :(得分:5)
Java自动调用方法paint
来绘制窗口。请参阅方法documentation
方法paint2
不是标准的,不会自动调用。
要么
public void paint(Graphics g) {
super.paint(g);
g.drawString ("Foo", 70, 70);
g.drawString ("Bar", 600, 600);
}
或
public void paint(Graphics g) {
super.paint(g);
g.drawString ("Foo", 70, 70);
paint2(g);
}
public void paint2(Graphics g) {
g.drawString ("Bar", 600, 600);
}
答案 1 :(得分:4)
这并不奇怪:paint
由基类函数调用(在Frame
中的一个方法的实现中某处:在paint
中放置一个断点,然后使用你的调试器,在达到断点时查看调用堆栈),paint2
不会被任何东西调用。
为什么不亲自从paint2
致电paint
?更好的是,将paint2
的代码合并到paint
。因此,您不会再次陷入这种腌制状态,将@Override
注释添加到paint
;不要忘记在父类中调用paint
:
@Override
public void paint (Graphics g)
{
super.paint(g); /*your first job is to call the base method*/