Java版本特定的绘画问题

时间:2017-12-01 14:52:04

标签: java swing version paintcomponent

我有一个奇怪的问题。尝试使用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的结果:

Screenshot of version 1.8

使用java 1.7:

Screenshot of version 1.7

我很感激任何解决问题的想法。提前谢谢。

1 个答案:

答案 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);
    }
}