Je souhaite obtenir la taille d'écran effective. C'est-à-dire: la taille de l'écran sans la barre des tâches (ou l'équivalent sur Linux/Mac).
J'utilise actuellement ...
component.getGraphicsConfiguration().getBounds()
... et en soustrayant la taille de la barre des tâches par défaut en fonction du système d'exploitation, mais j'aimerais une méthode qui fonctionne même si l'utilisateur a redimensionné/déplacé la barre des tâches.
Cela pourrait déterminer la taille de l'écran en pixels sans la barre des tâches
//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());
ÉDITER
Quelqu'un peut-il exécuter ce code sur Xx_nix et Mac OSX et vérifier si JDialog est vraiment placé dans le coin inférieur droit?
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 a une méthode qui renvoie la taille maximale disponible, en tenant compte de toutes les barres de tâches, etc., peu importe où elles sont alignées:
GraphicsEnvironment.getLocalGraphicsEnvironment().getMaximumWindowBounds()
Remarque: Sur les systèmes à plusieurs moniteurs, getMaximumWindowBounds()
renvoie les limites de toute la zone d'affichage. Pour obtenir les limites utilisables d'un seul affichage, utilisez GraphicsConfiguration.getBounds()
et Toolkit.getScreenInsets()
comme indiqué dans les autres réponses.
Voici le code que j'ai fini par utiliser:
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;
Voici une méthode que j'ai écrite pour faire rapidement les calculs en soustrayant les marges et en les centrant sur l'écran.
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);
}