ICode9

精准搜索请尝试: 精确搜索
首页 > 编程语言> 文章详细

java – 如何阻止JComponent清除?

2019-07-28 16:04:13  阅读:194  来源: 互联网

标签:repaint paintcomponent java swing mouseevent


我正在制作分子设计应用程序.我可以绘制线条和圆圈,但每次单击时它都会清除旧线条,所以基本上,你只能设计具有2个原子的分子.
此外,如果单击非常快,则mouseEvents不会传递,这也是一个问题.
这是代码:

import java.awt.Color;
import java.awt.Dimension;
import java.awt.Graphics;
import java.awt.Graphics2D;
import java.awt.Point;
import java.awt.event.MouseEvent;
import java.awt.event.MouseListener;
import java.awt.image.BufferedImage;

import javax.swing.JComponent;
import javax.swing.JFrame;
public class MoleculeDesigner extends JComponent implements MouseListener {
    private Point op, cp;
    private boolean first = true;
    public static final Color linecolor = new Color(0, 255, 0);
    private static final long serialVersionUID = 1L;
    private BufferedImage img = new BufferedImage(100, 100, BufferedImage.TYPE_INT_RGB);
    public MoleculeDesigner() {
        JFrame f = new JFrame("Molecule Designer");
        f.setBackground(Color.WHITE);
        f.addMouseListener(this);
        f.add(this);
        f.setSize(100, 100);
        f.setDefaultCloseOperation(3);
        f.setVisible(true);
    }
    public static void main(String[] args) {
        new MoleculeDesigner();
    }
    @Override
    protected void paintComponent(Graphics g) {
        if(op != null && cp != null) {
            Graphics2D g2 = img.createGraphics();
            super.paintComponent(g2);
            g2.setColor(linecolor);
            g2.drawLine((int) op.getX(), (int) op.getY(), (int) cp.getX(), (int) cp.getY());
            g2.setColor(Color.BLACK);
            g2.fillOval((int) cp.getX(), (int) cp.getY(), 10, 10);
            op = (Point) cp.clone();
            g2.dispose();
        }
    }
    @Override
    public Dimension getPreferredSize() {
        return getParent().getMaximumSize();
    }
    @Override
    public void mouseClicked(MouseEvent e) {
        if(!first) {
            cp = e.getPoint();
            cp.setLocation(cp.getX(), cp.getY() - 8);
        }
        else {
            op = e.getPoint();
            first = false;
        }
        repaint();
    }
    @Override public void mousePressed(MouseEvent e) {}
    @Override public void mouseReleased(MouseEvent e) {}
    @Override public void mouseEntered(MouseEvent e) {}
    @Override public void mouseExited(MouseEvent e) {}
}

所有帮助赞赏!

解决方法:

要么1)绘制BufferedImage,然后将其显示在paintComponent覆盖内部,或者2)将数据放入ArrayList或其他集合中,然后遍历paintComponent内的集合.如果我将数据用于其他目的,我会做后者.此外,永远不要这样做:

public void update(Graphics g) {
    paintComponent(g);
}

这不是Swing图形应该如何完成的,并且是潜在危险的代码.请阅读:

> Basic Swing Graphics Tutorial
> Advanced Swing Graphics Information

编辑
关于选项1的更多细节:

>使用其构造函数之一创建BufferedImage.
>在图像上绘图.

>当您需要绘制时,使用getGraphics()或createGrahpics()(对于Graphics2D对象)从BufferedImage获取Graphics对象
>使用此Graphics对象绘制
>然后dispose()Graphics对象.

>然后调用repaint()以要求JVM重新绘制组件.
>通过调用g.drawImage(…)在paintComponent方法中绘制图像,并传入缓冲的图像.

好处:通常绘图更快,我经常使用它来绘制背景图像.
缺点:数据点不可用,因此如果您需要对数据点进行操作或动画,这不是可行的方法.

标签:repaint,paintcomponent,java,swing,mouseevent
来源: https://codeday.me/bug/20190728/1563307.html

本站声明: 1. iCode9 技术分享网(下文简称本站)提供的所有内容,仅供技术学习、探讨和分享;
2. 关于本站的所有留言、评论、转载及引用,纯属内容发起人的个人观点,与本站观点和立场无关;
3. 关于本站的所有言论和文字,纯属内容发起人的个人观点,与本站观点和立场无关;
4. 本站文章均是网友提供,不完全保证技术分享内容的完整性、准确性、时效性、风险性和版权归属;如您发现该文章侵犯了您的权益,可联系我们第一时间进行删除;
5. 本站为非盈利性的个人网站,所有内容不会用来进行牟利,也不会利用任何形式的广告来间接获益,纯粹是为了广大技术爱好者提供技术内容和技术思想的分享性交流网站。

专注分享技术,共同学习,共同进步。侵权联系[81616952@qq.com]

Copyright (C)ICode9.com, All Rights Reserved.

ICode9版权所有