Java JFrame.setBackground(颜色)修改图像图标大小
我从几天开始学习Java,我刚开始处理swing和AWT。 我正在尝试使弹出一个透明的动画GIF,并将我的窗口放置到一个特定的位置。问题是我不能把它放在屏幕的右下角。因此,我尝试了几件事(使窗口全屏显示,并将JLabel组件移入,将窗口移到setBounds…),但我刚刚意识到如果我删除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 谢谢你的帮
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);
}
}