我从几天开始学习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));
,一次是看不见。我们可以肯定地看到一个更大的并且更适合屏幕(那里没有)。
我想要的是透明度与此图像调整大小。
答案 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,我非常感兴趣。