如何防止JPanel更新?

斯皮卡特里克斯

我正在创建一种绘画应用程序。用户可以通过按/拖动鼠标来在JPanel中移动圆。

我有一个JCheckBoxMenuItem在我的一个JMenuS:

JCheckBoxMenuItem checkitem = new JCheckBoxMenuItem("Draw mode",false);
  • 如果未激活该圆,则只能移动(通过拖动/按下)该圆,并且上一个圆将被删除。
  • 激活后,只能移动该圆,但是在拖动/按下鼠标时,上一个圆不会被擦除(这与绘画程序的工作方式相同)

我的代码的简化版:

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

class GUI extends JFrame implements MouseListener, MouseMotionListener, ActionListener, ItemListener
{
    JPanel mainPan, colorPan;
    Color color = Color.BLACK;
    JCheckBoxMenuItem checkitem;
    boolean clear = true;

    public GUI(String header)
    {
        maker();

        mainPan.addMouseListener(this);
        mainPan.addMouseMotionListener(this);

        add(mainPan , BorderLayout.CENTER);
        add(colorPan, BorderLayout.PAGE_END); 
    }

    public void maker()
    {
        colorPan = new JPanel();
        colorPan.setLayout(new GridLayout(1, 0));

        mainPan = new JPanel(){
            @Override
            public void paintComponent(Graphics g)
            {
                //g.setColor(Color.WHITE);
                //g.fillRect(0,0,getWidth(),getHeight());
                if(clear)
                    super.paintComponent(g); //Do the same thing as above(Clear JPanel)

                g.setColor(color);
                g.fillOval(x,y,50,50); //x and y are integer variables that I use in my full program
            }
        };

        checkitem = new JCheckBoxMenuItem("Draw mode",false);
        //After adding this to a JMenu,
        checkitem.addItemListener(this);
    }

    public void itemStateChanged(ItemEvent e)
    {
        if(e.getStateChange() == ItemEvent.SELECTED)
        {
            clear = false;
        }
        else
        {
            clear = true;
        }
    }
}

下面的屏幕截图显示了我完整程序的输出:

截屏

colorPan是充满不同颜色JButton的JPanel。它的顶部是mainPan

目前,“绘图模式”无法正常工作。我一直以为那super.paintComponent(g);是在repaint()调用时清除/重置屏幕的那个但是我删除了它,并且很惊讶地看到程序的行为相同。

基本上,我的问题在这里:

if(clear)
    super.paintComponent(g);

我需要防止在repaint()调用时清除所有内容我如何实现自己想要的?

垃圾神

不能“防止JPanel更新”;paintComponent()将根据系统要求异步调用。取而代之的是,以允许您的实现在调用paintComponent()呈现所有内容的方式来定义视图类的条件属性

在下面的示例中,每次单击鼠标都会更改前景色,并paintComponent()使用修改后的设置。在更复杂的例子列举在这里ClearAction清除List<Node>List<Edge>定义图形的模型。缺少对的调用super.paintComponent(g),否则对不透明组件是必需的,对fillRect()in的调用将paintComponent()清除所有剩余的选择工件。

public void actionPerformed(ActionEvent e) {
    nodes.clear();
    edges.clear();
    repaint();
}

图像

import java.awt.Color;
import java.awt.Dimension;
import java.awt.EventQueue;
import java.awt.Font;
import java.awt.Graphics;
import java.awt.Point;
import java.awt.event.MouseAdapter;
import java.awt.event.MouseEvent;
import java.awt.event.MouseMotionAdapter;
import java.util.Random;
import javax.swing.JFrame;
import javax.swing.JPanel;

/** @see https://stackoverflow.com/a/5312702/230513 */
public class MouseDragTest extends JPanel {

    private static final String TITLE = "Drag me!";
    private static final Random r = new Random();
    private static final int W = 640;
    private static final int H = 480;
    private Point textPt = new Point(W / 2, H / 2);
    private Point mousePt;
    private Color color = Color.black;

    public MouseDragTest() {
        this.setFont(new Font("Serif", Font.ITALIC + Font.BOLD, 32));
        this.addMouseListener(new MouseAdapter() {

            @Override
            public void mousePressed(MouseEvent e) {
                mousePt = e.getPoint();
                setColor(Color.getHSBColor(r.nextFloat(), 1, 1));
                repaint();
            }
        });
        this.addMouseMotionListener(new MouseMotionAdapter() {

            @Override
            public void mouseDragged(MouseEvent e) {
                int dx = e.getX() - mousePt.x;
                int dy = e.getY() - mousePt.y;
                textPt.setLocation(textPt.x + dx, textPt.y + dy);
                mousePt = e.getPoint();
                repaint();
            }
        });
    }

    public void setColor(Color color) {
        this.color = color;
    }

    @Override
    public Dimension getPreferredSize() {
        return new Dimension(W, H);
    }

    @Override
    public void paintComponent(Graphics g) {
        super.paintComponent(g);
        g.setColor(color);
        int w2 = g.getFontMetrics().stringWidth(TITLE) / 2;
        g.drawString(TITLE, textPt.x - w2, textPt.y);
    }

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

            @Override
            public void run() {
                JFrame f = new JFrame(TITLE);
                f.add(new MouseDragTest());
                f.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
                f.pack();
                f.setLocationRelativeTo(null);
                f.setVisible(true);
            }
        });
    }
}

本文收集自互联网,转载请注明来源。

如有侵权,请联系[email protected] 删除。

编辑于
0

我来说两句

0条评论
登录后参与评论

相关文章

来自分类Dev

如何防止Grails域被更新或删除?

来自分类Dev

如何防止android应用从Google Play商店更新?

来自分类Dev

如何防止用户在MDI窗口中打开多个JPanel?

来自分类Dev

EDMX更新后如何防止字段丢失

来自分类Dev

JScrollPane中的JPanel,如何防止自动滚动

来自分类Dev

Android:如何防止Wifi断开DHCP更新?

来自分类Dev

更新全局PrimeFaces咆哮时如何防止p:messages更新

来自分类Dev

如何防止更新如此频繁地被调用?

来自分类Dev

如何防止更新时进行Spring验证

来自分类Dev

如何防止表行在更新时重建

来自分类Dev

如何防止Ubuntu进行自动更新?

来自分类Dev

如何防止Korge视图更新?

来自分类Dev

关于Redux更新,如何防止组件更新

来自分类Dev

如何防止Ubuntu进行自动更新?

来自分类Dev

如何防止CCLabelBMFont更新位置?

来自分类Dev

如何防止用户在MDI窗口中打开多个JPanel?

来自分类Dev

EDMX更新后如何防止字段丢失

来自分类Dev

JScrollPane中的JPanel,如何防止自动滚动

来自分类Dev

如何防止不必要的更新

来自分类Dev

如何防止JPanel更新?

来自分类Dev

AspxGridView,单击更新按钮时如何防止更新?

来自分类Dev

如何防止更新不存在的节点?

来自分类Dev

如何防止特定软件包的更新?

来自分类Dev

如何防止Adobe Acrobat自动更新?

来自分类Dev

进展OpenEdge如何防止某人更新记录

来自分类Dev

如何防止角度更新数组上的闪烁

来自分类Dev

如何防止Atom更新软件包?

来自分类Dev

防止JPanel重复添加ImageIcon

来自分类Dev

如何防止更新错误数据?