Java JFrame.setBackground(颜色)修改图像图标大小

Java JFrame.setBackground(颜色)修改图像图标大小,java,swing,jframe,jlabel,Java,Swing,Jframe,Jlabel,我从几天开始学习Java,我刚开始处理swing和AWT。 我正在尝试使弹出一个透明的动画GIF,并将我的窗口放置到一个特定的位置。问题是我不能把它放在屏幕的右下角。因此,我尝试了几件事(使窗口全屏显示,并将JLabel组件移入,将窗口移到setBounds…),但我刚刚意识到如果我删除 this.setBackground(new Color(0, 0, 0, 0)); 我失去了透明度,但我的图片也改变了大小,而且是在好的地方 代码: 我在main中实例化了我的类fenetre 谢谢你的帮

我从几天开始学习Java,我刚开始处理swing和AWT。 我正在尝试使弹出一个透明的动画GIF,并将我的窗口放置到一个特定的位置。问题是我不能把它放在屏幕的右下角。因此,我尝试了几件事(使窗口全屏显示,并将JLabel组件移入,将窗口移到setBounds…),但我刚刚意识到如果我删除

this.setBackground(new Color(0, 0, 0, 0));
我失去了透明度,但我的图片也改变了大小,而且是在好的地方

代码:


我在main中实例化了我的类fenetre

谢谢你的帮助:)

编辑: 我重新拟订: 我将在稍后了解获得屏幕大小的更合适的方法(这是目前的工作)。 我只有这个:

我在这里启动了两次:一次是使用
this.setBackground(新颜色(0,0,0,0))和一个空白。我们可以很清楚地看到,没有显示的屏幕更大,更适合屏幕(没有显示的屏幕)


我想要的是在不调整图像大小的情况下保持透明。

我不是100%了解您的特殊问题,但是,我会避免使用
私有静态最终维度screenSize=Toolkit.getDefaultToolkit().getScreenSize()
用于确定屏幕大小,因为它不考虑任务栏和dock等操作系统元素

下面的示例只是在屏幕的底部/右侧显示一个红方块,避免使用任务栏和dock之类的东西

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(新颜色(0,0,0,0))运行它
和Save没有区别

似乎安装上一个java JDK开发工具包就解决了这个问题。如果有人知道为什么要在9.0.4 JRE中添加此附件,我非常感兴趣。

不要使用
label.getWidth()
,而是使用
this.getWidth()
,还要使用
Toolkit.getDefaultToolkit().getScreenSize()
不会处理其他inset元素,比如我已经尝试过的任务:
this.getWidth()
icon.getIconWidth()
,但这会产生相同的结果。问题是(我认为)图片是通过
this.setBackground(color)
调整大小的,JLabel没有调整大小并保持原始图片大小。不知道为什么,也不知道怎么做。”(我想)图片是这样调整大小的。setBackground(color)“-不会影响窗口的大小,因为你调用
pack
窗口会在它之后调整大小,所以它可能是我,但在你的示例中,红方块不适合屏幕边框,不管怎样,我使用的是非透明gif(非常简单:)。我确认我有完全相同的问题,如果我删除
setBackground
属性(他变得更大),红色sqare的大小会改变。什么操作系统?什么Java版本?“红方块不适合屏幕边框,”-我更新了计算结果-认为它们是错误的,所以,我有带Java 9.0.4的windows 10,我在windows 10虚拟机和Java 10.0.1及其工作中尝试了相同的代码。我在哪里迷路了:我在哪里
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);
    }

}