加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 编程开发 > Java > 正文

java – 如何阻止JComponent清除?

发布时间:2020-12-15 04:18:29 所属栏目:Java 来源:网络整理
导读:我正在制作分子设计应用程序.我可以绘制线条和圆圈,但每次单击时它都会清除旧线条,所以基本上,你只能设计具有2个原子的分子. 此外,如果单击非常快,则mouseEvents不会传递,这也是一个问题. 这是代码: import java.awt.Color;import java.awt.Dimension;impor
我正在制作分子设计应用程序.我可以绘制线条和圆圈,但每次单击时它都会清除旧线条,所以基本上,你只能设计具有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方法中绘制图像,并传入缓冲的图像.

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

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读