Эффективный размер экрана с Java

Я бы хотел получить эффективный размер экрана. То есть: размер экрана без панели задач (или эквивалент на 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(); } }); } } 

GraphicsEnvironment имеет метод, который возвращает максимальный ansible размер, учет всех панелей задач и т. Д. Независимо от того, где они выровнены:

 GraphicsEnvironment.getLocalGraphicsEnvironment().getMaximumWindowBounds() 

Примечание. В системах с несколькими мониторами getMaximumWindowBounds() возвращает границы всей области отображения. Чтобы получить приемлемые границы одного экрана, используйте GraphicsConfiguration.getBounds() и Toolkit.getScreenInsets() как показано в других ответах.

Вот код, который я закончил, используя:

 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; 

Вот метод, который я написал, чтобы быстро выполнить вычисления, вычитая поля и центрируя их на экране.

 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); } 
  • CombinedDomainXYPlot не перемасштабирует доменную ось
  • Как resize JLabel ImageIcon?
  • Keylistener не работает для JPanel
  • Java KeyListener vs Keybinding
  • Может ли индикатор выполнения работать в classе за пределами основного?
  • Вращение JTextField по вертикали
  • Сделать кнопку круглой
  • Как добавить текст другого цвета в JTextPane
  • JTextArea не выбирается, но все еще отображается курсор «призрак»
  • Как получить CellRow, когда есть ItemEvent в JComboBox внутри ячейки
  • Как добавить кнопку закрытия на вкладку JTabbedPane?
  • Давайте будем гением компьютера.