我有个问题。我可以在body MousePressed中创建glasspane吗?如果是,有没有人可以写给我?我的意思是,我按下鼠标按钮,玻璃窗格是可见的,我可以在他身上绘画。
编辑
好了,我现在得到了我想要的东西。当我单击鼠标按钮时,我的玻璃窗格正在创建,当我释放此按钮时,玻璃窗格将消失。现在我有另一个问题。我应该在那里创建我的绘画方法。我想在这个玻璃窗格上绘制矩形使用鼠标拖动。我必须在哪里实现paint方法?在其他班级还是在这个事件中?我实现了一个try paint函数,但我不知道这是不是一个好方法。这是我的代码:
public class Selection extends JPanel
{
static Point startPoint;
public static void GUI()
{
final JFrame frame = new JFrame();
JPanel panel = new JPanel();
JButton button = new JButton("Select");
final JPanel glassPane = new JPanel();
frame.setSize(400, 300);
frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
panel.add(button);
glassPane.setOpaque(false);
frame.add(panel);
frame.setGlassPane(glassPane);
glassPane.addMouseListener(new MouseAdapter()
{
@Override
public void mousePressed(MouseEvent e)
{
super.mousePressed(e);
System.out.println("f.getGlassPane() mousePressed");
if(e.getButton() == MouseEvent.BUTTON1)
frame.getGlassPane().setVisible(true);
startPoint=e.getPoint();
Graphics2D g = null;
Graphics2D g2 = (Graphics2D) g;
Rectangle2D rect = new Rectangle2D.Double();
rect.setFrameFromDiagonal(e.getPoint().x, e.getPoint().y,startPoint.x, startPoint.y);
g2.setComposite(AlphaComposite.getInstance(AlphaComposite.SRC_OVER, 0.5F));
g2.setColor(Color.BLUE);
g2.fill(rect);
g2.draw(rect);
}
});
glassPane.addMouseMotionListener(new MouseMotionListener() {
@Override
public void mouseDragged(MouseEvent e)
{
}
@Override
public void mouseMoved(MouseEvent e) {
// TODO Auto-generated method stub
}
});
frame.addMouseListener(new MouseAdapter()
{
@Override
public void mousePressed(MouseEvent e)
{
super.mousePressed(e);
if(e.getButton() == MouseEvent.BUTTON1)
frame.getGlassPane().setVisible(true);
}
public void mouseReleased(MouseEvent e)
{
frame.getGlassPane().setVisible(false);
}
});
frame.setVisible(true);
}
int x1, x2, y1,y2;
public void paintComponent(Graphics g)
{
Graphics2D g2 = (Graphics2D)g;
g2.drawRect(x1,y1, x2, y2);
}
public static void main(String[] args)
{
GUI();
}
}发布于 2011-05-13 18:15:44
嗨,请check out my answer to some other question,在这里我介绍了一种方法,其中玻璃窗格可以用来模拟对话行为。在这里,您已经展示了如何在鼠标单击时显示它和隐藏它,在我的例子中,鼠标右键单击。这个例子应该会让你有个好的开始。
发布于 2011-05-13 18:16:01
我认为在moussePressed()方法中创建glasspane并将其附加到RootPaneContainer是没有问题的。
然而,我可能想知道为什么每次用户单击鼠标时都要创建一个新的玻璃窗格;这不会有很好的性能;更明智的做法可能是在前面创建并附加一个玻璃窗格,然后在鼠标单击期间更改其内容)。
现在,关于“在玻璃窗格上绘制”,这取决于您所说的“绘制”是什么意思,如果这意味着使用"Graphics“实例直接在玻璃窗格上绘制,答案是否定的(好吧,实际上您可以,但是,您的绘画将在第一次UI刷新时消失……)
这样绘制必须发生在您的玻璃窗格的paintComponent()方法中(您必须覆盖该方法)。
https://stackoverflow.com/questions/5990113
复制相似问题