【问题标题】:Java version-specific painting issueJava 版本特定的绘画问题
【发布时间】:2018-05-15 17:03:09
【问题描述】:

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

如果有任何解决问题的想法,我将不胜感激。提前致谢。

【问题讨论】:

  • 旁注:根据 Java 代码约定字段,变量 参数应以小写字符开头(这是为了更容易区分类和变量),因此像 mouseEntered(MouseEvent Ereignis)JLabel Testlabel 这样的东西最终可能会导致混乱。
  • 你的链接是 2009 年的,所以它不是为 java 8 制作的。它可能是一个改变行为的更新,你也不要在你的 Bewegungspanel.paintComponent 中调用 super.paintComponent
  • 我的代码实际上没有使用链接方法。我刚才提到它是为了指出我尝试了几种方法来解决这个问题。
  • 费德里科。我试过了,但结果不是我想要的。

标签: java swing version paintcomponent


【解决方案1】:

奇怪的是,我刚刚发现插入一行(请参阅注释代码)至少可以解决继承者 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);
    }
}

【讨论】:

  • 更多:“如果您不尊重opaque property,您可能会看到视觉伪影。”—paintComponent()
  • 问题是,Java 1.8 显然不关心它被设置为 false。
  • 更具体地说,现存的 Look&Feel 控制着设置。另请参阅 Initial Threads,它在最近的更新中变得更加重要。
猜你喜欢
  • 2012-10-15
  • 1970-01-01
  • 2020-01-09
  • 1970-01-01
  • 2019-03-17
  • 2011-08-10
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多