java - 使用 getGraphics 进行闪烁绘画

标签 java swing paint paintcomponent flicker

我正在做一个选择工具,我已经提供了这些解决方案,在第一个使用 JPanel getGraphics 方法中,我在鼠标拖动的地方绘制一个椭圆形,在第二个中,我重写 PaintComponent 方法来绘制椭圆形。

当我执行第一个方法时,拖动鼠标时会出现闪烁,并且绘图效果很差,而第二种方法则运行完美。为什么会发生这种情况?如果我在第一个解决方案中退出重绘,它会绘制椭圆形并且不会“删除”它们。

执行此类操作的最佳实践是什么?当我使用 getGraphics 绘图时,我是否遗漏了某些内容?

import java.awt.Color;
import java.awt.Dimension;
import java.awt.Graphics;
import java.awt.Graphics2D;
import java.awt.Point;
import java.awt.event.MouseAdapter;
import java.awt.event.MouseEvent;

import javax.swing.JFrame;
import javax.swing.JPanel;
import javax.swing.SwingUtilities;


public class TestGetGraphics extends JFrame {

    JPanel canvas;
    Painter painter;

    class Painter{
        void paint( Graphics2D g, Point p ){
            g.drawOval(p.x, p.y, 30, 30);
        }
    }

    public TestGetGraphics(){
        super();

        canvas = new JPanel();
        painter = new Painter();

        canvas.setPreferredSize( new Dimension(400, 400) );
        canvas.setBackground(Color.WHITE);

        canvas.addMouseMotionListener(new MouseAdapter() {
                public void mouseDragged(MouseEvent me){
                    painter.paint((Graphics2D) canvas.getGraphics(), me.getPoint());
                    canvas.repaint();
                }
        });

        add( canvas );

        setVisible(true);
        pack();
        setDefaultCloseOperation(EXIT_ON_CLOSE);
    }


    public static void main(String [] args){
        SwingUtilities.invokeLater(new Runnable() {

            @Override
            public void run() {
                new TestGetGraphics();
            }
        });
    }

}

这是paintComponent方法:

import java.awt.Color;
import java.awt.Dimension;
import java.awt.Graphics;
import java.awt.Graphics2D;
import java.awt.Point;
import java.awt.event.MouseAdapter;
import java.awt.event.MouseEvent;

import javax.swing.JFrame;
import javax.swing.JPanel;
import javax.swing.SwingUtilities;


public class TestPaintComponent extends JFrame  {
    JPanel canvas;
    Painter painter;

    class Painter{
        Point p;
        void paint( Graphics2D g ){
            if( p != null )
                g.drawOval(p.x, p.y, 30, 30);
        }

        void setPoint( Point p ){
            this.p = p;
        }
    }

    public TestPaintComponent(){
        super();

        canvas = new JPanel(){
            @Override
            public void paintComponent(Graphics g){
                super.paintComponent(g);
                painter.paint((Graphics2D) g);

            }

        };
        painter = new Painter();

        canvas.setPreferredSize( new Dimension(400, 400) );
        canvas.setBackground(Color.WHITE);

        canvas.addMouseMotionListener(new MouseAdapter() {
                public void mouseDragged(MouseEvent me){
                    painter.setPoint(me.getPoint());
                    canvas.repaint();
                }
        });

        add( canvas );

        setVisible(true);
        pack();
        setDefaultCloseOperation(EXIT_ON_CLOSE);
    }



    public static void main(String [] args){
        SwingUtilities.invokeLater(new Runnable() {

            @Override
            public void run() {
                new TestPaintComponent();
            }
        });
    }
}

最佳答案

不要在组件上调用 getGraphics()。相反,扩展组件并重写paintComponent()。更多信息请点击:http://docs.oracle.com/javase/tutorial/uiswing/painting/

关于java - 使用 getGraphics 进行闪烁绘画,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/21144633/

相关文章:

java - Android 首选项 Null 异常

java - 在 Java 中声明 'long' 超过 'int'

java - 如何从 onSensorChanged 获取加速度计值到 ThreatForLoopA 类?

java - 在 JSON 对象上与 Redis 和 JAVA 进行实时多用户协作

java - 调整框架大小时矩形组件消失

java - 需要解释 swing 方法 Paint() 的工作原理吗?

java - 使用 SQLite4java 中的数据填充 JTable 的最佳方法

java - 在 JFrame 之间传递值

java - 奇怪的j面板漆

java - 在 Java 类之间传递数据