2011-05-13 124 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