2012-04-12 14 views
20

Ich möchte die effektive Bildschirmgröße erhalten. Das heißt: die Größe des Bildschirms ohne die Taskleiste (oder die Entsprechung auf Linux/Mac).Erhalten Sie effektive Bildschirmgröße von Java

Ich bin derzeit mit ...

component.getGraphicsConfiguration().getBounds() 

... und Subtrahieren der Standard-Task-Leiste Größe auf dem OS abhängig, aber ich würde einen Weg mag, dass selbst wenn der Benutzer arbeitet, hat der Größe verändert/bewegt, um die Taskleiste .

Antwort

37

Dies könnte die Bildschirmgröße in Pixel ohne die Taskleiste

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

EDIT

bestimmt

Kann jemand diesen Code auf Xx_nix und Mac OSX laufen bitte und überprüfen, ob JDialog wirklich in der rechten unteren Ecke platziert ?

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

Sieht gut aus auf Ubuntu/OpenJDK. –

+1

Es kann wahrscheinlich behoben werden, aber es sieht so aus, als ob dies in einem Multi-Bildschirm-Setup nicht funktioniert. –

+0

gibt es zwei Ebenen, bedeuten ??? '1)' ein Container füllt zwei oder mehr multi_monitors (nicht getestet in Java7, aber Java6 nicht unterstützt), oder '2)' ein Container auf einem von multi_monitors platziert (beantwortet von alain.janinm), – mKorbel

51

GraphicsEnvironment eine Methode, die die maximal verfügbare Größe zurückgibt, Buchhaltung alle Taskleisten usw. unabhängig davon, wo sie ausgerichtet sind:

GraphicsEnvironment.getLocalGraphicsEnvironment().getMaximumWindowBounds() 

Hinweis: Bei Systemen mit mehreren Monitoren, getMaximumWindowBounds() gibt die Grenzen der die gesamte Anzeigefläche. Um die verwendbaren Grenzen einer einzelnen Anzeige zu erhalten, verwenden Sie GraphicsConfiguration.getBounds() und Toolkit.getScreenInsets(), wie in anderen Antworten gezeigt.

+2

In meinem Fall gibt es ganze Höhe zurück. (wenn die Taskleiste transparent ist und die Fenster darunter gehen können) – Lukino

10

Hier ist der Code, den ich am Ende mit:

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; 
+1

@mKorbel: Ich habe es unter Ubuntu, OS X und Windows 7 getestet. Es wird auf mehreren Plattformen getestet, sobald die Anwendung zum Test wechselt (und ich werde es beachten hier, wenn wir irgendwo Probleme haben). –

2

Hier ist eine Methode, die ich schnell die Berechnungen schrieb durch die Ränder abgezogen und es auf dem Bildschirm zentriert.

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); 
} 
Verwandte Themen