JDialog를 화면 중앙에 어떻게 배치합니까?


83

화면 중앙에 JDialog를 배치하려면 어떻게해야합니까?

답변:


158

Java 1.4 이상에서는 다음을 수행 할 수 있습니다.

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

또는 아마도 (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
null에 상대적인 위치를 설정하면 정확히 어떤 일이 발생합니까?
Mark Norgren

6
setSize ()를 사용할 필요가 없다고 추가하고 싶거나 그렇지 않으면 setLocationRelativeTo ()가 작동하지 않습니다. 모든 것이 제대로 보이도록하려면 setSize ()와 setPreferredSize ()를 모두 사용해야했습니다.
리처드

2
@marked의 질문에 대한 답변 : 구성 요소가 현재 표시되지 않거나 c가 null 인 경우 창은 화면 중앙에 배치됩니다. (java.awt.Window javadocs에서)
Jeremy Brooks

2
이 두 방법 모두 기본 모니터 (최소한 Windows에서는) 의 대화 상자 중앙 에 배치합니다 . setLocationRelativeTo다중 모니터 사용자를 위해 적절한 모니터에 대화 상자가 나타나도록 인수를 전달하는 것이 좋습니다.
Brad Mace

5
대화를 적절하게 중앙에 배치하려면 pack()전에 전화 setLocationRelativeTo(null)를 걸어야했습니다.
Matthias Braun 2015

8

화면 내 또는 부모 내에서 중앙에 배치하기위한 두 개의 도우미.

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

pack()방법 뒤에 다음 줄을 사용하십시오 .

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

5

여기에 여러 모니터로 화면 크기를 검색하는 솔루션이 있습니다.

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

}

하나의 모국어를 사용하면 코드 품질이 향상되기 때문입니다.
Felo Vilches 2011

3

AFAIK는 GraphicEnvironment를 각 JDialog / JFrame / JWindow 생성자에 전달할 수 있습니다. 이 개체는 사용할 모니터를 설명합니다.

당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.