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

使用getGraphics进行闪烁绘画

翁宏茂
2023-03-14

我正在做一个选择工具,我已经带来了这些解决方案,在第一次使用J面板getGraphics方法,我在鼠标被拖动的任何地方绘制一个椭圆形,在第二次我覆盖了油漆组件方法来绘制椭圆形。

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

这样做的最佳实践是什么?,当我用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();
            }
        });
    }
}

共有1个答案

凤凡
2023-03-14

不要对组件调用getGraphics()。相反,扩展组件并覆盖paintComponent()。更多信息请点击此处:http://docs.oracle.com/javase/tutorial/uiswing/painting/

 类似资料:
  • 问题内容: 我为创建的每个对象都有一个名称。每个对象在表格视图中填充一行。现在,我希望在表行持续闪烁的橙色是。 只要属性为true,如何使表格行一直 闪烁? 问题答案: 要使内容闪烁,请使用: 在这种情况下,更改颜色的最好方法是使用CSS: 然后在外部CSS文件中,您可以配置Flash高亮显示的样式: 要将其绑定到布尔属性,只需使用该属性创建一个侦听器: 要将其应用于表格行,您必须编写一个。您只需

  • 这是因为在开发模式下,为了通过 Webpack 实现热加载,CSS代码是打包在 JavaScript 代码中,并动态打到页面中去,从而元素重绘引起了闪烁。 不用担心,在生产模式下,CSS代码会单独打包至独立的文件并置于head标签内,不会出现页面闪烁的现象。

  • 我在Lollipop上的共享元素转换中看到了奇怪的事情。共享元素在开始动画之前闪烁(请看视频https://www.youtube.com/watch?v=DCoyyC_S-9A) 我不知道为什么会这样。但是,当我添加

  • 我有2个屏幕,它们都有自己的和。当我使用 Jetpack Navigation Compose 库在它们之间导航时,应用栏会闪烁。为什么会发生这种情况,我该如何摆脱这种情况? 法典: 导航: Todo列表屏幕<代码>脚手架<代码>带有<代码>TopAppBar<代码>: 使用 添加/编辑屏幕:

  • 我试图用pyplay制作一个游戏,我几乎完成了,但我想让被画在墙上的盒子不闪烁,这些红色的盒子在整个游戏中闪烁,我不想让它们闪烁,最后,我在一个if条件下调用player碰撞函数,在这里每当我制作新的碰撞器时,我每次都要在if条件下添加函数,我想要的是碰撞器对象自动调用这个函数,而不需要我在if语句中为碰撞器的每个实例调用它对象。请指导我如何这样做。

  • 减低闪烁    以Interlace(交错扫描)方式在电视机输出PSP™规格软件的影像时,设定是否要减低画面的闪烁。 关 不减低画面的闪烁。 开 减低画面的闪烁。