当前位置: 首页 > 面试题库 >

为什么此计时器中的Alpha在此Java Swing面板中位于自身之上?

桂坚
2023-03-14
问题内容
    import java.awt.Color;
    import java.awt.Dimension;
    import java.awt.FlowLayout;
    import java.awt.event.ActionEvent;
    import java.awt.event.ActionListener;

    import javax.swing.JFrame;
    import javax.swing.JLabel;
    import javax.swing.JPanel;
    import javax.swing.Timer;

    public class Main {


        public static void main(String[] args) {
            JFrame frame = new JFrame();
            frame.setLayout(new FlowLayout());
            frame.setSize(new Dimension(100, 100));
            frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);

            TestPanel panel = new TestPanel();
            panel.setPreferredSize(new Dimension(50,50));
            frame.add(panel);
            frame.setVisible(true);
        }

        static class TestPanel extends JPanel implements ActionListener{

            private static final long serialVersionUID = 8518959671689548069L;

            public TestPanel() {
                super();
                Timer t = new Timer(1000, this);
                t.setRepeats(true);
                t.start();
            }

            int opacity = 10;
            @Override
            public void actionPerformed(ActionEvent e) {
                if(opacity >= 250) {
                    opacity = 0;
                }
                else {
                    this.setBackground(new Color(255, 212, 100, opacity));
                    this.repaint();
                    opacity+=10;
                    System.out.println("opacity is " + opacity);
                }
            }

        }
    }

alpha更改的速度快于其应有的速度。达到特定点后,不透明度降低,而控制台中打印的不透明度小于250。调整窗口大小会“重置”它,从而使Alpha正确。

如何使其正确绘制Alpha?


问题答案:
this.setBackground(new Color(255, 212, 100, opacity));

摇摆不支持透明背景。

Swing希望组件为:

  1. 不透明-表示组件将在进行自定义绘画之前首先用不透明的颜色重新绘制整个背景,或者
  2. 完全透明-在这种情况下,Swing将先绘制第一个不透明父级组件的背景,然后再进行自定义绘制。

setOpaque(...)方法用于控制组件的不透明属性。

在任何一种情况下,这都可以确保除去所有绘画瑕疵,并且可以正确完成自定义绘画。

如果要使用透明度,则需要对自己进行自定义绘制以确保清除背景。

面板的自定义绘画为:

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

使用透明性的每个组件都需要类似的代码。

或者,您可以签出自定义类的Background With
Transparency
,该自定义类可以在将为您完成上述工作的任何组件上使用。



 类似资料:
  • 这与 R- 查看具有任何 NA 的所有列名称有关 我比较了data.frame和data.table版本,发现data.table慢了10倍。这与大多数使用data.table的代码相反,后者确实比data.frame版本快得多。 预先设置: 可能是什么原因?

  • 问题内容: 有一件我不理解的事情。 为什么这样 产生此错误: 问题答案: 发生这种情况是因为该模块没有名为的任何属性。该属性仅在您定义时定义。 子模块不会在您刚导入时自动导入;您需要显式导入它们。对于大多数软件包来说,情况相同,尽管软件包可以根据需要选择导入自己的子模块。(例如,如果包括一份声明, 然后 将子模块会随时导入进口。)

  • 问题内容: 我通过Fedora的Dockerfile创建了一个简单的映像(最初为320 MB)。 添加了Nano(这个1MB大小的微型编辑器),图像的大小已增加到530 MB。我在此基础上添加了Git(30-ish MB),然后将图像大小的火箭提高到830 MB。 那不是疯了吗? 我试图导出和导入容器以删除历史记录/中间图像。这项工作最多可节省25 MB,现在我的图像大小为804 MB。我也尝试过

  • 问题内容: 我正在尝试通过查看其代码来复制我进入gmail的邮件程序。我在多个源代码查看器中看到了很多: 3D是否是我不知道的某种邮件渲染方式? 问题答案: 这是一种称为“ quoted-printable ”的电子邮件编码系统,该系统允许将非ASCII字符表示为ASCII以便进行电子邮件传输。 在带引号的可打印格式中,任何非标准的电子邮件八位字节均以一个符号表示,后跟两个十六进制数字,代表该八位

  • 问题内容: 我正在尝试读取文本文件,我正在使用fileImputStream,并将所有行读取到单个String中,然后将其输出到控制台(System.out) 当我尝试读取humanSerf.txt时,它在consol中为我提供了这一点: 在文本文件中,它说: 如何使怪异的文字消失? 这是我正在使用的代码,请帮助 如何使怪异的文字消失?ps,这是在mac textedditor中完成的 问题答案:

  • 问题内容: 我在ColdFusion代码中碰巧遇到了这些值,但Google计算器似乎有相同的“错误”,但差不为零。 416582.2850-411476.8100-5105.475 = -2.36468622461E-011 http://www.google.com/search?hl=zh_CN&rlz=1C1GGLS_enUS340US340&q=416582.2850+-+411476.8