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 编辑 >使用其构造函数之一创建BufferedImage. >当您需要绘制时,使用getGraphics()或createGrahpics()(对于Graphics2D对象)从BufferedImage获取Graphics对象 >然后调用repaint()以要求JVM重新绘制组件. 好处:通常绘图更快,我经常使用它来绘制背景图像.缺点:数据点不可用,因此如果您需要对数据点进行操作或动画,这不是可行的方法. (编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |