Вопрос

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

Это было полезно?

Решение

От эта ссылка

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

Другие советы

Это должно работать во всех версиях 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);
}

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

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

Видеть Java-документация по графической среде для получения дополнительной информации о том, как это получить.

setLocationRelativeTo(null) следует вызывать после того, как вы используете setSize(x,y) или Pack().

В 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.

Наконец-то я получил этот набор кодов для работы в 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); 
    } 

}

ИЛИ

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

Следующее не работает для 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 размера экрана сверху.Вы можете использовать аналогичную концепцию.

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

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

Frame.setLocationRelativeTo(null);

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

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

    }
}

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

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

Пример:Внутри myWindow() в строке 3 находится код, необходимый для установки окна в центре экрана.

JFrame window;

public myWindow() {

    window = new JFrame();
    window.setSize(1200,800);
    window.setLocationRelativeTo(null); // this line set the window in the center of thr screen
    window.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
    window.getContentPane().setBackground(Color.BLACK);
    window.setLayout(null); // disable the default layout to use custom one.
    window.setVisible(true); // to show the window on the screen.
}

Собственно кадр.getHeight() и getwidth() не возвращает значения, проверьте это System.out.println(frame.getHeight()); напрямую укажите значения ширины и высоты, тогда в центре все будет работать нормально.например:как показано ниже

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

оба 450 — это ширина и высота моей рамки.

    public class SwingExample implements Runnable {

        @Override
        public void run() {

          // Create the window
          final JFrame f = new JFrame("Hello, World!");
          SwingExample.centerWindow(f);
          f.setPreferredSize(new Dimension(500, 250));
          f.setMaximumSize(new Dimension(10000, 200));
          f.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        }


        public static void centerWindow(JFrame frame) {

           Insets insets = frame.getInsets();
           frame.setSize(new Dimension(insets.left + insets.right + 500, insets.top + insets.bottom + 250));
           frame.setVisible(true);
           frame.setResizable(false);

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

Следующий код центрирует Window в центре текущего монитора (т.е. там, где находится указатель мыши).

public static final void centerWindow(final Window window) {
    GraphicsDevice screen = MouseInfo.getPointerInfo().getDevice();
    Rectangle r = screen.getDefaultConfiguration().getBounds();
    int x = (r.width - window.getWidth()) / 2 + r.x;
    int y = (r.height - window.getHeight()) / 2 + r.y;
    window.setLocation(x, y);
}

Вы также можете попробовать это.

       Frame frame = new Frame("Centered Frame");
       Dimension dimemsion = Toolkit.getDefaultToolkit().getScreenSize();
       frame.setLocation(dimemsion.width/2-frame.getSize().width/2, dimemsion.height/2-frame.getSize().height/2);
Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top