当前位置: 首页 > 面试题库 >

从Java获得有效的屏幕尺寸

张浩阔
2023-03-14
问题内容

我想获得有效的屏幕尺寸。也就是说:没有任务栏的屏幕大小(或Linux / Mac上的等效屏幕)。

我目前正在使用…

component.getGraphicsConfiguration().getBounds()

…并减去默认的任务栏大小,具体取决于操作系统,但是即使用户调整了大小/移动了任务栏的大小,我也希望这种方法可以工作。


问题答案:

这可以确定没有任务栏的屏幕大小(以像素为单位)

//size of the screen
Dimension screenSize = Toolkit.getDefaultToolkit().getScreenSize();

//height of the task bar
Insets scnMax = Toolkit.getDefaultToolkit().getScreenInsets(getGraphicsConfiguration());
int taskBarSize = scnMax.bottom;

//available size of the screen 
setLocation(screenSize.width - getWidth(), screenSize.height - taskBarSize - getHeight());

编辑

有人可以在Xx_nix和Mac OSX上运行此代码,并检查JDialog是否确实位于右下角吗?

import java.awt.*;
import java.awt.event.*;
import javax.swing.*;
import javax.swing.UIManager.LookAndFeelInfo;

public class NotificationPopup {

    private static final long serialVersionUID = 1L;
    private LinearGradientPaint lpg;
    private JDialog dialog = new JDialog();
    private BackgroundPanel panel = new BackgroundPanel();

    public NotificationPopup() {
        Dimension screenSize = Toolkit.getDefaultToolkit().getScreenSize();
        Insets scnMax = Toolkit.getDefaultToolkit().
                getScreenInsets(dialog.getGraphicsConfiguration());
        int taskBarSize = scnMax.bottom;
        panel.setLayout(new GridBagLayout());
        GridBagConstraints constraints = new GridBagConstraints();
        constraints.gridx = 0;
        constraints.gridy = 0;
        constraints.weightx = 1.0f;
        constraints.weighty = 1.0f;
        constraints.insets = new Insets(5, 5, 5, 5);
        constraints.fill = GridBagConstraints.BOTH;
        JLabel l = new JLabel("You have got 2 new Messages.");
        panel.add(l, constraints);
        constraints.gridx++;
        constraints.weightx = 0f;
        constraints.weighty = 0f;
        constraints.fill = GridBagConstraints.NONE;
        constraints.anchor = GridBagConstraints.NORTH;
        JButton b = new JButton(new AbstractAction("x") {

            private static final long serialVersionUID = 1L;

            @Override
            public void actionPerformed(final ActionEvent e) {
                dialog.dispose();
            }
        });
        b.setOpaque(false);
        b.setMargin(new Insets(1, 4, 1, 4));
        b.setFocusable(false);
        panel.add(b, constraints);
        dialog.setUndecorated(true);
        dialog.setSize(300, 100);
        dialog.setLocation(screenSize.width - dialog.getWidth(),
                screenSize.height - taskBarSize - dialog.getHeight());
        lpg = new LinearGradientPaint(0, 0, 0, dialog.getHeight() / 2,
                new float[]{0f, 0.3f, 1f}, new Color[]{new Color(0.8f, 0.8f, 1f),
                    new Color(0.7f, 0.7f, 1f), new Color(0.6f, 0.6f, 1f)});
        dialog.setContentPane(panel);
        dialog.setVisible(true);
    }

    private class BackgroundPanel extends JPanel {

        private static final long serialVersionUID = 1L;

        BackgroundPanel() {
            setOpaque(true);
        }

        @Override
        protected void paintComponent(final Graphics g) {
            final Graphics2D g2d = (Graphics2D) g;
            g2d.setPaint(lpg);
            g2d.fillRect(1, 1, getWidth() - 2, getHeight() - 2);
            g2d.setColor(Color.BLACK);
            g2d.drawRect(0, 0, getWidth() - 1, getHeight() - 1);
        }
    }

    public static void main(final String[] args) {
        try {
            for (LookAndFeelInfo info : UIManager.getInstalledLookAndFeels()) {
                System.out.println(info.getName());
                if ("Nimbus".equals(info.getName())) {
                    UIManager.setLookAndFeel(info.getClassName());
                    break;
                }
            }
        } catch (UnsupportedLookAndFeelException e) {
        } catch (ClassNotFoundException e) {
        } catch (InstantiationException e) {
        } catch (IllegalAccessException e) {
        }
        SwingUtilities.invokeLater(new Runnable() {

            @Override
            public void run() {

                NotificationPopup notificationPopup = new NotificationPopup();
            }
        });
    }
}


 类似资料:
  • 问题内容: 嗨,我正在编写图形程序,我一直在寻找一种获取所使用屏幕物理尺寸的方法。我可以获得以像素为单位的屏幕大小以及逻辑分辨率。我似乎找不到任何地方可以获取任何显示器规格中始终具有的物理尺寸(例如19“-376 x 301 mm)。问题是,加载此信息时,此信息是否甚至还存储在OS中的任何位置?我正在编写的程序需要在Mac和Windows上运行。 谢谢! nt 问题答案: 我认为Java不可能实现

  • 问题内容: 我想通过c获取屏幕尺寸。我知道jni支持从c调用Java。但是有人知道另一种方法吗?我的意思是从低级模块获取屏幕大小,而无需调用Java。 我认为/ dev / graphics与我的问题有关 问题答案: 是的,您可以从/ dev / graphics / fb0获得屏幕分辨率,但是(至少在我的手机上)读取权限仅限于root用户和“ graphics”组中的用户。无论如何,您可以执行以

  • 问题内容: 我的计算机上插入了两个屏幕,并且想知道JFrame或Toolkit中是否有一种方法可以检测到窗口在哪个屏幕上? 我有这个代码: 哪个获取主屏幕的屏幕尺寸,但是如何获取第二个屏幕的尺寸或检测该窗口位于哪个屏幕上? 问题答案: 您应该看一下GraphicsEnvironment。 特别是: 返回所有屏幕GraphicsDevice对象的数组。 您可以从这些GraphicDevice对象获取

  • 问题内容: 我想知道是否可以使用tkinter计算屏幕尺寸。 我想要这样做,这样可以使程序在屏幕中央打开。 问题答案:

  • 因为有两种方法可以获得尺寸。从13级以上的API来看,这种方法对我很有效 14岁以下,这种方法对我有效 我可以得到所有API级别的屏幕大小吗???请帮帮我。

  • 问题内容: 我已经仔细阅读了http://developer.android.com/guide/practices/screens_support.html和其他相关网站中的文档,但我仍然对此表示怀疑。让我解释: 我已经为值,values-large和values- xlarge实现了dimens.xml,因此,例如,在平板电脑上运行时,我的Android应用程序很好。但是,我指定了填充,边距,