将jpanel清除为透明

时间:2014-11-16 15:55:57

标签: java swing transparency

所以,我有一个JPanel,我绘制一个三角形。我的意图是将三角形转换为用户选择的任意角度。现在,为了能够旋转三角形而不使其看起来被裁剪,我需要一个大于三角形的JPanel。所以要实现这一切,我的paintcomponent看起来像这样:

@Override
protected void paintComponent(Graphics g) {
    super.paintComponent(g);
    Path2D p = new Path2D.Float();
    p.moveTo(getWidth() / 4, getHeight() / 4);
    p.lineTo(getWidth()-(getWidth() / 4), getHeight() / 2);
    p.lineTo(getWidth() / 4, getHeight()-(getHeight() / 4));
    p.closePath();

    Graphics2D g2d = (Graphics2D) g.create();
    g2d = (Graphics2D) g.create();
    g2d.setColor(Color.GREEN);


    g2d.rotate(Math.toRadians(rotationAngle), getWidth() / 2, getHeight() / 2);
    g2d.fill(p);
    g2d.dispose();
}

它有效,但不是我想要的。现在,它在透明的JPanel上绘制了一个绿色三角形。问题是我想在旋转三角形时保持JPanes的透明度。我知道我应该清除JPanel的内容,如果我想重新绘制JPanel而不是最终的新旧内容,但我已经看到的所有响应都要求使用{{1哪个在这里不起作用。 clearRect将使用背景颜色绘制,使JPanel不透明。我不能重新初始化图形组件并再次绘制?

现在,尝试使用类似

的方式设置背景
clearRect

结束只是制作黑色背景,看起来更有希望的东西可能是这样的:

g2d.setBackground(new Color(0,0,0,0));
g2d.clearRect(0,0, getWidth(), getHeight());

但我不知道如何使用复合选项,我一直让三角形透明而不是背景

这应该创建具有g2d.setRenderingHint( RenderingHints.KEY_ANTIALIASING, RenderingHints.VALUE_ANTIALIAS_ON); g2d.setComposite(AlphaComposite.getInstance( AlphaComposite.SRC_OVER, 0.3f)); 和黑色背景的版本: 包clicknturn;

clearRect()

泰!

阿克塞尔

3 个答案:

答案 0 :(得分:3)

您是否尝试将背景颜色设置为" null"?

g2d.setBackground(null);

答案 1 :(得分:2)

正如我在评论中提到的,在你的绘图JPanel上设置opaque为false似乎可以解决你的问题。

这是我几个小时前创建的程序来测试它:

import java.awt.Color;
import java.awt.EventQueue;
import java.awt.Graphics;
import java.awt.Graphics2D;
import java.awt.GridBagLayout;
import java.awt.event.MouseAdapter;
import java.awt.event.MouseEvent;
import java.awt.geom.Path2D;
import javax.swing.JFrame;
import javax.swing.JPanel;

public class ClickNTurn extends JFrame {

   public static void main(String[] args) {
      EventQueue.invokeLater(new Runnable() {
         @Override
         public void run() {
            ClickNTurn ex = new ClickNTurn();
            ex.setVisible(true);
         }
      });
   }

   public ClickNTurn() {

      setTitle("Simple example");
      setSize(500, 500);
      setLocationRelativeTo(null);
      setDefaultCloseOperation(EXIT_ON_CLOSE);
      Entry tmpEntry = new Entry();
      JPanel container = new JPanel();
      container.setBackground(Color.GRAY);
      container.setLayout(null);
      this.add(container);
      container.add(new Entry());
   }

}

class Entry extends JPanel {

   private int rotationAngle;

   public Entry() {
      this.setBounds(10, 10, 200, 200);
      this.setSize(200, 200);
      // !! Entry me = this;
      rotationAngle = 0;
      setLayout(new GridBagLayout());
      //!! setOpaque(true);
      setOpaque(false); //!!
      this.addMouseListener(new MouseAdapter() {
         @Override
         public void mousePressed(MouseEvent e) {
            rotationAngle += 10;
            // !! me.repaint();
            repaint();
         }
      });
   }

   @Override
   protected void paintComponent(Graphics g) {
      super.paintComponent(g);
      Path2D p = new Path2D.Float();
      p.moveTo(getWidth() / 4, getHeight() / 4);
      p.lineTo(getWidth() - (getWidth() / 4), getHeight() / 2);
      p.lineTo(getWidth() / 4, getHeight() - (getHeight() / 4));
      p.closePath();

      Graphics2D g2d = (Graphics2D) g.create();
      g2d = (Graphics2D) g.create();
      g2d.setColor(Color.GREEN);
      // g2d.setBackground(new Color(0, 0, 0, 0));

      //  g2d.clearRect(0, 0, getWidth(), getHeight());
      g2d.setBackground(null);

      g2d.rotate(Math.toRadians(rotationAngle), getWidth() / 2, getHeight() / 2);
      g2d.fill(p);
      g2d.dispose();
   }
}

答案 2 :(得分:1)

使用setOpaque并传递false,这将使组件透明,并让绘制引擎知道需要特别小心地绘制它,例如清除{{1}正确的上下文和在它下面绘画。

您的代码中没有什么特别的需要,只需像往常一样继续绘画,API将负责其余的工作

Example

Graphics