2009-09-06 107 views
3

那麼標題是相當自我解釋。我想要使​​用java在層中構建兩個面板。我希望頂層包含一個包含graphics2d對象的JPanel。我想讓JPanel和graphics2d都具有透明背景(我仍然希望由graphics2d繪製的內容可見)。有沒有人有一個想法如何做到這一點?如何讓java JPanel和graphics2d透明?

+0

安置自己的SSCCE。我們無法猜測你在做什麼。 – camickr 2009-09-06 21:58:09

回答

5

在JPanel上調用setOpaque(false) - 不會繪製JPanel的背景。

根據您要覆蓋哪些方法來獲得在Graphics2D的(JPanel的不包含 Graphics2D對象就像一個組件 - 一個Graphics2D對象用於繪製的JPanel) - 如果它的paintComponent(),你應該read the JavaDocs for JComponent - 然後先調用super.paintComponent(g),以使不透明度得到滿足 - 然後完成剩下的繪畫。

工作例如:

package com.stackoverflow.opaque; 

import javax.swing.*; 
import java.awt.*; 
import java.awt.event.ActionListener; 
import java.awt.event.ActionEvent; 

public class OpaqueExample extends JFrame { 

    private JLayeredPane layers; 
    private JPanel up, down; 
    private JButton toggleOpaque; 

    public OpaqueExample() { 
     layers = new JLayeredPane(); 

     down = new JPanel(); 
     down.setBackground(Color.GREEN); 
     down.setBounds(100, 100, 200, 200); 
     layers.add(down, new Integer(1)); 

     up = new JPanel() { 
      public void paintComponent(Graphics og) { 
       super.paintComponent(og); 

       Graphics2D g = (Graphics2D)og; 
       GradientPaint gradient = new GradientPaint(0, 0, Color.BLUE, 10, 0, 
          Color.WHITE, true); 

       Polygon poly = new Polygon(); 
       poly.addPoint(10, 10); 
       poly.addPoint(100, 50); 
       poly.addPoint(190, 10); 
       poly.addPoint(150, 100); 
       poly.addPoint(190, 190); 
       poly.addPoint(100, 150); 
       poly.addPoint(10, 190); 
       poly.addPoint(50, 100); 
       poly.addPoint(10, 10); 

       g.setPaint(gradient); 
       g.fill(poly); 

       g.setPaint(Color.BLACK); 
       g.draw(poly); 
      } 
     }; 
     up.setBackground(Color.RED); 
     up.setBounds(150, 150, 200, 200); 
     layers.add(up, new Integer(2)); 

     getContentPane().add(layers, BorderLayout.CENTER); 

     JPanel buttonPanel = new JPanel(new FlowLayout(FlowLayout.CENTER)); 
     toggleOpaque = new JButton("Toggle Opaque"); 
     toggleOpaque.addActionListener(new ActionListener() { 
      public void actionPerformed(ActionEvent e) { 
       up.setOpaque(!up.isOpaque()); 
       layers.repaint(); 
      } 
     }); 
     buttonPanel.add(toggleOpaque); 

     getContentPane().add(buttonPanel, BorderLayout.EAST); 
    } 

    public static void main(String[] args) { 
     JFrame f = new OpaqueExample(); 
     f.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); 
     f.setSize(500, 500); 
     f.setLocationRelativeTo(null); 
     f.setVisible(true); 
    } 
} 
+0

好吧,我只用普通的油漆。 當我測試只嘗試一個沒有graphics2d的jpanel並設置setOpaque(false)它仍然隱藏較低的JPanel。順便說一句,我正在使用JLayeredPane。 – vondip 2009-09-06 19:46:39

+0

您應該重寫paintComponent(),而不是繪製()Swing組件(除了一些特殊情況)。不知道該說些什麼......因爲沒有發佈代碼,我不知道你在做什麼。我會發佈一個很有用的簡單例子。 – Nate 2009-09-07 12:54:04

+0

嗨Nate, 我一直在檢查,如果它可能發送私人消息在這裏。希望以更好的方式感謝你。你的示例代碼很簡單,讓我明白。我正在使用我的graphics2d,並注意到我正在調用clearRect,這使我不斷用白色屏幕。改變這個和調整到你的代碼示例它的工作!再一次,謝謝你。 – vondip 2009-09-07 21:14:14