所以,我有一个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()
泰!
阿克塞尔
答案 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将负责其余的工作
Graphics