【问题标题】:Why is JAVA paint() method not working?为什么 JAVA paint() 方法不起作用?
【发布时间】:2015-07-18 14:23:43
【问题描述】:

谁能解释一下为什么这段代码没有显示一个 20 x 20 白色椭圆形? 我已经添加了 cmets,所以你不必搜索太多。我认为我在绘画方法中做错了什么。或者是别的什么? 代码如下:

public class Dodge extends JFrame{      //EXTENDED JFRAME

public Dodge(){
    JPanel panel = new JPanel();
                                                     //
    panel.setBackground(Color.BLACK);               //
                                                   //
    add(panel);                                   //
    setTitle("Dodging game");                    //
    setDefaultCloseOperation(EXIT_ON_CLOSE);    //  GUI SETUP
    setSize(500, 400);                         //
    setLocationRelativeTo(null);              //
    setResizable(true);                      //

}

public void paint(Graphics g){
    g.setColor(Color.BLACK);
    g.fillRect(0, 0, getWidth(), getHeight());

    g.setColor(Color.WHITE);                   //THIS METHOD SHOULD GIVE ME AN OVAL
    g.fillOval(5, 5, 20, 20);

    repaint();
}


public static void main(String[] args){             //

    SwingUtilities.invokeLater(new Runnable() {    // MAIN THREAD

        @Override                                 //
        public void run() {
            new Dodge().setVisible(true);        //

我是初学者,所以请清楚什么是错的

另外请解释一下这个方法是如何在我没有调用它的时候导致程序发生变化的?

【问题讨论】:

  • 你是在调用 Dodge() 中的方法 paint(Graphics g) 吗?
  • 不,但它仍然会导致变化
  • 我正在学习教程。它对他有用。而且他也没有调用该方法
  • 您正在覆盖来自JFrame(最初来自Component)的paint 方法。系统调用它来执行绘制。这就是它的调用方式。
  • 这段代码中的问题是从paint 方法中调用repaint ()。而是覆盖JComponent/JPanelpaintComponent,其实是用来做绘画相关任务的。一个简单的例子可以引用here

标签: java jframe paint


【解决方案1】:

paint() 方法在渲染组件时自动调用。

您的椭圆没有显示出来,因为它隐藏在框架或标题栏的工具栏后面。 (无论你怎么称呼它,都是最重要的)。

将您的 fillOval 更改为 g.fillOval(50, 50, 20, 20);,您将看到它。

此外,如果您覆盖它,您应该始终调用 super.paint(g)

另外,不要从您的 paint() 方法中调用 repaint()

【讨论】:

  • 你说得对,椭圆形被隐藏了。但 super.paint 没有用。 paintComponents() 做到了。谢谢:D
  • @ZeroCipher,你不应该调用 super.paintComponents(...) 并且你不应该覆盖paint(...)。自定义绘画是通过覆盖 JPanel 的 paintComponent(...) 方法完成的,然后将面板添加到框架中。阅读 Custom Painting 上的 Swing 教程部分,了解更多信息和工作示例。
猜你喜欢
  • 2011-05-07
  • 1970-01-01
  • 1970-01-01
  • 2023-03-03
  • 1970-01-01
  • 2013-01-22
  • 2018-08-06
  • 2012-01-14
  • 2015-11-07
相关资源
最近更新 更多