我有一个奇怪的问题。尝试使用Java swing创建一个透明窗口可以在Java 1.7上运行,但在Java 1.8上失败了。不幸的是,我无法弄清楚如何在那里解决它。 事实上,Graphics.clearRect()适用于1.7,而它不适用于1.8。 我试图实施https://tips4java.wordpress.com/2009/05/31/backgrounds-with-transparency/,但仍然没有成功。 这是娱乐代码:
import javax.swing.*;
import java.awt.*;
import java.awt.event.*;
public class Testpanel
{
private JLabel Testlabel;
private JFrame Hintergrundfenster;
private Bewegungspanel meinBewegungspanel;
public class Bewegungspanel extends JPanel
{
@Override
protected void paintComponent(Graphics Grafik)
{
Grafik.clearRect(0,0,getWidth(), getHeight());
}
public Bewegungspanel()
{
addMouseListener(new MouseAdapter()
{
public void mouseEntered(MouseEvent Ereignis)
{
Testlabel.setText("Hi");
}
public void mouseExited(MouseEvent Ereignis)
{
Testlabel.setText("Bye");
}
});
}
}
public static void main(String args[])
{
Testpanel meinTestpanel = new Testpanel();
}
public Testpanel()
{
Testlabel = new JLabel("Hello")
/*{
@Override
protected void paintComponent(Graphics Grafik)
{
Grafik.clearRect(0,0,0,0);
}
}*/;
Hintergrundfenster = new JFrame();
Hintergrundfenster.setUndecorated(true);
Hintergrundfenster.setSize(100,100);
meinBewegungspanel = new Bewegungspanel();
meinBewegungspanel.setLayout(new GridLayout(2,2));
meinBewegungspanel.add(Testlabel);
meinBewegungspanel.setBackground(new Color(0,0,0,140));
Hintergrundfenster.setBackground(new Color(0,0,0,0));
Hintergrundfenster.add(meinBewegungspanel);
Hintergrundfenster.setVisible(true);
}
}
将鼠标悬停在标签上时,其文字会发生变化。新数据仅在1.8上绘制,导致丑陋的文物:
这是版本1.8的结果:
使用java 1.7:
我很感激任何解决问题的想法。提前谢谢。
答案 0 :(得分:0)
奇怪的是,我刚刚发现插入一行(参见注释代码)至少解决了java 9的问题。因此该程序适用于7和9.因此,这似乎是一个java 1.8错误,正如我最初预期的那样。我当时会放弃对1.8的支持。
import javax.swing.*;
import java.awt.*;
import java.awt.event.*;
public class Testpanel
{
private JLabel Testlabel;
private JFrame Hintergrundfenster;
private Bewegungspanel meinBewegungspanel;
public class Bewegungspanel extends JPanel
{
@Override
protected void paintComponent(Graphics Grafik)
{
Grafik.clearRect(0,0,getWidth(), getHeight());
}
public Bewegungspanel()
{
setOpaque(false); // This line does the trick for java 1.9
addMouseListener(new MouseAdapter()
{
public void mouseEntered(MouseEvent Ereignis)
{
Testlabel.setText("Hi");
}
public void mouseExited(MouseEvent Ereignis)
{
Testlabel.setText("Bye");
}
});
}
}
public static void main(String args[])
{
Testpanel meinTestpanel = new Testpanel();
}
public Testpanel()
{
Testlabel = new JLabel("Hello")
/*{
@Override
protected void paintComponent(Graphics Grafik)
{
Grafik.clearRect(0,0,0,0);
}
}*/;
Hintergrundfenster = new JFrame();
Hintergrundfenster.setUndecorated(true);
Hintergrundfenster.setSize(100,100);
meinBewegungspanel = new Bewegungspanel();
meinBewegungspanel.setLayout(new GridLayout(2,2));
meinBewegungspanel.add(Testlabel);
meinBewegungspanel.setBackground(new Color(0,0,0,140));
Hintergrundfenster.setBackground(new Color(0,0,0,0));
Hintergrundfenster.add(meinBewegungspanel);
Hintergrundfenster.setVisible(true);
}
}