为什么这个计时器中的alpha会在这个Java Swing面板中自行绘制? 导入java.awt.Color; 导入java.awt.Dimension; 导入java.awt.FlowLayout; 导入java.awt.event.ActionEvent; 导入java.awt.event.ActionListener; 导入javax.swing.JFrame; 导入javax.swing.JLabel; 导入javax.swing.JPanel; 导入javax.swing.Timer; 公共班机{ 公共静态void main(字符串[]args){ JFrame=新JFrame(); frame.setLayout(新的FlowLayout()); 框架设置尺寸(新尺寸(100100)); frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); TestPanel=新的TestPanel(); 面板。设置首选尺寸(新尺寸(50,50)); 框架。添加(面板); frame.setVisible(true); } 静态类TestPanel扩展JPanel实现ActionListener{ 私有静态最终长serialVersionUID=8518959671689548069L; 公共测试面板(){ 超级(); 定时器t=新定时器(1000,此); t、 设置重复(真); t、 start(); } int不透明度=10; @凌驾 已执行的公共无效操作(操作事件e){ 如果(不透明度>=250){ 不透明度=0; } 否则{ 这个背景(新颜色(255,212,100,不透明度)); 这个。重新绘制(); 不透明度+=10; System.out.println(“不透明度为”+不透明度); } } } }

为什么这个计时器中的alpha会在这个Java Swing面板中自行绘制? 导入java.awt.Color; 导入java.awt.Dimension; 导入java.awt.FlowLayout; 导入java.awt.event.ActionEvent; 导入java.awt.event.ActionListener; 导入javax.swing.JFrame; 导入javax.swing.JLabel; 导入javax.swing.JPanel; 导入javax.swing.Timer; 公共班机{ 公共静态void main(字符串[]args){ JFrame=新JFrame(); frame.setLayout(新的FlowLayout()); 框架设置尺寸(新尺寸(100100)); frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); TestPanel=新的TestPanel(); 面板。设置首选尺寸(新尺寸(50,50)); 框架。添加(面板); frame.setVisible(true); } 静态类TestPanel扩展JPanel实现ActionListener{ 私有静态最终长serialVersionUID=8518959671689548069L; 公共测试面板(){ 超级(); 定时器t=新定时器(1000,此); t、 设置重复(真); t、 start(); } int不透明度=10; @凌驾 已执行的公共无效操作(操作事件e){ 如果(不透明度>=250){ 不透明度=0; } 否则{ 这个背景(新颜色(255,212,100,不透明度)); 这个。重新绘制(); 不透明度+=10; System.out.println(“不透明度为”+不透明度); } } } },java,swing,opacity,alpha,Java,Swing,Opacity,Alpha,alpha的变化速度比它应该的快。达到某一点后,不透明度下降,而控制台中打印的不透明度小于250。调整窗口大小会“重置”窗口,使alpha正确 我如何使它真正正确地绘制alpha this.setBackground(new Color(255, 212, 100, opacity)); Swing不支持透明背景 Swing希望组件可以是: 不透明-这意味着在进行自定义绘制之前,组件将首先使用不透明颜色重新绘制整个背景,或者 完全透明-在这种情况下,Swing将首先绘制第一个不透明父组件的背景

alpha的变化速度比它应该的快。达到某一点后,不透明度下降,而控制台中打印的不透明度小于250。调整窗口大小会“重置”窗口,使alpha正确

我如何使它真正正确地绘制alpha

this.setBackground(new Color(255, 212, 100, opacity));
Swing不支持透明背景

Swing希望组件可以是:

  • 不透明-这意味着在进行自定义绘制之前,组件将首先使用不透明颜色重新绘制整个背景,或者
  • 完全透明-在这种情况下,Swing将首先绘制第一个不透明父组件的背景,然后再进行自定义绘制
  • setOpaque(…)
    方法用于控制组件的不透明属性

    在任何一种情况下,这都可以确保移除任何绘制工件,并且可以正确完成自定义绘制

    如果要使用tranparency,则需要自己进行自定义绘制,以确保清除背景

    面板的自定义油漆应为:

    JPanel panel = new JPanel()
    {
        protected void paintComponent(Graphics g)
        {
            g.setColor( getBackground() );
            g.fillRect(0, 0, getWidth(), getHeight());
            super.paintComponent(g);
        }
    };
    panel.setOpaque(false); // background of parent will be painted first
    
    对于每个使用透明度的组件,都需要类似的代码

    或者,您可以签出自定义类,该类可用于任何将为您执行上述工作的组件

    Swing不支持透明背景

    Swing希望组件可以是:

  • 不透明-这意味着在进行自定义绘制之前,组件将首先使用不透明颜色重新绘制整个背景,或者
  • 完全透明-在这种情况下,Swing将首先绘制第一个不透明父组件的背景,然后再进行自定义绘制
  • setOpaque(…)
    方法用于控制组件的不透明属性

    在任何一种情况下,这都可以确保移除任何绘制工件,并且可以正确完成自定义绘制

    如果要使用tranparency,则需要自己进行自定义绘制,以确保清除背景

    面板的自定义油漆应为:

    JPanel panel = new JPanel()
    {
        protected void paintComponent(Graphics g)
        {
            g.setColor( getBackground() );
            g.fillRect(0, 0, getWidth(), getHeight());
            super.paintComponent(g);
        }
    };
    panel.setOpaque(false); // background of parent will be painted first
    
    对于每个使用透明度的组件,都需要类似的代码

    或者,您可以签出自定义类,该类可用于任何将为您执行上述工作的组件