快速重绘问题(画布对象)

时间:2010-11-01 19:20:35

标签: java canvas paint repaint

新细节:

从我的主类的actionPerformed事件中调用时,我的JPanel对象的重绘方法不起作用。它可以在主类ImageViewer的ImageViewer方法中工作,但不能在此类的actionPerformed方法中工作。

这些是我的代码中不能正常工作的重要部分(重新绘制部分):

主要类别:

/**
 * @(#)NeatImageViewer.java
 *
 * NeatImageViewer application
 *
 * @author
 * @version 1.00 2010/11/1
 */

import java.awt.*;
import java.awt.event.*;
import java.awt.image.*;
import java.io.*;
import javax.imageio.*;
import javax.swing.*;


public class NeatImageViewer extends JFrame implements ActionListener {

    GraphicsPanel gp;

    NeatImageViewer() {
               //... window components ...
    }

    public static void main(String[] args) {

        NeatImageViewer niv = new NeatImageViewer();
        niv.setSize(500,500);
        niv.setLocationRelativeTo(niv);
        niv.setVisible(true);
    }

    public void actionPerformed(ActionEvent e) {
            //...
                gp = new GraphicsPanel();
                gp.img = img;
                gp.repaint(); //<!--- Not Working!
                this.add(gp);
            //...
    }

}

GraphicsPanel类:

/**
 * @(#)GraphicsPanel.java
 *
 *
 * @author
 * @version 1.00 2010/11/1
 */

import java.awt.*;
import java.awt.event.*;
import java.awt.image.*;
import java.io.*;
import javax.imageio.*;
import javax.swing.*;


public class GraphicsPanel extends JPanel {
    BufferedImage img;

    GraphicsPanel() {
        super();
    }

    protected void paintComponent(Graphics g) {
        //paint method isn't executed???
        super.paintComponent(g);
        System.out.println("Paint!");
    }

}

3 个答案:

答案 0 :(得分:1)

您必须覆盖paintComponent(Graphics g)而不是paint(Graphics g) 因此,您发布的方法应重命名为paintComponent

编辑:初始化完成后,您是否pack()编了框架?

编辑:当组件不可见时,repaint()方法不执行任何操作。因此,您必须先将其添加到JFrame,pack()框架。打包后,不再需要重新粉刷。

答案 1 :(得分:0)

在Swing中你不使用Canvas。您可以在JPanel或JComponent上进行自定义绘制,并且如前所述覆盖paintComponent(...)方法。阅读Custom Painting上的Swing教程,了解更多信息和工作示例。

此外,使用Swing,无需创建自定义组件来显示图像。您只需将JLabel与ImageIcon一起使用即可。阅读“如何使用图标”部分。

为所有Swing基础知识添加教程。

编辑:

将组件添加到可见GUI时,基本代码应为:

panel.add( ... );
panel.revalidate();
panel.repaint();

答案 2 :(得分:0)

(我是Skyfe但是来自另一个IP所以没有“登录”并且无法发表评论)

我很抱歉,但我没有得到什么问题???

我提供了我的代码,并且在从actionPerformed方法调用repaint时它没有执行paintComponent函数。只需复制粘贴我的代码并使用java编译器进行编译,并且在执行我可以告诉的操作时它不会执行paintComponent方法,因为我在paint方法中使用了System.out.println()方法。并且它不会绘制任何东西,因为我只是想检查它是否调用paint方法AT ALL,因为我在paintComponent方法中放置了一个系统输出,在使用重绘时没有执行。这只是一个测试而且没有用。

那你的意思是SSCCE在哪里,这就是我所拥有的所有代码。我编译了我在主帖中发布的代码,问题是它在执行操作时没有显示任何系统输出(并且调用了重绘事件)。我没看到帖子里有什么遗漏?