【问题标题】:paintComponent does painting on its ownpaintComponent 自己进行绘画
【发布时间】:2015-01-06 04:46:36
【问题描述】:

我的问题是,当我按下按钮时应该调用paintComponent然后应该在JPanel上绘制一个图形,不幸的是paintComponent在程序加载时绘制图形,在这种情况下按钮是无用的。

我制作了一个小版本的程序,以便轻松快速地阅读和检测问题。 这里的代码不是原始代码,但它演示了同样的问题。

import java.awt.Graphics;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import javax.swing.JButton;
import javax.swing.JPanel;

public class TestPaint extends JPanel implements ActionListener {

    private JButton button_1 = new JButton( "Draw Oval" );

    public TestPaint() {

        add(button_1);
    }

    @Override
    public void actionPerformed(ActionEvent e) {

        if ( e.getSource() == button_1 )
            repaint();
    }

    @Override
    public void paintComponent(Graphics g) {
        super.paintComponent(g);

        g.drawOval(10, 10, 100, 100);
    }
}

运行程序

import javax.swing.JFrame;

public class RunPaint {

    public static void main(String[] args) {

        TestPaint paint_g = new TestPaint();

        JFrame frame = new JFrame("Testing");
        frame.add(paint_g);
        frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        frame.setSize(300, 300);
        frame.setVisible(true);
    }
}

【问题讨论】:

  • “我的问题是,..” 好的,但您的实际问题是什么?例如,如果问题是 “为什么在我在代码中调用 repaint() 之前 GUI 会绘制?”,在我看来,这两个答案都没有直接解决这个问题,至少在链接被关注之前没有.. 但同样,..你的问题是什么?
  • Andrew Thompson 先生,我希望您花更多的时间阅读我的帖子,而不是写评论,也许到那时您就会明白我的问题是什么。
  • "..也许你会弄清楚我的问题是什么。" 我为什么要费心去尝试呢?毕竟,有很多人提出的问题我们甚至都不必考虑他们的问题是什么,因为他们小心翼翼地形成并提出了一个具体的问题。祝你好运……

标签: java swing paintcomponent


【解决方案1】:

作为一个简单的解决方案,您可以为您的类创建一个实例变量:

private Boolean buttonPressed = false;

然后在您的 actionListener 中将值设置为 true。

并在您的 paintComponent() 方法中添加如下代码:

if (buttonPressed)
    g.drawOval(...);

一个更好(更复杂的解决方案)是保留一个List 的对象来绘制。最初列表将为空,当您按下按钮时,您将一个对象添加到列表中。然后绘制代码只是遍历 List 来绘制对象。

查看Custom Painting Approaches 了解更多想法。示例代码并没有完全做到这一点,但它确实展示了如何从列表中绘制。

【讨论】:

  • 我确实尝试过使用布尔变量,但按下按钮时没有绘制任何内容,根本没有显示任何形状。
  • 我找到的最简单的解决方案是,改用匿名内部类并添加一个布尔实例变量来控制paintComponent 应该绘制的时间和内容。我真正想了解的是为什么原始版本不起作用,以及为什么这个版本起作用。对我来说,做某事“很好”,但了解它的工作原理是“伟大的”。
  • @BilalKorir,你还是不明白它是如何工作的。无需创建匿名内部类。正如我所建议的,所有的绘画逻辑都应该包含在TestPaint 类中。如果它不起作用,则说明您错误地执行了该建议。
  • 我相信我确实正确地使用了实例布尔变量。即使我完成了我的任务,我仍然想了解为什么。编程都是关于逻辑的,最终会发现问题。感谢您的 cmets,不胜感激。
  • @BilalKorir I believe I did implement using instance boolean variable correctly. - 它不起作用,那么如何正确实施? I finished my task - 解决方案过于复杂,所以我想说任务还没有完成。
【解决方案2】:

让您的 actionPerformed() 实现将所需的几何图形添加到 List<Shape> 并让 paintComponent() 遍历列表以呈现形状。一个完整的例子见here

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2017-03-10
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多