从Java获得有效的屏幕大小

时间:2012-04-12 12:37:12

标签: java swing awt

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

我目前正在使用......

component.getGraphicsConfiguration().getBounds()

...并根据操作系统减去默认任务栏的大小,但我想要一种方法,即使用户已调整/移动任务栏也能正常工作。

4 个答案:

答案 0 :(得分:54)

GraphicsEnvironment有一个方法可以返回最大可用大小,计算所有任务栏等,无论它们在哪里对齐:

GraphicsEnvironment.getLocalGraphicsEnvironment().getMaximumWindowBounds()

注意:在多监视器系统上,getMaximumWindowBounds()返回整个显示区域的边界。要获得单个显示的可用范围,请使用GraphicsConfiguration.getBounds()Toolkit.getScreenInsets(),如其他答案所示。

答案 1 :(得分:39)

这可以确定没有任务栏的屏幕大小(

//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();
            }
        });
    }
}

答案 2 :(得分:11)

以下是我最终使用的代码:

GraphicsConfiguration gc = // ...

Rectangle bounds = gc.getBounds();

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

Rectangle effectiveScreenArea = new Rectangle();

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

答案 3 :(得分:3)

这是我编写的一种方法,可以通过减去边距并将其居中放在屏幕上来快速进行计算。

public void setToEffectiveScreenSize() {
    double width, height, x, y;

    Dimension screenSize = Toolkit.getDefaultToolkit().getScreenSize();
    Insets bounds = Toolkit.getDefaultToolkit().getScreenInsets(frmMain.getGraphicsConfiguration());

    // Calculate the height/length by subtracting the margins
    // (x,y) = ( (screenHeight-windowHeight)/2, (screenWidth - windowWidth)/2 )

    width = screenSize.getWidth() - bounds.left - bounds.right;
    height = screenSize.getHeight() - bounds.top - bounds.bottom;

    // Now center the new rectangle inside the screen
    x = (screenSize.getHeight() - height) / 2.0;
    y = (screenSize.getWidth() - width) / 2.0;

    frmMain.setBounds((int)x,(int)y,(int)width,(int)height);
}