到目前为止,这本书大多是清晰和一致的,有时候我不得不回去重读,但在这个例子中我真的被卡住了,无论我读多少,我都没有得到它。它或者是书中遗漏的东西,或者我错过了重点。所以,如果你能为我清楚这一点,那就非常困扰我了,我不想继续阅读这本书而没有做到这一点。
import java.awt.*;
import javax.swing.*;
public class MyDrawPanel extends JPanel {
public static void main(String[] args) {
MyDrawPanel pan = new MyDrawPanel();
pan.go();
}
private static final long serialVersionUID = 2; // this was not mentioned in the book, but i had to put it to get rid of the warning the compiler gives without it (i googled it)
public void go() {
JFrame frame = new JFrame();
frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
frame.setSize(300,300);
frame.setVisible(true);
}
// In the book it's mentioned that you never call this method yourself (i don't quite get it how that works...)
public void paintComponent(Graphics g) {
g.setColor(Color.orange);
g.fillRect(20,50,100,100);
}
}
上面的代码编译并运行得很好但没有任何反应。
我试图实例化一个Graphics对象并玩弄它,但显然是抽象的Graphics类..
谢谢!
编辑:我有本书的第2版,所以你可以转到第364页第12章如果你也有(我绘制JFrame的代码来自前面的例子 - 我认为paintComponent( )方法示例只是添加到上一个示例。
答案 0 :(得分:3)
主要问题是您永远不会将MyDrawPanel
的实例添加到您在go()
方法中创建的框架,因此它仍为空。
解决此问题的一种方法是在this
方法中明确添加MyDrawPanel
的当前go
)实例,例如
public void go() {
JFrame frame = new JFrame();
frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
frame.setSize(300,300);
frame.add(this); // <-- add this line,
// you can also use frame.setContentPane(this)
frame.setVisible(true);
}
答案 1 :(得分:1)
您应始终致电super.paintComponent(g);
此外,您应该选择不同的设计来创建框架和面板。我个人会用这个:
public class MyGui extends JFrame {
public MyGui() {
DrawPanel myDrawPanel = new DrawPanel();
this.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
this.add(myDrawPanel);
this.pack();
this.setVisible(true);
}
}
public class MyDrawPanel extends JPanel {
public MyDrawPanel() {
this.setPreferredSize(new Dimension(300, 300));
}
@Override
public void paintComponent(Graphics g) {
super.paintComponent(g);
g.setColor(Color.orange);
g.fillRect(20,50,100,100);
}
}
了解super.paintComponent(g)
做什么的有用答案:What does super.paintComponent(g) do?