2015-07-11 3 views
3

У меня есть этот код, чтобы нарисовать конкретную строку (и определенный цвет), в зависимости от результата логического метода(). Я использую метод JPanel#paintComponent(Graphics) для рисования строки, и я использую другой поток для перерисовки.Метод drawString() перезаписывает предыдущие рисунки (paintComponent не очищается)

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, так как она очищает любые стили, внесенные в панели/кадр.

ответ

2

Проблема, вы указали фон с альфа-значением, new Color(0, 0, 0, 0)

свинга имеет дело только с прозрачными или непрозрачными компонентами, задаются opaque свойством

В основном, с использованием альфа основанный на цвета означает, что когда компонент пытается заполнить его фон, он ничего не использует, но, что более важно, Swing не знает, что он должен рисовать под компонентом, вызывая дополнительные проблемы с окраской.

Вместо setBackground используйте setOpaque(false)