Làm cách nào để căn giữa JDialog trên màn hình?


83

Làm cách nào để tôi định vị một JDialog ở giữa màn hình?

Câu trả lời:


158

Trong Java 1.4+, bạn có thể làm:

final JDialog d = new JDialog();
d.setSize(200,200);
d.setLocationRelativeTo(null);
d.setVisible(true);

Hoặc có lẽ (trước 1.4):

final JDialog d = new JDialog();
d.setSize(200, 200);
final Toolkit toolkit = Toolkit.getDefaultToolkit();
final Dimension screenSize = toolkit.getScreenSize();
final int x = (screenSize.width - d.getWidth()) / 2;
final int y = (screenSize.height - d.getHeight()) / 2;
d.setLocation(x, y);
d.setVisible(true);

7
chính xác thì điều gì đang xảy ra khi bạn đặt vị trí liên quan đến null?
Mark Norgren

6
Muốn thêm rằng bạn cần sử dụng setSize (), nếu không setLocationRelativeTo () sẽ không hoạt động. Tôi đã phải sử dụng cả setSize () VÀ setPreferredSize () để mọi thứ trông ổn.
Richard

2
Trả lời cho câu hỏi của @marked: Nếu thành phần hiện không hiển thị hoặc c là rỗng, cửa sổ sẽ được đặt ở giữa màn hình. (từ java.awt.Window javadocs)
Jeremy Brooks

2
Lưu ý rằng cả hai phương pháp này sẽ căn giữa hộp thoại trên màn hình chính (ít nhất là trên Windows). Tốt hơn nên chuyển một đối số để setLocationRelativeTohộp thoại xuất hiện trên màn hình thích hợp cho người dùng nhiều màn hình.
Brad Mace

5
Tôi đã phải gọi pack()trước đó setLocationRelativeTo(null)để căn giữa hộp thoại một cách chính xác.
Matthias Braun,

8

Hai trợ giúp để căn giữa trong màn hình hoặc trong cha.

// Center on screen ( absolute true/false (exact center or 25% upper left) )
public void centerOnScreen(final Component c, final boolean absolute) {
    final int width = c.getWidth();
    final int height = c.getHeight();
    final Dimension screenSize = Toolkit.getDefaultToolkit().getScreenSize();
    int x = (screenSize.width / 2) - (width / 2);
    int y = (screenSize.height / 2) - (height / 2);
    if (!absolute) {
        x /= 2;
        y /= 2;
    }
    c.setLocation(x, y);
}

// Center on parent ( absolute true/false (exact center or 25% upper left) )
public void centerOnParent(final Window child, final boolean absolute) {
    child.pack();
    boolean useChildsOwner = child.getOwner() != null ? ((child.getOwner() instanceof JFrame) || (child.getOwner() instanceof JDialog)) : false;
    final Dimension screenSize = Toolkit.getDefaultToolkit().getScreenSize();
    final Dimension parentSize = useChildsOwner ? child.getOwner().getSize() : screenSize ;
    final Point parentLocationOnScreen = useChildsOwner ? child.getOwner().getLocationOnScreen() : new Point(0,0) ;
    final Dimension childSize = child.getSize();
    childSize.width = Math.min(childSize.width, screenSize.width);
    childSize.height = Math.min(childSize.height, screenSize.height);
    child.setSize(childSize);        
    int x;
    int y;
    if ((child.getOwner() != null) && child.getOwner().isShowing()) {
        x = (parentSize.width - childSize.width) / 2;
        y = (parentSize.height - childSize.height) / 2;
        x += parentLocationOnScreen.x;
        y += parentLocationOnScreen.y;
    } else {
        x = (screenSize.width - childSize.width) / 2;
        y = (screenSize.height - childSize.height) / 2;
    }
    if (!absolute) {
        x /= 2;
        y /= 2;
    }
    child.setLocation(x, y);
}

8

Sử dụng dòng này sau pack()phương thức:

setLocation((Toolkit.getDefaultToolkit().getScreenSize().width)/2 - getWidth()/2, (Toolkit.getDefaultToolkit().getScreenSize().height)/2 - getHeight()/2);

5

đây là giải pháp của tôi để truy xuất kích thước màn hình với nhiều màn hình.

import java.awt.*;
import javax.swing.JFrame;

/**
 * Méthodes statiques pour récupérer les informations d'un écran.
 *
 * @author Jean-Claude Stritt
 * @version 1.0 / 24.2.2009
 */
public class ScreenInfo {

  /**
   * Permet de récupérer le numéro de l'écran par rapport à la fenêtre affichée.
   * @return le numéro 1, 2, ... (ID) de l'écran
   */
  public static int getScreenID( JFrame jf ) {
    int scrID = 1;
    GraphicsEnvironment ge = GraphicsEnvironment.getLocalGraphicsEnvironment();
    GraphicsDevice[] gd = ge.getScreenDevices();
    for (int i = 0; i < gd.length; i++) {
      GraphicsConfiguration gc = gd[i].getDefaultConfiguration();
      Rectangle r = gc.getBounds();
      if (r.contains(jf.getLocation())) {
        scrID = i+1;
      }
    }
    return scrID;
  }

  /**
   * Permet de récupérer la dimension (largeur, hauteur) en px d'un écran spécifié.
   * @param scrID --> le n° d'écran
   * @return la dimension (largeur, hauteur) en pixels de l'écran spécifié
   */
  public static Dimension getScreenDimension( int scrID ) {
    Dimension d = new Dimension(0, 0);
    if (scrID > 0) {
      GraphicsEnvironment ge = GraphicsEnvironment.getLocalGraphicsEnvironment();
      DisplayMode mode = ge.getScreenDevices()[scrID - 1].getDisplayMode();
      d.setSize(mode.getWidth(), mode.getHeight());
    }
    return d;
  }

  /**
   * Permet de récupérer la largeur en pixels d'un écran spécifié.
   * @param scrID --> le n° d'écran
   * @return la largeur en px de l'écran spécifié
   */
  public static int getScreenWidth( int scrID ) {
    Dimension d = getScreenDimension(scrID);
    return d.width;
  }

  /**
   * Permet de récupérer la hauteur en pixels d'un écran spécifié.
   * @param scrID --> le n° d'écran
   * @return la hauteur en px de l'écran spécifié
   */
  public static int getScreenHeight( int scrID ) {
    Dimension d = getScreenDimension(scrID);
    return d.height;
  }

}

cộng một vì sử dụng tiếng mẹ đẻ sẽ làm tăng chất lượng mã.
Felo Vilches

3

AFAIK, bạn có thể chuyển một GraphicEnosystem đến mỗi hàm tạo JDialog / JFrame / JWindow. Đối tượng này mô tả màn hình để sử dụng.

Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.