和JPanel的VS画布画笔型GUI

和JPanel的VS画布画笔型GUI

本文介绍了的paintComponent()与涂料()和JPanel的VS画布画笔型GUI的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

我从this, this和员额(见最后发表的帖子有问题的GUI的code )。尽管如此,我还是挺困惑的一些事情。主要是,什么是显示用户介绍显卡的最便宜的方式。

更具体地说,我通过在这个类的一个对象使用从的JP​​anel 的paintComponent()方法与的paintComponent的的mouseDragged()方法一起(的getGraphics())办法( AuxClass2 AuxClass1 相应地)。

显然,使用的getGraphics()的paintComponent()而不是重绘() 是坏的想法,我怀疑是与内存使用。还呼吁用户拖动鼠标也是一个坏主意的 AuxClass2 每次。

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

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


解决方案

You remember what needs to be painted as a variable and use that in paintComponent().For example, what you seemed to be trying to do in your other question would look like:

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);
            }
        });
    }
}

See also http://docs.oracle.com/javase/tutorial/uiswing/painting/

这篇关于的paintComponent()与涂料()和JPanel的VS画布画笔型GUI的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持!

08-23 11:36