我有这个代码来绘制一个特定的String(和一个特定的Color),具体取决于布尔方法的结果(CSGOBot#isRecording()
)。我使用JPanel#paintComponent(Graphics)
方法绘制String,并使用另一个线程重新绘制。
线程的run
方法:
@Override
public void run() {
while (true) {
frame.repaint(); // This is the JPanel, not the JFrame
}
}
JPanel扩展类:
public class FrameDisplay extends JPanel {
public FrameDisplay() throws HeadlessException {
this.setSize(300, 100);
this.setBackground(new Color(0, 0, 0, 0));
this.setVisible(true);
}
@Override
public void paintComponent(Graphics g1) {
super.paintComponent(g1);
Graphics2D g = (Graphics2D)g1;
g.setColor(CSGOBot.isRecording() ? Color.RED : Color.GREEN);
g.setFont(g.getFont().deriveFont(14f).deriveFont(Font.BOLD));
g.drawString(CSGOBot.isRecording() ? "RECORDING (Alt+R to Stop)" : "Record on hold (Alt+R to Start)", 5, 10);
}
}
但是,paintComponent方法不会自行清除,并且当布尔值更改时,字符串会自行绘制。这是结果的屏幕截图:
我正在尝试避免使用clearRect
方法,因为它会清除对面板/框架所做的任何样式。
答案 0 :(得分:2)
问题是,您已使用Alpha值new Color(0, 0, 0, 0)
Swing仅处理由opaque
属性
基本上,使用基于alpha的颜色意味着当组件尝试填充其背景时,它没有使用任何东西,但更重要的是,Swing不知道它应该在组件下绘制,从而导致更多绘画问题
而不是setBackground
,请使用setOpaque(false)