Как центрировать окно в Java? - PullRequest
101 голосов
/ 28 сентября 2008

Какой самый простой способ центрировать java.awt.Window, например, JFrame или JDialog?

Ответы [ 15 ]

230 голосов
/ 28 сентября 2008

С по этой ссылке

Если вы используете Java 1.4 или новее, Вы можете использовать простой метод setLocationRelativeTo (null) на диалоговое окно, рамка или окно по центру это.

64 голосов
/ 28 сентября 2008

Это должно работать во всех версиях Java

public static void centreWindow(Window frame) {
    Dimension dimension = Toolkit.getDefaultToolkit().getScreenSize();
    int x = (int) ((dimension.getWidth() - frame.getWidth()) / 2);
    int y = (int) ((dimension.getHeight() - frame.getHeight()) / 2);
    frame.setLocation(x, y);
}
24 голосов
/ 30 сентября 2008

Обратите внимание, что методы setLocationRelativeTo (null) и Tookit.getDefaultToolkit (). GetScreenSize () работают только для основного монитора. Если вы работаете в среде с несколькими мониторами, вам может потребоваться получить информацию о конкретном мониторе, в котором включено окно, прежде чем выполнять такие вычисления.

Иногда важно, иногда нет ...

См. GraphicsEnvironment javadocs для получения дополнительной информации о том, как получить это.

22 голосов
/ 02 мая 2013

setLocationRelativeTo (null) следует вызывать после использования setSize (x, y) или pack ().

15 голосов
/ 03 ноября 2013

В Linux код

    setLocationRelativeTo(null)

Размещайте мое окно в случайном месте каждый раз, когда я запускаю его, в мультиэкранной среде. И код

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

"разрезал" окно пополам, поместив его точно в центр, который находится между моими двумя дисплеями. Я использовал следующий метод для центрирования:

private void setWindowPosition(JFrame window, int screen)
{        
    GraphicsEnvironment env = GraphicsEnvironment.getLocalGraphicsEnvironment();
    GraphicsDevice[] allDevices = env.getScreenDevices();
    int topLeftX, topLeftY, screenX, screenY, windowPosX, windowPosY;

    if (screen < allDevices.length && screen > -1)
    {
        topLeftX = allDevices[screen].getDefaultConfiguration().getBounds().x;
        topLeftY = allDevices[screen].getDefaultConfiguration().getBounds().y;

        screenX  = allDevices[screen].getDefaultConfiguration().getBounds().width;
        screenY  = allDevices[screen].getDefaultConfiguration().getBounds().height;
    }
    else
    {
        topLeftX = allDevices[0].getDefaultConfiguration().getBounds().x;
        topLeftY = allDevices[0].getDefaultConfiguration().getBounds().y;

        screenX  = allDevices[0].getDefaultConfiguration().getBounds().width;
        screenY  = allDevices[0].getDefaultConfiguration().getBounds().height;
    }

    windowPosX = ((screenX - window.getWidth())  / 2) + topLeftX;
    windowPosY = ((screenY - window.getHeight()) / 2) + topLeftY;

    window.setLocation(windowPosX, windowPosY);
}

Заставляет окно появляться прямо в центре первого дисплея. Вероятно, это не самое простое решение.

Правильно работает в Linux, Windows и Mac.

4 голосов
/ 12 апреля 2015

Я наконец получил эту кучу кодов для работы в NetBeans с использованием Swing GUI Forms для центрирования основного jFrame:

package my.SampleUIdemo;
import java.awt.*;

public class classSampleUIdemo extends javax.swing.JFrame {
    /// 
    public classSampleUIdemo() {
        initComponents();
        CenteredFrame(this);  // <--- Here ya go.
    }
    // ...
    // void main() and other public method declarations here...

    ///  modular approach
    public void CenteredFrame(javax.swing.JFrame objFrame){
        Dimension objDimension = Toolkit.getDefaultToolkit().getScreenSize();
        int iCoordX = (objDimension.width - objFrame.getWidth()) / 2;
        int iCoordY = (objDimension.height - objFrame.getHeight()) / 2;
        objFrame.setLocation(iCoordX, iCoordY); 
    } 

}

OR

package my.SampleUIdemo;
import java.awt.*;

public class classSampleUIdemo extends javax.swing.JFrame {
        /// 
        public classSampleUIdemo() {
            initComponents(); 
            //------>> Insert your code here to center main jFrame.
            Dimension objDimension = Toolkit.getDefaultToolkit().getScreenSize();
            int iCoordX = (objDimension.width - this.getWidth()) / 2;
            int iCoordY = (objDimension.height - this.getHeight()) / 2;
            this.setLocation(iCoordX, iCoordY); 
            //------>> 
        } 
        // ...
        // void main() and other public method declarations here...

}

ИЛИ

    package my.SampleUIdemo;
    import java.awt.*;
    public class classSampleUIdemo extends javax.swing.JFrame {
         /// 
         public classSampleUIdemo() {
             initComponents();
             this.setLocationRelativeTo(null);  // <<--- plain and simple
         }
         // ...
         // void main() and other public method declarations here...
   }
3 голосов
/ 02 мая 2017

ниже - код для отображения кадра в центре верхней части существующего окна.

public class SwingContainerDemo {

private JFrame mainFrame;

private JPanel controlPanel;

private JLabel msglabel;

Frame.setLayout(new FlowLayout());

  mainFrame.addWindowListener(new WindowAdapter() {
     public void windowClosing(WindowEvent windowEvent){
        System.exit(0);
     }        
  });    
  //headerLabel = new JLabel("", JLabel.CENTER);        
 /* statusLabel = new JLabel("",JLabel.CENTER);    
  statusLabel.setSize(350,100);
 */ msglabel = new JLabel("Welcome to TutorialsPoint SWING Tutorial.", JLabel.CENTER);

  controlPanel = new JPanel();
  controlPanel.setLayout(new FlowLayout());

  //mainFrame.add(headerLabel);
  mainFrame.add(controlPanel);
 // mainFrame.add(statusLabel);

  mainFrame.setUndecorated(true);
  mainFrame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
  mainFrame.getRootPane().setWindowDecorationStyle(JRootPane.NONE);
  mainFrame.setVisible(true);  

  centreWindow(mainFrame);

}

public static void centreWindow(Window frame) {
    Dimension dimension = Toolkit.getDefaultToolkit().getScreenSize();
    int x = (int) ((dimension.getWidth() - frame.getWidth()) / 2);
    int y = (int) ((dimension.getHeight() - frame.getHeight()) / 2);
    frame.setLocation(x, 0);
}


public void showJFrameDemo(){
 /* headerLabel.setText("Container in action: JFrame");   */
  final JFrame frame = new JFrame();
  frame.setSize(300, 300);
  frame.setLayout(new FlowLayout());       
  frame.add(msglabel);

  frame.addWindowListener(new WindowAdapter() {
     public void windowClosing(WindowEvent windowEvent){
        frame.dispose();
     }        
  });    



  JButton okButton = new JButton("Capture");
  okButton.addActionListener(new ActionListener() {
     public void actionPerformed(ActionEvent e) {
  //      statusLabel.setText("A Frame shown to the user.");
      //  frame.setVisible(true);
        mainFrame.setState(Frame.ICONIFIED);
        Robot robot = null;
        try {
            robot = new Robot();
        } catch (AWTException e1) {
            // TODO Auto-generated catch block
            e1.printStackTrace();
        }
        final Dimension screenSize = Toolkit.getDefaultToolkit().
                getScreenSize();
        final BufferedImage screen = robot.createScreenCapture(
                new Rectangle(screenSize));

        SwingUtilities.invokeLater(new Runnable() {
            public void run() {
                new ScreenCaptureRectangle(screen);
            }
        });
        mainFrame.setState(Frame.NORMAL);
     }
  });
  controlPanel.add(okButton);
  mainFrame.setVisible(true);  

} public static void main (String [] args) выдает исключение {

new SwingContainerDemo().showJFrameDemo();

}

Ниже приведен результат вышеприведенного фрагмента кода: enter image description here

3 голосов
/ 30 сентября 2012

Следующее не работает для JDK 1.7.0.07:

frame.setLocationRelativeTo(null);

Он помещает верхний левый угол в центр - не то же самое, что центрирование окна. Другой не работает, включая frame.getSize () и dimension.getSize ():

Dimension dimension = Toolkit.getDefaultToolkit().getScreenSize();
int x = (int) ((dimension.getWidth() - frame.getWidth()) / 2);
int y = (int) ((dimension.getHeight() - frame.getHeight()) / 2);
frame.setLocation(x, y);

Метод getSize () унаследован от класса Component, и поэтому frame.getSize также возвращает размер окна. Таким образом, вычитая половину вертикальных и горизонтальных размеров из вертикальных и горизонтальных размеров, чтобы найти координаты x, y места для размещения верхнего левого угла, вы получите местоположение центральной точки, которая также заканчивается центрированием окна. Тем не менее, первая строка приведенного выше кода полезна, «Размер ...». Просто сделайте это, чтобы центрировать это:

Dimension dimension = Toolkit.getDefaultToolkit().getScreenSize();
JLabel emptyLabel = new JLabel("");
emptyLabel.setPreferredSize(new Dimension( (int)dimension.getWidth() / 2, (int)dimension.getHeight()/2 ));
frame.getContentPane().add(emptyLabel, BorderLayout.CENTER);
frame.setLocation((int)dimension.getWidth()/4, (int)dimension.getHeight()/4);

JLabel устанавливает размер экрана. Он находится в FrameDemo.java, доступном в руководствах по Java на сайте Oracle / Sun. Я установил его на половину высоты / ширины экрана. Затем я центрировал его, поместив верхний левый угол на 1/4 размера экрана слева и на 1/4 размера экрана сверху. Вы можете использовать аналогичную концепцию.

2 голосов
/ 15 марта 2015

Есть что-то действительно простое, что вы можете упустить из виду после попытки центрировать окно, используя либо setLocationRelativeTo(null), либо setLocation(x,y), и это в конечном итоге будет немного смещено от центра.

Убедитесь, что вы используете один из этих методов после вызова pack(), потому что вы в конечном итоге будете использовать размеры самого окна, чтобы вычислить, где его разместить на экране. До тех пор, пока не будет вызван pack(), измерения не являются тем, что вы думаете, поэтому отбрасываете вычисления для центрирования окна. Надеюсь, это поможет.

2 голосов
/ 13 сентября 2011

frame.setLocationRelativeTo (нуль);

Полный пример:

    public class BorderLayoutPanel {

    private JFrame mainFrame;
    private JButton btnLeft, btnRight, btnTop, btnBottom, btnCenter;

    public BorderLayoutPanel() {
        mainFrame = new JFrame("Border Layout Example");
        btnLeft = new JButton("LEFT");
        btnRight = new JButton("RIGHT");
        btnTop = new JButton("TOP");
        btnBottom = new JButton("BOTTOM");
        btnCenter = new JButton("CENTER");
    }

    public void SetLayout() {
        mainFrame.add(btnTop, BorderLayout.NORTH);
        mainFrame.add(btnBottom, BorderLayout.SOUTH);
        mainFrame.add(btnLeft, BorderLayout.EAST);
        mainFrame.add(btnRight, BorderLayout.WEST);
        mainFrame.add(btnCenter, BorderLayout.CENTER);
//        mainFrame.setSize(200, 200);
//        or
                mainFrame.pack();
        mainFrame.setVisible(true);

        //take up the default look and feel specified by windows themes
        mainFrame.setDefaultLookAndFeelDecorated(true);

        //make the window startup position be centered
        mainFrame.setLocationRelativeTo(null);


        mainFrame.setDefaultCloseOperation(mainFrame.EXIT_ON_CLOSE);

    }
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...