的paintComponent()与涂料()和JPanel的VS帆布在漆刷型GUI(paintCom

2019-06-17 21:42发布

我得到了一些有趣的想法和批评这个 , 这个和这个职位(见最后发表的文章有问题的GUI的代码)。 尽管如此,我仍然很困惑的一些事情。 主要是,什么是显示用户介绍显卡的最便宜的方式?

更具体而言,我使用paintComponent()从方法JPanel通过使这个类的一个对象中的类MouseDragged()与方法一起paintComponent(getGraphics())方法( AuxClass2AuxClass1相应)。

显然,使用getGraphics()paintComponent()而不是repaint()是不好的想法,我怀疑是与内存使用。 同时调用AuxClass2每个用户拖动鼠标也是一个坏主意的时间。

另外的JPanel VS帆布(即摆动VS AWT)是有点混乱。 什么是使用什么时候?

我一直试图找到一个解决方法,但还没有找到一个,尤其是对getGraphics()方法:还能怎么图形添加到面板?

Answer 1:

我一直试图找到一个解决方法,但还没有找到一个,尤其是对的getGraphics()方法:还能怎么图形添加到面板?

你还记得需要被描绘成一个变量和使用,在的paintComponent()的内容。 例如,你好像什么是想在你的另一个问题看起来像做:

import java.awt.*;
import java.awt.event.*;
import javax.swing.*;

public class PaintRectangle extends JPanel {

    private Point mouseLocation;

    public PaintRectangle() {
        setPreferredSize(new Dimension(500, 500));

        MouseAdapter listener = new MouseAdapter() {
            @Override
            public void mousePressed(MouseEvent e) {
                updateMouseRectangle(e);
            }

            private void updateMouseRectangle(MouseEvent e) {
                mouseLocation = e.getPoint();
                repaint();
            }

            @Override
            public void mouseDragged(MouseEvent e) {
                updateMouseRectangle(e);
            }

            @Override
            public void mouseReleased(MouseEvent e) {
                mouseLocation = null;
                repaint();
            }
        };
        addMouseListener(listener);
        addMouseMotionListener(listener);
    }

    private Rectangle getRectangle() {
        if(mouseLocation != null) {
            return new Rectangle(mouseLocation.x - 5, mouseLocation.y - 5, 10, 10);
        }
        else {
            return null;
        }
    }

    @Override
    protected void paintComponent(Graphics g) {
        super.paintComponent(g);
        Rectangle rectangle = getRectangle();
        if(rectangle != null) {
            Graphics2D gg = (Graphics2D) g;
            gg.setColor(Color.BLUE);
            gg.fill(rectangle);
            gg.setColor(Color.BLACK);
            gg.draw(rectangle);
        }
    }

    public static void main(String[] args) {
        EventQueue.invokeLater(new Runnable() {
            @Override
            public void run() {
                JFrame frame = new JFrame("Test");
                frame.setDefaultCloseOperation(JFrame.DISPOSE_ON_CLOSE);
                frame.getContentPane().add(new PaintRectangle());
                frame.pack();
                frame.setLocationRelativeTo(null);
                frame.setVisible(true);
            }
        });
    }
}

又见http://docs.oracle.com/javase/tutorial/uiswing/painting/



Answer 2:

重型VS重量轻

从根本上说,重量组分被链接到其自身的本地对等体,其中轻重量部件共享共同的本地对等体。

在一般情况下,这不是因为有与z顺序,在我的体验问题混合重和轻重量的部件是一个好主意(即使它应该是现在好多了),还有一些可以裁剪补漆的问题。

这就是为什么你已经从使用气馁的原因Canvas类的,可能是因为你试图把它放到一个重量轻的分量......我猜

控制幻觉

一个新人到的最大问题摆API是你有某种在喷漆工艺控制的错觉,你不知道。 它更容易只是接受它。

你能做的最好是请求重绘经理在其尽早进行更新。

此外,调用getGraphics不保证返回一个非空值。

事物的正确顺序

paint VS paintComponent

这里的问题是paint做了一些重要的工作,调用paintComponent只是其中之一。

在Swing我们大大地鼓励使用paintComponent每当我们要进行自定义绘图,这就是,通常,在组件上的最低水平,并绘子组件之前被调用。

如果覆盖paint ,然后在绘制Graphics ,来电后super.paint你最终会画上的一切之上,这并不总是想要的结果

即使是这样,子组件可以独立涂父容器,使得涂料“过”,你可能会添加任何油漆效果

相关链接

  • 绘画在Swing (约油漆过程是如何工作会谈)
  • 执行自定义Paining(在Swing)
  • 2D图形步道

临别的想法

只有实际添加到一个组成部分,其连接到本机等部件将永远都在那里paint调用的方法。 所以,试图描绘到尚未添加到容器又一个组件是毫无意义...



Answer 3:

..paintbrush型GUI ..

使用BufferedImage的涂装表面。 显示它在一个JLabel 。 把标签的内面板的中心JScrollPane

呼叫bufferedImage.getGraphics()是必要的,但要记得dispose()完成时的它,然后调用label.repaint()

使用Swing组件贯穿始终,不覆盖任何东西。

下面是一个使用图像作为绘画面的例子 。

而这里是一个更好的 !

我没有说的屏幕截图是更好的,它是更好的代码。 ;)



文章来源: paintComponent() vs paint() and JPanel vs Canvas in a paintbrush-type GUI