코드의 다음 스 니펫은 이어야합니다.은 첫 번째 모니터의 투명한 배경에 카운터를 증가시킵니다. 이미지가 0으로 표시되면 렌더링은 잘되지만 그 후에 (1을 치 자마자) 창은 불투명 한 배경으로 다시 그립니다.투명 이미지를 지우지 않는 Graphics2D
실제로 실례가되는 바보 같은 예를 들자면, 실제 사용 사례가 단순한 코드 조각으로 바뀌 었습니다.
키가 TestCanvas의의 paintComponent 방법에있을 수 있습니다 것 같다
g.setColor(new Color(0, 0, 0, 0));
g.clearRect(0, 0, getWidth(), getHeight());
내가 운동을 할 수 있는지, 그 두 줄은 완전히 투명하게, 그와 함께 주어진 영역을 취소 도면 색상을 설정해야합니다에서 색깔 - 그러나 이것은 첫번째 repaint 저쪽에를 위해 보전되고 있지 않는 것을 보인다.
편집 : clearRect 대신 fillRect를 사용하면 기존 이미지 위에 투명한 사각형을 칠하기 때문에 clearRect가 삭제되지 않습니다. 도 1에서, (1) 상에 오버레이 후 2,0에 오버레이되는 등
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();
}
}
이상하게도 솔루션은 Windows에서는 작동하지만 Ubuntu에서는 작동하지 않습니다. :( – ferrerverck