【发布时间】:2015-03-04 18:10:36
【问题描述】:
我正在尝试制作一个屏幕截图工具,以全屏方式向用户显示屏幕截图。然后用户将使用一些工具对其进行编辑。 在创建它时,我遇到了一些效果可视化的问题。 我想使用用于在桌面或文件资源管理器上选择多个文件的选择矩形(不知道确切的术语名称)创建所选区域的视觉表示。 example image link
我尝试在背景图片上绘制矩形,但是当我尝试移动光标时,图像令人耳目一新。
然后我尝试用setOpaque(false); 和setBackground(new Color(0,0,0,0)); 做透明面板,而不是在这个面板上固定鼠标侦听器。
它成功绘制了矩形,但面板的背景立即用默认的灰色填充。
如何使前景面板透明并在其上绘制一些东西,而无需重新绘制背景图像?
这是我的 Glass 课程:
private static final int WIDE = 1920;
private static final int HIGH = 1080;
private final Color clean = new Color(0,0,0,0);
private Point mousePt = new Point(WIDE / 2, HIGH / 2);
private Rectangle mouseRect = new Rectangle();
Glass(){
this.setOpaque(false);
this.setBackground(clean);
this.addMouseListener(new MouseHandler());
this.addMouseMotionListener(new MouseMotionHandler());
}
public void paintComponent(Graphics g) {
g.setColor(clean);
g.fillRect(0, 0, 1920, 1080 );
g.setColor(Color.darkGray);
g.drawRect(mouseRect.x, mouseRect.y, mouseRect.width, mouseRect.height);
}
private class MouseHandler extends MouseAdapter {
public void mouseReleased(MouseEvent e) {
System.out.println("released");
mouseRect.setBounds(0, 0, 0, 0);
e.getComponent().repaint();
}
public void mousePressed(MouseEvent e) {
mousePt = e.getPoint();
System.out.println("pressed");
e.getComponent().repaint();
}
}
private class MouseMotionHandler extends MouseMotionAdapter {
public void mouseDragged(MouseEvent e){
mouseRect.setBounds(
Math.min(mousePt.x, e.getX()),
Math.min(mousePt.y, e.getY()),
Math.abs(mousePt.x - e.getX()),
Math.abs(mousePt.y - e.getY()));
e.getComponent().repaint();
}
}
【问题讨论】:
标签: java image swing jpanel paint