drawString()方法会覆盖以前的绘图(paintComponent不会清除)

时间:2015-07-11 21:36:32

标签: java swing

我有这个代码来绘制一个特定的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方法,因为它会清除对面板/框架所做的任何样式。

1 个答案:

答案 0 :(得分:2)

问题是,您已使用Alpha值new Color(0, 0, 0, 0)

指定了背景

Swing仅处理由opaque属性

指定的透明或非透明组件

基本上,使用基于alpha的颜色意味着当组件尝试填充其背景时,它没有使用任何东西,但更重要的是,Swing不知道它应该在组件下绘制,从而导致更多绘画问题

而不是setBackground,请使用setOpaque(false)