java - 单击 Jbutton 时,按钮会移动或标签文本会更改。我只想同时执行这两个操作

标签 java swing layout jlabel grid-layout

import java.awt.EventQueue;
import java.awt.GridLayout;
import java.awt.event.ActionEvent;
import javax.swing.AbstractAction;
import javax.swing.JButton;
import javax.swing.JFrame;
import javax.swing.JLabel;
import javax.swing.JPanel;

public class JavaGUI extends JPanel {

    private Control control = new Control();
    private Keys keys = new Keys("Original starting value.");

    public JavaGUI() {
        this.setLayout(new GridLayout(0, 1));
        this.add(keys);
        this.add(control);

        private class Control extends JPanel {

            public Control() {
                this.add(new JButton(new AbstractAction("Update") {

                    @Override
                    public void actionPerformed(ActionEvent e) {
                        System.out.println("Command: " + e.getActionCommand());
                        keys.string = String.valueOf(System.nanoTime());
                        //keys.label.setText(keys.string);  //remove comments cause button move
                        JButton j = (JButton) e.getSource();
                        j.setLocation(j.getX() + 10, j.getY() + 10);
                    }
                }));
            }
        }


        private class Keys extends JPanel {

            private String string;
            private JLabel label = new JLabel();

            public Keys(String s) {
                this.string = s;
                label.setText(s);
                this.add(label);
            }
        }


        private void display() {
            JFrame f = new JFrame("JavaGUI");
            f.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
            f.add(this);
            f.pack();
            f.setLocationRelativeTo(null);
            f.setVisible(true);
        }

        public static void main(String[] args) {
            EventQueue.invokeLater(new Runnable() {

                @Override
                public void run() {
                    new JavaGUI().display();
                }
            });
        }
    }

最佳答案

您正在使用 GridLayout,因此您不能随机移动组件。我建议您阅读 Laying Out Components Within a Container 上的 Swing 教程了解布局管理的工作原理。

关于java - 单击 Jbutton 时,按钮会移动或标签文本会更改。我只想同时执行这两个操作,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/14179058/

相关文章:

java - 将 byte[] 字符串转换为其整数值的快速方法

java - 使用 Pageable 和 Page 自定义 Spring Data Repository 方法

java - 在 Stream API 中使用 checked 装饰器函数是好的解决方案吗?

java - 如何设置水平滚动 Pane 的起始位置在右端?

java - Android - View.requestLayout 在 OnLayoutChangeListener 中不起作用

java - Android - 移动布局或动画项目到购物车

java - 如何在线程安全执行中编写util.logger?

java - GridBagLayout:仅当我横向扩展 JFrame 时 JPanel 才会出现

java - 将 JMenu 添加到我的 JPanel

layout - 通过 GraphicsColumn 在 Mathematica 中垂直对齐绘图