Java Swing: компоненты автоматически меняют положение при обновлении определенного компонента - PullRequest
1 голос
/ 11 февраля 2020

Я создал программу Java, и часть функции программы - отслеживать пользовательские координаты мыши X и Y.

Отслеживание работает хорошо, но есть небольшая проблема, которая беспокоит меня.

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

Вот MRE (минимальный воспроизводимый пример):

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

public class Test {
    static Timer t;
    static JLabel label1;
    static InnerTest inner;
    static int mouseX;
    static int mouseY;

    public static void main(String[] args) {
        SwingUtilities.invokeLater(new Runnable() {
            public void run() {
                buildFrame();
                runTimer();
            }
        });
    }

    public static void buildFrame() {
        JFrame frame = new JFrame();
        label1 = new JLabel("Test1");
        JLabel label2 = new JLabel("Test Test");
        JLabel label3 = new JLabel("Test Label Label");

        JPanel panel = new JPanel();
        panel.setLayout(new BoxLayout(panel, BoxLayout.Y_AXIS));

        panel.add(label1);
        panel.add(label2);
        panel.add(label3);

        label1.setAlignmentX(Component.CENTER_ALIGNMENT);
        label2.setAlignmentX(Component.CENTER_ALIGNMENT);
        label3.setAlignmentX(Component.CENTER_ALIGNMENT);

        frame.getContentPane().add(panel);
        frame.setSize(400, 200);
        frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        frame.setVisible(true);
    }

    public static void runTimer() {
        inner = new InnerTest();
        t = new Timer(20, inner);
        t.start();
    }

    static class InnerTest implements ActionListener {
        public void actionPerformed(ActionEvent e) {
            mouseX = MouseInfo.getPointerInfo().getLocation().x * 100;
            mouseY = MouseInfo.getPointerInfo().getLocation().y * 100;
            label1.setText(" ( "+String.valueOf(mouseX)+" , "+String.valueOf(mouseY)+" )");
        }
    }
}

Как сохранять компоненты неподвижными, когда другой компонент обновляется?

1 Ответ

1 голос
/ 11 февраля 2020

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

Решение состоит в том, чтобы отделить верхнюю метку от двух других меток.

Один из способов будет:

    //panel.add(label1);
    panel.add(label2);
    panel.add(label3);

    //label1.setAlignmentX(Component.CENTER_ALIGNMENT);
    label1.setHorizontalAlignment(JLabel.CENTER); // added
    label2.setAlignmentX(Component.CENTER_ALIGNMENT);
    label3.setAlignmentX(Component.CENTER_ALIGNMENT);

    frame.add(label1, BorderLayout.PAGE_START); // added
    frame.getContentPane().add(panel);
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...