2011-05-13 129 views
2

我有一个问题。我可以在身体的MousePressed中创建glasspane吗?如果是的话,任何人都可以写我如何?我的意思是我按下鼠标按钮,玻璃窗格可见,我可以在他身上绘画。创建玻璃板

编辑

好吧我现在有我想要的。当我释放这个按钮时,我的玻璃窗格正在创建,当我点击鼠标按钮并消失时。现在我有另一个问题。我应该在哪里创作我的绘画方法。我想用拖动的鼠标在这个玻璃窗格上绘制矩形。我必须在哪里实施涂料方法?在其他课堂或在这个事件?我实现了一个我的尝试绘图函数,但我不知道这是否是好方法。这是我的代码:

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(); 
    } 

} 
+0

你问过之前试过吗? – jfpoilpret 2011-05-13 10:10:26

+0

是的,我认为我必须创建方法,我将实现绘画方法,并在框架中创建玻璃窗格并添加鼠标侦听器。那是好方法? – edi233 2011-05-13 10:14:01

+0

请参阅下面的答案。通常情况下,你会:创建你的框架,添加内容(正常内容:标签,文本字段...),设置一个玻璃窗格并附加一个MouseListener。 – jfpoilpret 2011-05-13 10:17:43

回答

2

你好,请check out my answer to some other question,我提出在玻璃板可以用来模拟对话的行为方式。在这里你已经展示了如何显示它,并在鼠标右键点击鼠标的时候隐藏它。这个例子应该让你很好地开始。

+0

你的例子帮助我开始。谢谢:) – edi233 2011-05-13 10:36:42

+0

@ edi233乐意帮忙。请享用。 :) – Boro 2011-05-13 10:37:50

1

我看到没有问题创建一个glasspane并从moussePressed()方法附加到RootPaneContainer

但是,我想知道为什么每次用户单击鼠标时都要创建一个新的玻璃窗格;那不会是非常高效的;它可能是更聪明的创建和附加一个玻璃窗格,然后在鼠标点击期间更改其内容)。

现在,关于“画在玻璃板”,这取决于你的意思是“清明上河图”是什么,如果这意味着使用“Graphics”实例直接绘制在玻璃板,答案是NO(好吧,其实你可以,但你的绘画会在第一次UI刷新时消失...)

这样的绘画必须发生在你的玻璃窗格的方法(你必须重写)。

+0

我想使用Graphics2D在玻璃窗格上使用mouseDragged绘制矩形。我的想法是: 1)我点击鼠标按钮,我的玻璃窗格可见。 2)我用鼠标拖动绘制矩形。 3)当我释放鼠标按钮我的玻璃窗格disapear。我想要实时绘制矩形并使用mousedragged更改其大小 – edi233 2011-05-13 10:32:26

+0

然后,您必须在mouseDragged期间记录鼠标坐标并强制重新窗格的重绘()。你仍然需要重写paintComponent()。 – jfpoilpret 2011-05-13 11:21:09