你能用 Java 在桌面的某个区域显示图像吗?

Posted

技术标签:

【中文标题】你能用 Java 在桌面的某个区域显示图像吗?【英文标题】:Can you display an Image on a certain region of your desktop in Java? 【发布时间】:2022-01-16 13:30:34 【问题描述】:

有没有办法使用 JFrame 让图像出现在我的桌面两侧?

我的桌面上同时显示了一个 JOptionPane.showInputDialog 和一个图像,但我不希望它们相互重叠。我宁愿让一个显示在右侧,一个显示在左侧,这样我就不必总是移动窗口。

【问题讨论】:

一个 JOptionPane 将在框架或桌面上居中,这取决于您在方法中使用的参数。如果您想完全控制该位置,那么您需要: 1) 阅读JOptionPane API,您将在其中找到有关“直接使用”的部分,这将使您可以访问选项窗格使用的 JDialog,以便您可以控制位置,或者 2) 只需使用 JDialog,这样您就可以完全控制组件和对话框的位置。 【参考方案1】:

在多屏幕环境中,这可能有点困难,因为您需要考虑很多变量。您可以将多屏幕环境视为“虚拟屏幕”,其中默认屏幕可能不在0x0。此外,添加操作系统菜单/任务栏之类的内容,您还可以处理其他一系列事情。

以下示例显示两个框架,均沿“默认”屏幕的“安全可视区域”底部对齐,并位于“默认”屏幕“安全可视区域”的左侧和右侧

import java.awt.EventQueue;
import java.awt.GraphicsConfiguration;
import java.awt.GraphicsDevice;
import java.awt.GraphicsEnvironment;
import java.awt.GridBagLayout;
import java.awt.Insets;
import java.awt.Rectangle;
import java.awt.Toolkit;
import java.io.IOException;
import java.util.logging.Level;
import java.util.logging.Logger;
import javax.imageio.ImageIO;
import javax.swing.ImageIcon;
import javax.swing.JFrame;
import javax.swing.JLabel;
import javax.swing.JPanel;
import javax.swing.border.EmptyBorder;

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

    public Test() 
        EventQueue.invokeLater(new Runnable() 
            @Override
            public void run() 
                try 
                    JFrame happyFrame = new JFrame();
                    happyFrame.add(new HappyPane());
                    happyFrame.pack();

                    JFrame sadFrame = new JFrame();
                    sadFrame.add(new SadPane());
                    sadFrame.pack();

                    GraphicsEnvironment ge = GraphicsEnvironment.getLocalGraphicsEnvironment();
                    GraphicsDevice screenDevice = ge.getDefaultScreenDevice();
                    GraphicsConfiguration gc = screenDevice.getDefaultConfiguration();
                    Rectangle bounds = screenDevice.getDefaultConfiguration().getBounds();

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

                    bounds.x += insets.left;
                    bounds.y += insets.top;
                    bounds.width -= insets.left + insets.right;
                    bounds.height -= insets.top + insets.bottom;

                    happyFrame.setLocation(bounds.x, (bounds.y + bounds.height) - happyFrame.getSize().height);
                    sadFrame.setLocation((bounds.x + bounds.width) - sadFrame.getSize().width, (bounds.y + bounds.height) - sadFrame.getSize().height);

                    happyFrame.setVisible(true);
                    sadFrame.setVisible(true);
                 catch (IOException ex) 
                    Logger.getLogger(Test.class.getName()).log(Level.SEVERE, null, ex);
                
            
        );
    

    public class HappyPane extends JPanel 

        public HappyPane() throws IOException 
            setBorder(new EmptyBorder(16, 16, 16, 16));
            setLayout(new GridBagLayout());
            add(new JLabel(new ImageIcon(ImageIO.read(getClass().getResource("/images/happy.png")))));
        

    

    public class SadPane extends JPanel 

        public SadPane() throws IOException 
            setBorder(new EmptyBorder(16, 16, 16, 16));
            setLayout(new GridBagLayout());
            add(new JLabel(new ImageIcon(ImageIO.read(getClass().getResource("/images/sad.png")))));
        

    

你也可以看看

Determine height of screen in Java Java getting mouse location on multiple monitor environment

如果您想了解更多信息,那么您可能真的很想知道 ;)

【讨论】:

以上是关于你能用 Java 在桌面的某个区域显示图像吗?的主要内容,如果未能解决你的问题,请参考以下文章

你能用meson来源代码吗?

PHP桌面 - 访问本地资源

在java中创建按钮

java swing背景图片

你能用 c++ 加载一个网页,包括 JS 和动态 html 并获取渲染的 DOM 字符串吗?

如何仅捕获屏幕上的鼠标单击区域?