我想要创建一个程序,在桌面上用此属性绘制线条,用户可以点击线条旁边的桌面图标。 我创建样本。我创建透明框架并在此上绘制jWindow。在MouseReleased事件中配置主框架,然后保留所有创建的jwindows。我的代码创建了许多jwindow,这非常糟糕。对于画线30厘米程序创建超过400 jwindow,这会导致os非常重。 可以帮助我吗? (恕我丑的英语)在桌面上画一条线,点击可以在线左右
package PKHMain;
import java.awt.Color;
import java.awt.Dimension;
import java.awt.Graphics;
import java.awt.Graphics2D;
import java.awt.GridBagLayout;
import java.awt.RenderingHints;
import java.awt.Toolkit;
import java.awt.event.MouseEvent;
import java.awt.event.MouseListener;
import java.awt.event.MouseMotionListener;
import java.awt.geom.Ellipse2D;
import javax.swing.JFrame;
import javax.swing.JPanel;
import javax.swing.JWindow;
public class FRMMain extends JFrame implements MouseListener, MouseMotionListener {
public FRMMain() {
this.setUndecorated(true);
this.setSize(Toolkit.getDefaultToolkit().getScreenSize().width, Toolkit.getDefaultToolkit().getScreenSize().height);
this.setDefaultCloseOperation(DISPOSE_ON_CLOSE);
this.setLayout(null);
this.setBackground(new Color(0, 0, 0, 0));
this.setVisible(true);
addMouseListener(this);
addMouseMotionListener(this);
}
public static void main(String[] args) {
new FRMMain();
}
@Override
public void mousePressed(MouseEvent event) {
}
@Override
public void paint(Graphics g) {
repaint();
}
@Override
public void mouseClicked(MouseEvent event) {
}
@Override
public void mouseEntered(MouseEvent event) {
}
@Override
public void mouseExited(MouseEvent event) {
}
@Override
public void mouseReleased(MouseEvent event) {
this.dispose();
}
@Override
public void mouseDragged(MouseEvent event) {
int x = event.getX();
int y = event.getY();
JWindow frame = new JWindow();
frame.setBackground(new Color(0, 0, 0, 0));
frame.setContentPane(new ShapedPane(x, y));
frame.pack();
frame.setLocation(x, y);
frame.setAlwaysOnTop(true);
frame.setVisible(true);
}
public void mouseMoved(MouseEvent event) {
}
public class ShapedPane extends JPanel {
public int x1;
public int y1;
public ShapedPane(int x, int y) {
setOpaque(false);
setLayout(new GridBagLayout());
x1 = x;
y1 = y;
}
@Override
public Dimension getPreferredSize() {
return new Dimension(5, 5);
}
@Override
protected void paintComponent(Graphics g) {
super.paintComponent(g);
Graphics2D g2 = (Graphics2D) g.create();
RenderingHints hints = new RenderingHints(RenderingHints.KEY_ANTIALIASING, RenderingHints.VALUE_ANTIALIAS_ON);
g2.setRenderingHints(hints);
g2.setColor(Color.red);
g2.fill(new Ellipse2D.Double(0, 0, getWidth(), getHeight()));
g2.dispose();
}
}
}
我的问题,很重要的是你是为什么原因是油漆()与重绘绘画(),它可以导致高度处理器消耗或无限循环 – mKorbel
我删除了paint()方法,并没有改变任何东西。 –
将形状列表放到FRMMain类中,并在FRMMain框架的paint方法内绘制这些形状,并且不要创建任何新窗口。 – Holger