Java 将jpanel清除为透明

Java 将jpanel清除为透明,java,swing,transparency,Java,Swing,Transparency,我画了一个三角形。我的目的是将三角形旋转到用户选择的任意角度。现在为了能够旋转三角形而不让它看起来被裁剪,我需要一个比三角形大的JPanel。为了实现这一切,我的paintcomponent如下所示: @Override protected void paintComponent(Graphics g) { super.paintComponent(g); Path2D p = new Path2D.Float(); p.moveTo(getWidth() / 4, ge

我画了一个三角形。我的目的是将三角形旋转到用户选择的任意角度。现在为了能够旋转三角形而不让它看起来被裁剪,我需要一个比三角形大的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上绘制了一个绿色三角形。问题是我想在旋转三角形时保持JPANE的透明度。我知道如果我想重新绘制JPanel,而不是以新旧内容结束,我应该清除JPanel的内容,但是我看到的所有响应都要求使用
clearRect
,这在这里不起作用
clearRect
将使用背景色进行绘制,使JPanel不透明。我不能重新初始化图形组件并再次绘制吗

现在,试着用这样的东西来设置背景

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));
但我不知道如何使用合成选项,我一直使三角形透明,而不是背景

这将创建具有
clearRect()
和黑色背景的版本: 软件包点击返回

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);
        this.addMouseListener(new MouseAdapter() {
            @Override
            public void mousePressed(MouseEvent e) {
                rotationAngle += 10;
                me.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();
    }
}


Axel

您是否尝试将背景颜色设置为“空”


使用
setOpaque
并将其传递给
false
,这将使组件透明,并让绘制引擎知道需要特别注意绘制组件,如正确清除
图形
上下文并在其下方绘制

在代码中没有什么特别的事情需要做,只需像平常一样继续绘制,API就会处理其余的事情

import java.awt.Color;
import java.awt.Dimension;
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 static javax.swing.JFrame.EXIT_ON_CLOSE;
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");
        setDefaultCloseOperation(EXIT_ON_CLOSE);
        getContentPane().setBackground(Color.RED);
        add(new Entry());
        pack();
        setDefaultCloseOperation(EXIT_ON_CLOSE);
    }

    class Entry extends JPanel {

        private int rotationAngle;

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

        @Override
        public Dimension getPreferredSize() {
            return new Dimension(200, 200);
        }



        @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.setColor(Color.GREEN);

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

}


正如我在评论中提到的,将图形JPanel上的不透明设置为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();
   }
}

既不
g2d.setBackground(空);clearRect(0,0,getWidth(),getHeight())
g2d.setBackground(新颜色(0,0,0,0));clearRect(0,0,getWidth(),getHeight());g2d.倒退(空)工作。第一个将整个内容涂成绿色,另一个保留黑色背景您可能希望删除不再相关的评论。澄清一下:你现在做什么你不想做的?你希望它做什么,它不做什么?使JPanel非不透明有帮助吗?i、 e.
set不透明(假)而不是像你现在做的那样为真。我想要的是背景是透明的。我想要一种画三角形的方法,并在它的中心上旋转。我遇到的问题是,如果我不清除背景,三角形的旧版本会保留下来(因此,如果我旋转90度和-90度,我最终会得到90度和-90度的叠加),但如果我这样做,我最终会得到一个不透明的背景。现在,如果我说yes
setOpaque(false),我会显得多么愚蠢是否修复了它…-\u-我猜在我做的其他事情的测试中它不起作用。介意回答一下吗?这样我就可以给你评分了?
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();
   }
}