当前位置: 首页 > 知识库问答 >
问题:

在小部件上绘制2D图形?请为我清除Head First Java书籍中的这个示例

孟鹤龄
2023-03-14

到目前为止,这本书基本上是清晰一致的,有时我不得不回去重读,但在这个例子中,我真的被卡住了,无论我重读多少,我都不明白。要么是书中遗漏了什么,要么是我遗漏了整个要点。所以,如果你能帮我澄清一下,这让我非常困扰,我不想在没有得到正确答案的情况下继续读这本书。

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);
    }

}

上面的代码编译并运行得很好,但什么也没发生。

我试着实例化一个图形对象,然后在抽象的图形类中玩。。

非常感谢。

编辑:我有这本书的第2版,所以如果你也有它,你可以翻到第12章第364页(我绘制JFrame的代码来自前面的示例-我认为油漆组件()方法示例只是添加到前面的示例中。

共有2个答案

姜宏放
2023-03-14

您应该始终调用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)做什么?

公西苗宣
2023-03-14

主要问题是您从未将MyDrawBoard的实例添加到您在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);
}

 类似资料:
  • 我已经阅读了很多关于绘制Graphics2D组件和添加到JPanel/JFrame的教程,但我无法找到如何简单地将多个这些组件添加到一个JPanel中。我下面的代码只添加了1个组件(行),我不知道为什么不能添加更多。 我到底做错了什么? 期望行为:应有 3 条红线。 我的整个代码:

  • 问题内容: 我正在尝试使Java 2D图形“ hello world”运行起来,并发现它异常困难(即,我正在搜索“ java hello world example”的变体,然后变成空白)。有人能帮我举一个最小的世界范例吗? 编辑 不过,这是一个不错的起点,“ Java教程:执行自定义绘画” 。 问题答案: 要在Swing中绘制矩形,您应该: 首先,永远不要直接在JFrame或其他顶级窗口中绘制。

  • 所以我是新的Java图形,我正在创建一个程序,将显示一个矩形。但当我运行我的程序时,它只显示为一个小盒子,而不是矩形。我真的不知道为什么会这样。 下面是我的代码: 这是我的矩形类: 这是我的形状界面:

  • 问题内容: 关闭。 此问题不符合堆栈溢出准则。它当前不接受答案。 想改善这个问题吗? 更新问题,使其成为Stack Overflow 的主题。 6年前关闭。 改善这个问题 我想用Java绘制图形(节点和边)。但是,由于我不知道该怎么做,因此在开始之前我想寻求一些建议。 我应该怎么做? 使用Graphics2D包,对吗? 节点的标签怎么样?我应该使用诸如drawString之类的东西并手动处理所有“

  • 导语 Qt中提供了强大的2D绘图系统,可以使用相同的API在屏幕和绘图设备上进行绘制,它主要基于QPainter、QPaintDevice和QPaintEngine这三个类。其中QPainter用来执行绘图操作;QPaintDevice提供绘图设备,它是一个二维空间的抽象,可以使用QPainter在其上进行绘制;QPaintEngine提供了一些接口,可以用于QPainter在不同的设备上进行绘制

  • 使用matplotlib时,我可以使用{importmatplotlib.pyplotas plt}因为我使用Tkinter,所以我也会使用PicreCanvasTkAgg来做同样的事情 有人能帮我在如何实现matplotlib的停顿效果在菲格勒CanvasTkAgg。