JFrame.setBackground(Color)修改ImageIcon大小

时间:2018-04-21 08:39:00

标签: java swing jframe jlabel

我从几天开始学习Java,我开始处理swing和 AWT 。 我正在尝试将弹出一个透明的动画GIF 并将我的窗口放到特定位置。问题是我无法将其放在屏幕的右下角。所以,我尝试了一些东西(使窗口全屏显示并移动JLabel组件,使用setBounds移动窗口,... )但我刚刚意识到如果我删除

this.setBackground(new Color(0, 0, 0, 0));

我失去了 透明度 ,但我的图片也改变了尺寸,并且处于最佳位置。

代码:

public class Fenetre extends JFrame {
    private static final Dimension screenSize = Toolkit.getDefaultToolkit().getScreenSize();
    private static final int screen_width = (int) screenSize.width;
    private static final int screen_height = (int) screenSize.height;

    URL url;                //Get the source URL
    Icon icon;              //For animated gif support
    JLabel label;           //Contain the picture

    /**** CONSTRUCTOR ****/
    public Fenetre(String pUrl,String name) throws MalformedURLException{
        url = new URL(pUrl);

        icon = new ImageIcon(url);
        label = new JLabel(icon);

        this.add(label);
        this.setTitle(name);
        this.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        this.setUndecorated(true);
        this.setBackground(new Color(0, 0, 0, 0));  

        this.pack();
        this.setLocation(screen_width-label.getWidth(),screen_height-label.getHeight());
        this.setAlwaysOnTop(true);

        this.setVisible(true);
    }
}

我在我的主要实例化我的班级fenetre。

感谢您的帮助:)

编辑: 我重新制定: 我稍后会看到一个更合适的方法来获得屏幕的大小(现在这个工作)。 我就是这样的: exemple

我在这里发布了两次:一次是this.setBackground(new Color(0, 0, 0, 0));,一次是看不见。我们可以肯定地看到一个更大的并且更适合屏幕(那里没有)。

我想要的是透明度与此图像调整大小。

2 个答案:

答案 0 :(得分:0)

我不是100%我理解您的特定问题,但是,我会避免使用private static final Dimension screenSize = Toolkit.getDefaultToolkit().getScreenSize();来确定屏幕尺寸,因为它没有考虑像OS元素这样的事情比如任务栏和停靠点。

以下示例只是在屏幕的底部/右侧显示一个红色方块,避免像任务栏和停靠栏这样的内容

import java.awt.Color;
import java.awt.Dimension;
import java.awt.EventQueue;
import java.awt.GraphicsConfiguration;
import java.awt.GraphicsDevice;
import java.awt.GraphicsEnvironment;
import java.awt.Insets;
import java.awt.Rectangle;
import java.awt.Toolkit;
import javax.swing.JFrame;
import javax.swing.JPanel;
import javax.swing.UIManager;
import javax.swing.UnsupportedLookAndFeelException;

public class Test {

    public static void main(String[] args) {
        new Test();
    }

    public Test() {
        EventQueue.invokeLater(new Runnable() {
            @Override
            public void run() {
                try {
                    UIManager.setLookAndFeel(UIManager.getSystemLookAndFeelClassName());
                } catch (ClassNotFoundException | InstantiationException | IllegalAccessException | UnsupportedLookAndFeelException ex) {
                    ex.printStackTrace();
                }

                JFrame frame = new JFrame("Testing");
                frame.setUndecorated(true);
                frame.setBackground(new Color(0, 0, 0, 0));  
                frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
                frame.add(new TestPane());
                frame.pack();
                Rectangle bounds = getScreenBounds();
                int x = bounds.x + (bounds.width - frame.getWidth());
                int y = bounds.y + (bounds.height - frame.getHeight());
                frame.setLocation(x, y);
                frame.setVisible(true);
            }
        });
    }

    public static Rectangle getScreenBounds() {
        Rectangle bounds = new Rectangle(0, 0, 0, 0);

        GraphicsEnvironment ge = GraphicsEnvironment.getLocalGraphicsEnvironment();
        GraphicsDevice gd = ge.getDefaultScreenDevice();

        GraphicsConfiguration gc = gd.getDefaultConfiguration();
        bounds = gc.getBounds();

        Insets insets = Toolkit.getDefaultToolkit().getScreenInsets(gc);

        bounds.x += insets.left;
        bounds.y += insets.top;
        bounds.width -= (insets.right + insets.left);
        bounds.height -= (insets.bottom + insets.top);
        return bounds;
    }

    public class TestPane extends JPanel {

        public TestPane() {
            setBackground(Color.RED);
        }

        @Override
        public Dimension getPreferredSize() {
            return new Dimension(100, 100);
        }

    }

}

更新

我修改TestPane以包含一个显示组件大小的标签......

public class TestPane extends JPanel {

    private JLabel label;

    public TestPane() {
        setBackground(Color.RED);
        label = new JLabel("...");
        setLayout(new GridBagLayout());
        add(label);
    }

    @Override
    public void invalidate() {
        super.invalidate();
        label.setText(getWidth() + "x" + getHeight());
    }

    @Override
    public Dimension getPreferredSize() {
        return new Dimension(100, 100);
    }

}

使用和不使用frame.setBackground(new Color(0, 0, 0, 0));运行它并且没有看到差异

答案 1 :(得分:0)

似乎安装了最后一个java JDK Dev Kit解决了这个问题。如果有人知道为什么这附加到9.0.4 JRE,我非常感兴趣。