Выравнивание GroupLayout по центру экрана в Java Swing? - PullRequest
1 голос
/ 09 декабря 2011

Так что, если у меня есть GUI, как это:

import javax.swing.GroupLayout;
public class MyTest extends javax.swing.JFrame {

    public MyTest() {
        initComponents();
    }

    private void initComponents() {

        setDefaultCloseOperation(javax.swing.WindowConstants.EXIT_ON_CLOSE);
        setTitle("This is a sample GUI");

        GroupLayout layout = new GroupLayout(getContentPane());
        getContentPane().setLayout(layout);

        layout.setHorizontalGroup(
            layout.createParallelGroup(GroupLayout.Alignment.LEADING)
            .addGap(0, 244, Short.MAX_VALUE)
        );
        layout.setVerticalGroup(
            layout.createParallelGroup(GroupLayout.Alignment.LEADING)
            .addGap(0, 85, Short.MAX_VALUE)
        );

        pack();
    }

    public static void main(String args[]) {
        java.awt.EventQueue.invokeLater(new Runnable() {
            public void run() {
                new MyTest().setVisible(true);
            }
        });
    }   
}

Теперь, когда я запускаю программу, она выравнивается по позиции (0,0) в верхнем левом углу экрана. В любом случае я могу выровнять это по центру экрана или в другую пользовательскую позицию?
Это прекрасно работает, если я использую только фрейм без использования GroupLayout, как с setLocation (слева, сверху), но с этой реализацией, как я могу изменить расположение по умолчанию этого GUI?

Ответы [ 3 ]

4 голосов
/ 09 декабря 2011

Поместите contianer с GroupLayout как отдельный компонент GridBagLayout без ограничений. Весь контейнер будет отцентрирован.


Мне просто нужно центрировать весь графический интерфейс пользователя (с чем-либо в нем) по центру экрана,

Это имеет ничего , связанного с GroupLayout и всего , связанного с setLocationRelativeTo(null). Но прочитайте Как лучше позиционировать Swing GUI , чтобы еще лучше расположить графический интерфейс на экране (то есть в более разумном месте, чем центр экрана - пример ниже).

image

3 голосов
/ 12 декабря 2011

Как я уже упоминал в вашем предыдущем вопросе, прежде чем я подумал, что вы имеете в виду центрирование самого фрейма - используйте GridBagLayout без ограничений.Это даст эффект помещения компонента в центр родительского контейнера .Обратите внимание, что поскольку рамка имеет декорации окон, это означает, что сам «родительский контейнер» находится чуть ниже центра экрана.Если это проблема, единственное «исправление», о котором я могу подумать, - это использование недекорированной рамки.

Я помещаю «исправление» в кавычки, потому что я думаю, что это требование нарушено.*

Centered GroupLayout

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

public class MyTest extends JFrame {

    public MyTest() {
        initComponents();
    }

    private void initComponents() {

        setDefaultCloseOperation(WindowConstants.EXIT_ON_CLOSE);
        setTitle("This is a sample GUI");
        getContentPane().setLayout(new GridBagLayout());

        JPanel gui = new JPanel();
        gui.setBackground(Color.GREEN);

        GroupLayout layout = new GroupLayout(gui);
        gui.setLayout(layout);

        layout.setHorizontalGroup(
            layout.createParallelGroup(GroupLayout.Alignment.LEADING)
            .addGap(0, 244, Short.MAX_VALUE)
        );
        layout.setVerticalGroup(
            layout.createParallelGroup(GroupLayout.Alignment.LEADING)
            .addGap(0, 85, Short.MAX_VALUE)
        );

        add(gui);

        pack();
        setExtendedState(Frame.MAXIMIZED_BOTH );
    }

    public static void main(String args[]) {
        java.awt.EventQueue.invokeLater(new Runnable() {
            public void run() {
                new MyTest().setVisible(true);
            }
        });
    }
}
0 голосов
/ 15 декабря 2011

Полагаю, вы ответили на вопрос, но мне было не совсем понятно, как его использовать. Просто позвоните ниже перед пакетом (); было именно то, что я искал:

this.setLocation(500,300); //value left, top in pixes
pack();  

Так что в основном мне нужно было знать точное использование setLocation(x,y); и это с использованием ключевого слова "this", спасибо.

...