在小部件上绘制二维图形?请为我清除Head First Java书籍中的这个示例
到目前为止,这本书基本上是清晰一致的,有时我不得不回去重读,但在这个例子中,我真的被卡住了,无论我重读多少次,我都不明白。要么是书中遗漏了什么,要么是我遗漏了整个要点。所以,如果你能帮我澄清这一点,这让我非常烦恼,我不想继续读这本书而没有得到正确的答案在小部件上绘制二维图形?请为我清除Head First Java书籍中的这个示例,java,swing,Java,Swing,到目前为止,这本书基本上是清晰一致的,有时我不得不回去重读,但在这个例子中,我真的被卡住了,无论我重读多少次,我都不明白。要么是书中遗漏了什么,要么是我遗漏了整个要点。所以,如果你能帮我澄清这一点,这让我非常烦恼,我不想继续读这本书而没有得到正确的答案 import java.awt.*; import javax.swing.*; public class MyDrawPanel extends JPanel { public static void main(String[] ar
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);
}
}
上面的代码编译并运行得很好,但什么也没发生
我试图实例化一个图形对象并进行处理,但显然图形类是抽象的
谢谢大家!
编辑:我有这本书的第二版,所以如果你也有的话,你可以翻到第364页第12章(我画JFrame的代码来自上一个例子——我认为paintComponent()方法例子只是增加了上一个例子。你应该总是调用
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)
功能的有用答案:您应该始终调用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)
功能的有用答案:主要问题是,您从未将MyDrawPanel
的实例添加到您在go()
方法中创建的框架中,因此它保持为空
修复它的一种方法是在go
方法中显式添加MyDrawPanel
的当前(this
)实例
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);
}
public void go(){
JFrame=新JFrame();
frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
框架。设置尺寸(300300);
frame.add(此);//主要问题是,您从未将MyDrawPanel
的实例添加到您在go()
方法中创建的框架中,因此它仍然为空
修复它的一种方法是在go
方法中显式添加MyDrawPanel
的当前(this
)实例
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);
}
public void go(){
JFrame=新JFrame();
frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
框架。设置尺寸(300300);
frame.add(这个);//喜欢合成而不是继承,如果你真的不需要的话就不要扩展框架。更多信息:@Pshemo-interest,这是他们在大学里对我学的。谢谢!喜欢合成而不是继承,如果你真的不需要的话就不要扩展框架。更多信息:@Pshemo-interest,这是他们在大学里对我学的.谢谢!谢谢..这本书中肯定遗漏了:/(编辑:这本书实际上还没有解释“this”的确切含义..)这个
内部方法表示调用方法的对象。因此,如果我们执行像someInstance.method()
这样的代码,那么从内部方法()
此
将保留与某个实例
相同的引用。因此,自从我们调用pan.go();
内部go()
方法后,此
返回与pan
相同的引用,该引用保留MyDrawPanel
实例,允许我们通过frame.add(此)将此面板添加到框架中
@masky007但根据上下文,this
还有其他含义。就像在构造函数内部一样,我们可以像this(argument1,argument2)
一样使用它来调用同一类的另一个构造函数中的代码。谢谢..这在书中肯定被遗漏了:/(编辑:这本书实际上从未解释过确切的内容。)“this”的意思是…)这个内部方法表示调用方法的对象。因此,如果我们执行像someInstance.method()
这样的代码,那么从内部method()
这个将与someInstance
保持相同的引用。因此,自从我们调用pan.go();
内部
methodthis
返回与pan
相同的引用,后者持有MyDrawPanel
实例,允许我们通过frame.add(this);
@masky007将此面板添加到frame中,但this
也有其他含义,具体取决于上下文。就像在构造函数内部一样,我们可以像这样使用它(argument1,argument2)
从同一类的另一个构造函数调用代码。