2011-05-25 75 views
1

我有繪畫的一個問題。我有一個按鈕框架。使用鼠標,我畫了一個多變的矩形。但是我有一個小問題,因爲當繪製這個矩形時,它會在按鈕後面繪製,我希望這個矩形位於按鈕之上。的Java Swing和繪圖問題

這是截圖:

這是代碼:

package draw; 

import java.awt.*; 
import java.awt.event.*; 
import java.util.ArrayList; 
import java.util.List; 
import javax.swing.*; 
import javax.swing.event.*; 


public class Selection extends JPanel 
    implements ChangeListener { 

    /** 
    * 
    */ 
    private static final long serialVersionUID = 1L; 
    private static final int WIDE = 640; 
    private static final int HIGH = 640; 
    private List<Node> nodes = new ArrayList<Node>(); 
    private Point mousePt = new Point(WIDE/2, HIGH/2); 
    private Rectangle mouseRect = new Rectangle(); 
    private boolean selecting = false; 

    public static void main(String[] args) throws Exception { 
     EventQueue.invokeLater(new Runnable() { 

      public void run() { 
       JFrame f = new JFrame("GraphPanel"); 
       f.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); 
       Selection gp = new Selection(); 
       f.add(new JScrollPane(gp), BorderLayout.CENTER);     
       f.pack(); 
       f.setVisible(true); 
      } 
     }); 
    } 

    Selection() { 
     JButton but=new JButton("Button"); 
     add(but); 

     this.setPreferredSize(new Dimension(WIDE, HIGH));  
     this.addMouseListener(new MouseHandler()); 
     this.addMouseMotionListener(new MouseMotionHandler()); 
    } 

    @Override 
    public void paintComponent(Graphics g) { 
     g.setColor(new Color(0x00f0f0f0)); 
     g.fillRect(0, 0, getWidth(), getHeight()); 


      g.setColor(Color.BLACK); 
      ((Graphics2D) g).setComposite(AlphaComposite.getInstance(rule, alpha)); 
      g.fillRect(mouseRect.x, mouseRect.y, 
        mouseRect.width, mouseRect.height); 

      g.drawRect(mouseRect.x, mouseRect.y, 
       mouseRect.width, mouseRect.height); 

    } 
    int rule = AlphaComposite.SRC_OVER; 
    float alpha = 0.85F; 


    private class MouseHandler extends MouseAdapter { 

     @Override 
     public void mouseReleased(MouseEvent e) { 
      selecting = false; 
      mouseRect.setBounds(0, 0, 0, 0); 
      if (e.isPopupTrigger()) { 

      } 
      e.getComponent().repaint(); 
     } 

     @Override 
     public void mousePressed(MouseEvent e) { 
      mousePt = e.getPoint(); 

       Node.selectNone(nodes); 
       selecting = true;   
      e.getComponent().repaint(); 
     }  
    } 

    private class MouseMotionHandler extends MouseMotionAdapter { 


     @Override 
     public void mouseDragged(MouseEvent e) { 
      if (selecting) { 
       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(); 
     } 
    } 



    /** A Node represents a node in a graph. */ 
    private static class Node { 

     private Color color; 

     private boolean selected = false; 
     private Rectangle b = new Rectangle(); 

     /** Draw this node. */ 
     public void draw(Graphics g) { 
      g.setColor(this.color); 

      if (selected) { 
       g.setColor(Color.darkGray); 
       g.drawRect(b.x, b.y, b.width, b.height); 
      } 
     } 




     /** Mark this node as slected. */ 
     public void setSelected(boolean selected) { 
      this.selected = selected; 
     } 

     /** Select no nodes. */ 
     public static void selectNone(List<Node> list) { 
      for (Node n : list) { 
       n.setSelected(false); 
      } 
     } 
    } 



    @Override 
    public void stateChanged(ChangeEvent arg0) { 
     // TODO Auto-generated method stub 

    } 

} 

我怎樣才能解決這個問題?

+0

添加矩形第一個可能的工作! – Treemonkey 2011-05-25 08:43:13

回答

1

通常,自定義繪畫是通過覆蓋paintComponent()方法完成的。所以繪畫順序是繪製組件,然後繪製孩子。所以按鈕被繪製在矩形的頂部。

在你想要孩子後要塗矩形,這樣就可以通過覆蓋paint()方法做到這一點這種情況下。現在面板和它的孩子將被繪製。然後你的矩形將被繪製,以便它被繪製在按鈕的頂部。

所以你的基本代碼應該是:

@Override 
    public void paint(Graphics g) 
    { 
     super.paint(g); // added this 

     g.setColor(new Color(0x00f0f0f0)); 
//  g.fillRect(0, 0, getWidth(), getHeight()); 

     g.setColor(Color.BLACK); 
     ((Graphics2D) g).setComposite(AlphaComposite.getInstance(rule, alpha)); 
     g.fillRect(mouseRect.x, mouseRect.y, mouseRect.width, mouseRect.height); 
     g.drawRect(mouseRect.x, mouseRect.y, mouseRect.width, mouseRect.height); 
    } 
+0

THX,很多。是工作 :) – edi233 2011-05-26 07:05:17

4

你畫是後面的按鈕面板上的矩形。 (沒有辦法讓底層組件在子組件上繪製)。如果矩形應該位於按鈕的頂部,那麼您正在繪製的組件必須位於按鈕的頂部。 (這樣的組件必須是不不透明雖然,因爲如果它是不透明的,它總是覆蓋按鈕,該按鈕將不可見。

我建議你借鑑一些玻璃面板的矩形或什麼東西,它位於整個框架的頂部。

+0

你能告訴我應該如何編輯我的代碼嗎? – edi233 2011-05-25 08:39:55

+3

對不起。沒有時間。在玻璃板上搜索教程,或者在API文檔中查找z-index。 – aioobe 2011-05-25 08:41:09

+0

+1。 – Boro 2011-05-25 08:45:50

2

你爲什麼不進行繪製,在玻璃板,你可以從一個幀獲得。對於如何做到這一點看看the tutorial.

你應該有所有的繪畫代碼放在擴展JPanel的類中,然後創建一個對象並將其設置爲您的框架的玻璃窗,另外,您必須記住將其設置爲可見,因爲它默認爲隱藏。