gpt4 book ai didi

java - 清理图形 清理所有图形

转载 作者:行者123 更新时间:2023-12-01 11:21:14 25 4
gpt4 key购买 nike

我的 Java 图形有一点问题,我有我的特殊 JComponent,一个纹理按钮。当鼠标打开时,按钮变得有点亮(它被半透明的白色填充),但图形没有被清理,因此透明白色在组件上形成全白色背景,即使鼠标处于打开状态也是如此不在按钮上。它看起来像这样:

My bugged button

所以我找到了一个解决方案,我添加了这个:

super.paintComponent(g);

// Clearing
((Graphics2D) g).setComposite(AlphaComposite.getInstance(AlphaComposite.SRC));
g.setColor(Swinger.TRANSPARENT);
g.fillRect(0, 0, this.getWidth(), this.getHeight());

在我的组件 PaintComponent 方法上,它有效!但是,它不仅仅清理按钮背景,它还清理其后面的所有内容!没有按钮时看起来像这样:

Without the button

并使用按钮:

With the button

您可以在后台看到 IDEA。

这是我的代码(请参阅 fr.theshark34.swinger.textured.STexturedButton 类): https://github.com/TheShark34/Swinger

最佳答案

您似乎对 Swing 中的绘画工作原理缺乏了解或存在误解,无论哪种情况,都有点可怕。

您可能想仔细看看 Painting in AWT and SwingPerforming Custom Painting有关 Swing 中绘画工作原理的更多详细信息

在您的 STexturedButton 类中,您不需要执行...

((Graphics2D) g).setComposite(AlphaComposite.getInstance(AlphaComposite.SRC));
g.setColor(Swinger.TRANSPARENT);
g.fillRect(0, 0, this.getWidth(), this.getHeight());

因为 Swing 已经(基本上)为您完成了它(因为 STexturedButton 从您的 AbstractButton 类扩展,而该类又从 JComponent 扩展,默认情况下是透明的,如果组件不透明,那么您所做的事情就会很危险,并且会导致无穷无尽的额外奇怪的绘画制品。

所以在我的测试中,我只是把它拿出来。

此外,我更愿意覆盖 getPreferredSize 而不是提供您自己的 setBounds 方法,这对于开始来说很令人困惑(因为组件已经有它自己的 setBounds 方法并使用 getPreferredSize 与现有的 Swing API 配合良好)

由于您没有提供任何类型的可运行示例,因此我必须自己制作,但这些更改对我来说效果很好。

Normal Highlighted

import fr.theshark34.swinger.textured.STexturedButton;
import java.awt.Color;
import java.awt.EventQueue;
import java.awt.Graphics;
import java.awt.Graphics2D;
import java.awt.GridBagLayout;
import java.awt.LinearGradientPaint;
import java.awt.Point;
import java.awt.Rectangle;
import java.io.IOException;
import javax.imageio.ImageIO;
import javax.swing.JFrame;
import javax.swing.JPanel;
import javax.swing.UIManager;
import javax.swing.UnsupportedLookAndFeelException;

public class Main {

public static void main(String[] args) {
new Main();
}

public Main() {
EventQueue.invokeLater(new Runnable() {
@Override
public void run() {
try {
UIManager.setLookAndFeel(UIManager.getSystemLookAndFeelClassName());
} catch (ClassNotFoundException | InstantiationException | IllegalAccessException | UnsupportedLookAndFeelException ex) {
ex.printStackTrace();
}

JFrame frame = new JFrame("Testing");
frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
frame.add(new TestPane());
frame.pack();
frame.setLocationRelativeTo(null);
frame.setVisible(true);
}
});
}

public class TestPane extends JPanel {

public TestPane() {
setLayout(new GridBagLayout());

try {
STexturedButton btn = new STexturedButton(ImageIO.read(getClass().getResource("/Pony.png")));
add(btn);
} catch (IOException ex) {
ex.printStackTrace();
}
}

@Override
protected void paintComponent(Graphics g) {
super.paintComponent(g);
LinearGradientPaint lgp = new LinearGradientPaint(
new Point(0, 0),
new Point(0, getHeight()),
new float[]{
0.1428571428571429f,
0.2857142857142858f,
0.4285714285714287f,
0.5714285714285716f,
0.7142857142857145f,
0.8571428571428574f,
1f
},
new Color[]{Color.RED, Color.ORANGE, Color.GREEN, Color.YELLOW, Color.BLUE, Color.MAGENTA, Color.PINK}
);
Graphics2D g2d = (Graphics2D) g.create();
g2d.setPaint(lgp);
g2d.fill(new Rectangle(0, 0, getWidth(), getHeight()));
g2d.dispose();
}

}

}

现在有一个工作透明窗口示例

Transparent Panel and Window

import fr.theshark34.swinger.textured.STexturedButton;
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.LinearGradientPaint;
import java.awt.Point;
import java.awt.Rectangle;
import java.io.IOException;
import javax.imageio.ImageIO;
import javax.swing.JFrame;
import javax.swing.JPanel;
import javax.swing.UIManager;
import javax.swing.UnsupportedLookAndFeelException;
import javax.swing.border.LineBorder;

public class Main {

public static void main(String[] args) {
new Main();
}

public Main() {
EventQueue.invokeLater(new Runnable() {
@Override
public void run() {
try {
UIManager.setLookAndFeel(UIManager.getSystemLookAndFeelClassName());
} catch (ClassNotFoundException | InstantiationException | IllegalAccessException | UnsupportedLookAndFeelException ex) {
ex.printStackTrace();
}

JFrame frame = new JFrame("Testing");
frame.setUndecorated(true);
frame.setBackground(new Color(0, 0, 0, 0));
frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
frame.add(new TestPane());
frame.pack();
frame.setLocationRelativeTo(null);
frame.setVisible(true);
}
});
}

public class TestPane extends JPanel {

public TestPane() {
setLayout(new GridBagLayout());
setOpaque(false);

try {
STexturedButton btn = new STexturedButton(ImageIO.read(getClass().getResource("/Pony.png")));
add(btn);
} catch (IOException ex) {
ex.printStackTrace();
}

setBorder(new LineBorder(Color.RED));
}

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

}

}

关于java - 清理图形 清理所有图形,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/31204913/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com