2012-04-12 3 views
20

Vorrei ottenere le dimensioni dello schermo effettive. Cioè: la dimensione dello schermo senza la barra delle applicazioni (o l'equivalente su Linux/Mac).Ottieni dimensioni dello schermo effettive da Java

Attualmente sto usando ...

component.getGraphicsConfiguration().getBounds() 

... e sottraendo la dimensione predefinita barra delle applicazioni a seconda del sistema operativo, ma vorrei un modo che funziona anche se l'utente ha ridimensionato/spostato la barra delle applicazioni .

risposta

37

Questo potrebbe determinare le dimensioni dello schermo in pixel senza la barra delle applicazioni

//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

qualcuno può eseguire questo codice su Xx_nix e Mac OSX e verificare se JDialog è realmente posizionato nell'angolo in basso a destra ?

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

Sembra buono su Ubuntu/OpenJDK. –

+1

Probabilmente può essere risolto, ma sembra che questo non funzioni in una configurazione multischermo. –

+0

ci sono due livelli, significato ??? '1)' un contenitore riempie due o più multi_monitor (non testato in Java7, ma Java6 non è supportato), o '2)' un contenitore posizionato su uno di multi_monitors (risposto da alain.janinm), – mKorbel

51

GraphicsEnvironment ha un metodo che restituisce la dimensione massima disponibile, che rappresentano tutte le barre delle applicazioni, ecc non importa dove essi sono allineati:

GraphicsEnvironment.getLocalGraphicsEnvironment().getMaximumWindowBounds() 

NOTA: su sistemi multi-monitor, getMaximumWindowBounds() restituisce i limiti di l'intera area di visualizzazione. Per ottenere i limiti utilizzabili di un singolo display, utilizzare GraphicsConfiguration.getBounds() e Toolkit.getScreenInsets() come mostrato in altre risposte.

+2

Nel mio caso restituisce l'intera altezza. (quando la barra delle applicazioni è trasparente e Windows potrebbe andare sotto) – Lukino

10

Ecco il codice che ho finito per usare:

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: l'ho testato su Ubuntu, OS X e Windows 7. Verrà testato su diverse piattaforme diverse una volta che l'applicazione si sposta per testare (e sicuramente mi ricorderò qui, se incontriamo problemi ovunque). –

2

Ecco un metodo che ho scritto per fare rapidamente i calcoli sottraendo i margini e centrandola nella schermata.

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