2009-09-06 114 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