Java Swing Адаптивное Абсолютное Позиционирование - PullRequest
0 голосов
/ 31 августа 2018

Я новичок в java swing gui и не могу понять эту проблему Предположим, у меня есть размер Jframe 100,100 У меня есть 4 позиции кнопки

        left top widht height
button1 0    0   10    10 // left up
button2 90   0   10    10 // right up
button3 45   45  10    10 // middle
button4 0    90  10    10 // left down
button5 90   90  10    10 // right down

Все размеры по ширине левого верха в масштабе от 100 100

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

Например, после запуска графического интерфейса пользователя, если я изменяю фрейм на 400 200, тогда новые позиции должны быть

button1 0    0   40   20 // left up
button2 360  0   40   20 // right up
button3 180  90  40   20 // middle
button4 0    180 40   20 // left down
button5 360  180 40   20 // right down

х фактор = 400/100 = 4 и у фактор = 200/100 = 2

Как я могу выслушать изменения Jframe с 100 100 до 400 200 и развить подход, описанный выше. Любая информация приветствуется.

EDIT

Я получаю высоту левой верхней высоты от другого сервиса, и мой пример может быть как

        left top widht height
button1 01   04  11    14  
button2 91   0   10    10    
button3 44   45  9     14  
button4 0    90  10    10 
button5 90   90  1     1 

1 Ответ

0 голосов
/ 31 августа 2018

Мне нужно использовать абсолютное позиционирование

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

API управления макетом предназначен для выполнения именно того, о чем вы просите, лучше использовать его и сохранить свои волосы.

Это довольно простой пример использования GridBagLayout, и да, если бы кнопки имели разную высоту, они все равно справились бы

SmallBig

import java.awt.EventQueue;
import java.awt.GridBagConstraints;
import java.awt.GridBagLayout;
import javax.swing.JButton;
import javax.swing.JFrame;
import javax.swing.JPanel;
import javax.swing.UIManager;
import javax.swing.UnsupportedLookAndFeelException;

public class Test {

    public static void main(String[] args) {
        new Test();
    }

    public Test() {
        EventQueue.invokeLater(new Runnable() {
            @Override
            public void run() {
                try {
                    UIManager.setLookAndFeel(UIManager.getSystemLookAndFeelClassName());
                } catch (ClassNotFoundException | InstantiationException | IllegalAccessException | UnsupportedLookAndFeelException ex) {
                    ex.printStackTrace();
                }

                JFrame frame = new JFrame("Testing");
                frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
                frame.add(new TestPane());
                frame.pack();
                frame.setLocationRelativeTo(null);
                frame.setVisible(true);
            }
        });
    }

    public class TestPane extends JPanel {

        public TestPane() {
            setLayout(new GridBagLayout());

            GridBagConstraints gbc = new GridBagConstraints();
            // Common properties...
            gbc.weightx = 0.5;
            gbc.weighty = 0.333;
            // Top/left
            gbc.gridx = 0;
            gbc.gridy = 0;
            gbc.anchor = GridBagConstraints.NORTHWEST;
            add(new JButton("Top left is all mine"), gbc);
            // Top/right
            gbc.gridx = 2;
            gbc.gridy = 0;
            gbc.anchor = GridBagConstraints.NORTHEAST;
            add(new JButton("Top right mine, keep out"), gbc);

            // middle
            gbc.gridx = 1;
            gbc.gridy = 1;
            gbc.anchor = GridBagConstraints.CENTER;
            add(new JButton("My precious"), gbc);

            // bottom/left
            gbc.gridx = 0;
            gbc.gridy = 2;
            gbc.anchor = GridBagConstraints.SOUTHWEST;
            add(new JButton("Got this space covered"), gbc);
            // bottom/right
            gbc.gridx = 2;
            gbc.gridy = 2;
            gbc.anchor = GridBagConstraints.SOUTHEAST;
            add(new JButton("Why is every one so unfriendly?"), gbc);
        }

    }

}

получил высокие кнопки ...

Big buttons

Получил это автоматически,

...