我有以下的代码片段,应该可以在第一个监视器上的透明背景上增加计数器。当图像显示0时,它会正常渲染,但之后(一旦命中1),窗口将以不透明背景重绘。
实际上,这只是个愚蠢的例子,我只是把一个真实的用例简化成了更简单的代码块。
看来关键可能在TestCanvas的paintComponent方法中。
根据我的理解,这两行代码应该将绘图颜色设置为完全透明,然后用该颜色清除给定区域的内容。但是,似乎在第一次重绘之后就不再生效了。
编辑:使用fillRect而不是clearRect无法解决问题,因为它只是在现有图像上绘制透明矩形,所以它永远不会被清除。1覆盖在0上,然后2覆盖在1上,依此类推。
实际上,这只是个愚蠢的例子,我只是把一个真实的用例简化成了更简单的代码块。
看来关键可能在TestCanvas的paintComponent方法中。
g.setColor(new Color(0, 0, 0, 0));
g.clearRect(0, 0, getWidth(), getHeight());
根据我的理解,这两行代码应该将绘图颜色设置为完全透明,然后用该颜色清除给定区域的内容。但是,似乎在第一次重绘之后就不再生效了。
编辑:使用fillRect而不是clearRect无法解决问题,因为它只是在现有图像上绘制透明矩形,所以它永远不会被清除。1覆盖在0上,然后2覆盖在1上,依此类推。
import java.awt.Color;
import java.awt.Dimension;
import java.awt.Graphics;
import java.awt.GraphicsEnvironment;
import java.awt.Rectangle;
import javax.swing.JPanel;
import javax.swing.JWindow;
import javax.swing.SwingUtilities;
public class LyricWindow extends JWindow {
private final TestCanvas canvas;
public LyricWindow(Rectangle area, boolean stageView) {
setBackground(new Color(0, 0, 0, 0));
setArea(area);
canvas = new TestCanvas();
canvas.setPreferredSize(new Dimension((int) (area.getMaxX() - area.getMinX()), (int) (area.getMaxY() - area.getMinY())));
add(canvas);
new Thread() {
public void run() {
for(int i = 0; true; i++) {
final int ii = i;
SwingUtilities.invokeLater(new Runnable() {
@Override
public void run() {
canvas.setText(Integer.toString(ii));
}
});
try {
Thread.currentThread().sleep(200);
}
catch(InterruptedException ex) {}
System.out.println(ii);
}
}
}.start();
}
public final void setArea(final Rectangle area) {
SwingUtilities.invokeLater(new Runnable() {
@Override
public void run() {
if(canvas != null) {
canvas.setPreferredSize(new Dimension((int) (area.getMaxX() - area.getMinX()), (int) (area.getMaxY() - area.getMinY())));
}
setSize((int) (area.getMaxX() - area.getMinX()), (int) (area.getMaxY() - area.getMinY()));
setLocation((int) area.getMinX(), (int) area.getMinY());
}
});
}
public static void main(String[] args) {
LyricWindow w = new LyricWindow(GraphicsEnvironment.getLocalGraphicsEnvironment().getScreenDevices()[0].getConfigurations()[0].getBounds(), false);
w.setVisible(true);
}
}
class TestCanvas extends JPanel {
private String text;
@Override
public void paintComponent(Graphics g) {
g.setColor(new Color(0, 0, 0, 0));
g.clearRect(0, 0, getWidth(), getHeight());
g.setColor(Color.RED);
g.drawString(text, 100, 100);
}
public void setText(String s) {
text = s;
repaint();
}
}