2011-09-10 68 views
5

Tôi có thể làm cho JFrame hoàn toàn trong suốt và JButton là một phần trong suốt tốt cho đến khi tôi di chuyển chuột vào nút (không nhấp) và di chuyển chuột ra khỏi nút (MouseExited được gọi qua MouseListener). Điều gì xảy ra là nền của JButton được vẽ một lần nữa, do đó, sau vài lần di chuyển chuột và tắt nút, nút này hoàn toàn mờ đục.Làm thế nào để tạo JButton một phần trong suốt trên JFrame hoàn toàn trong suốt?

public class ButtonExample extends JWindow 
{ 
    public ButtonExample() 
    { 
     JButton But = new JButton("Testing"); 
     But.setBackground(new Color(0, 0, 0, 200)); 
     But.setForeground(new Color(70, 155, 255)); 
     this.add(But); 
     this.setBackground(new Color(0, 0, 0, 0)); 
     this.setMinimumSize(new Dimension(200,100)); 
     this.setVisible(true); 
    } 

    public static void main(String[ ] Args) 
    { 
     new ButtonExample(); 
    } 
} 
+0

Để được trợ giúp tốt hơn sớm hơn, hãy đăng một [SSCCE] (http://pscode.org/sscce.html). –

+3

Mua [Filthy Rich Clients] (http://filthyrichclients.org/) bởi Haase và Guy. Nó đi vào tất cả các chi tiết bạn cần để làm các thành phần trong suốt và sau đó một số. Trong tất cả một cuốn sách ** tuyệt vời ** cho các lập trình viên Java Swing. –

Trả lời

8

vấn đề là các báo cáo nút là hoàn toàn mờ đục trong khi thực tế nó không phải là (do màu sắc một phần trong suốt)

but.setOpaque(false); 

BTW: như bạn thấy tôi đã thay đổi tên trường để phù hợp với java đặt tên ước :-)

Sửa

arggghh .. nhỡ rằng, xin lỗi. Cần phải kiểm tra những gì chúng ta làm trong SwingX, từ đỉnh đầu của tôi, tôi sẽ nói rằng bạn cần phải ghi đè paintComponent và xử lý nền vẽ chính mình, như

 /** 
     * @inherited <p> 
     */ 
     @Override 
     protected void paintComponent(Graphics g) { 
      if (!isOpaque() && getBackground().getAlpha() < 255) { 
       g.setColor(getBackground()); 
       g.fillRect(0, 0, getWidth(), getHeight()); 
      } 
      super.paintComponent(g); 
     } 

đã không cố gắng, tuy nhiên, có thể "nhận được nhiều hơn đục" là trở lại một lần nữa với làm như vậy .. sẽ trở lại vào ngày mai

chỉnh sửa 2

okay, kiểm tra - mã thay đổi nội dung hoạt động chính xác. Vì vậy, trong bản tóm tắt: các thành phần với nền mờ

  • phải báo cáo rằng họ không đục để không nhầm lẫn giữa cơ chế sơn mặc định
  • phải tiến hành sơn nền và điền nó với màu nền tự (SwingX JXPanel fi không hỗ trợ rõ ràng cho một tài sản alpha)

thuận tiện cho bạn, đây là một Runnable nhỏ với sai/đúng nền side-by-side

public class TransparentButton { 

    public TransparentButton() { 
     JWindow incorrectOpaque = createWindow("incorrect opaque", true); 
     incorrectOpaque.setLocation(600, 600); 
     incorrectOpaque.setVisible(true); 
     JWindow correctOpaque = createWindow("correct opaque", false); 
     correctOpaque.setLocation(800, 600); 
     correctOpaque.setVisible(true); 
    } 


    private JButton createButton(final boolean opaque) { 
     JButton but = new JButton("Testing") { 

      /** 
      * @inherited <p> 
      * Overridden to take over background painting with 
      * transparent color. 
      */ 
      @Override 
      protected void paintComponent(Graphics g) { 
       if (!isOpaque() && getBackground().getAlpha() < 255) { 
        g.setColor(getBackground()); 
        g.fillRect(0, 0, getWidth(), getHeight()); 
       } 
       super.paintComponent(g); 
      } 

     }; 
     but.setBackground(new Color(0, 0, 0, 100)); 
     but.setForeground(new Color(70, 155, 255)); 
     but.setOpaque(opaque); 
     return but; 
    } 

    private JWindow createWindow(String text, boolean opaque) { 
     JWindow window = new JWindow(); 
     JButton but = createButton(opaque); 
     window.add(but); 
     window.add(new JLabel(""), BorderLayout.SOUTH); 
     window.setOpacity(0.5f); 
     window.setBackground(new Color(0, 0, 0, 0)); 
     window.setSize(new Dimension(200, 100)); 
     return window; 
    } 

    public static void main(String[] Args) { 
     SwingUtilities.invokeLater(new Runnable() { 
      @Override 
      public void run() { 

       new TransparentButton(); 
      } 
     }); 
    } 

    @SuppressWarnings("unused") 
    private static final Logger LOG = Logger.getLogger(TransparentButton.class 
      .getName()); 
} 
+0

Bằng cách thiết lập mờ đục nền nút được hoàn toàn minh bạch (không sơn) mà không phải là những gì tôi muốn ở tất cả. Bạn có thể hỗ trợ thêm cho tôi để có được nền để hiển thị khi opaque là sai? – Pete

+0

Một giải pháp hoàn hảo, cảm ơn rất nhiều. – Pete

0

Bạn đã thử translucency chưa?

Lần đầu tiên, translucent and shaped window API được thêm vào bản phát hành Java SE 6 Update 10 dưới dạng API riêng tư. Chức năng này đã được chuyển sang gói AWT công khai trong bản phát hành JDK 7.

Tôi nghĩ rằng các liên kết ở trên có thể giúp bạn.

+0

Không có vấn đề gì khi làm cho cửa sổ trong suốt. Việc sửa chữa sẽ làm thế nào có thể bao gồm sửa đổi các bức tranh của thành phần (JButton trong trường hợp này) chính nó và không liên quan đến cửa sổ thẳng. – Pete

+0

hehehe ... ya, đúng thế! – gumuruh

Các vấn đề liên quan