Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/350.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
在小部件上绘制二维图形?请为我清除Head First Java书籍中的这个示例_Java_Swing - Fatal编程技术网

在小部件上绘制二维图形?请为我清除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();
内部
method
this
返回与
pan
相同的引用,后者持有
MyDrawPanel
实例,允许我们通过
frame.add(this);
@masky007将此面板添加到frame中,但
this
也有其他含义,具体取决于上下文。就像在构造函数内部一样,我们可以像
这样使用它(argument1,argument2)
从同一类的另一个构造函数调用代码。