【问题标题】:How to click on JLabel, edit with JTextField and exit changing Jlabel?如何点击 JLabel,使用 JTextField 编辑并退出更改 Jlabel?
【发布时间】:2022-07-24 08:11:14
【问题描述】:

我正在尝试创建一个 GUI,在那个 GUI 中我有不同的 JLabel 值。我希望能够单击一个 JLabel 以在我的 JTextfield 中对其进行编辑(只有 1 个),并且在我按下回车后它应该离开 Editing the JLabel。目前,如果我尝试编辑 JLabel,它会改变,但是当我点击下一个时,旧的也会改变。

这是我的代码:

public class GUI {
JFrame frame;
int n1=1;
int n2=1;
int n3=1;
GUI(){
    frame=new JFrame();//creating instance of JFrame
    JLabel l1=new JLabel(Integer.toString(n1));
    JLabel l2=new JLabel(Integer.toString(n2));
    JLabel l3=new JLabel(Integer.toString(n3));
    JTextField t=new JTextField();

    l1.setBounds(40,50,100, 40);
    l2.setBounds(40,100,100, 40);
    l3.setBounds(40,150,100, 40);
    t.setBounds(20,200,100, 40);

    frame.add(l1);
    frame.add(l2);
    frame.add(l3);
    frame.add(t);


    l1.addMouseListener(new MouseAdapter() {
        @Override
        public void mouseClicked(MouseEvent e) {
            t.addActionListener(new ActionListener() {
                @Override
                public void actionPerformed(ActionEvent e) {
                    l1.setText(t.getText());
                    n1=parseInt(t.getText());
                }
            });
        }
    });

    l2.addMouseListener(new MouseAdapter() {
        @Override
        public void mouseClicked(MouseEvent e) {
            t.addActionListener(new ActionListener() {
                @Override
                public void actionPerformed(ActionEvent e) {
                    l2.setText(t.getText());
                    n2=parseInt(t.getText());
                }
            });
        }
    });



    frame.setSize(400,500);//400 width and 500 height
    frame.setLayout(null);//using no layout managers
    frame.setVisible(true);//making the frame visible
}

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

提前致谢。

  • 这让我问一个问题,为什么不简单地在不可编辑和可编辑之间切换无边界/透明JTextField

标签: java swing user-interface awt


【解决方案1】:

不要为每次点击添加动作监听器。单击标签应记录您的 UI 的状态——该标签现在正在被编辑,并在JTextField 中设置值。然后输入应将值传输到记录为选中的JLabel

import javax.swing.*;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.awt.event.MouseAdapter;
import java.awt.event.MouseEvent;

public class GUI {
    JLabel currentEditLabel = null;
    JFrame frame;
    int n1 = 1;
    int n2 = 1;
    int n3 = 1;

    GUI() {
        frame = new JFrame();//creating instance of JFrame
        JLabel l1 = new JLabel(Integer.toString(n1));
        JLabel l2 = new JLabel(Integer.toString(n2));
        JLabel l3 = new JLabel(Integer.toString(n3));
        JTextField t = new JTextField();

        l1.setBounds(40, 50, 100, 40);
        l2.setBounds(40, 100, 100, 40);
        l3.setBounds(40, 150, 100, 40);
        t.setBounds(20, 200, 100, 40);

        frame.add(l1);
        frame.add(l2);
        frame.add(l3);
        frame.add(t);

        t.addActionListener(new ActionListener() {
            @Override
            public void actionPerformed(ActionEvent e) {
                if (currentEditLabel != null) {
                    currentEditLabel.setText(t.getText());
                    currentEditLabel = null;
                }
            }
        });

        addMouseListener(l1, t);
        addMouseListener(l2, t);
        addMouseListener(l3, t);

        frame.setSize(400, 500);//400 width and 500 height
        frame.setLayout(null);//using no layout managers
        frame.setVisible(true);//making the frame visible
    }

    private void addMouseListener(JLabel label, JTextField t) {
        label.addMouseListener(new MouseAdapter() {
            @Override
            public void mouseClicked(MouseEvent e) {
                currentEditLabel = (JLabel) e.getComponent();
                t.setText(currentEditLabel.getText());
            }
        });
    }

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

弄清楚如何设置 n1, n2, ... 留作练习,就像如何在 UI 中指示未选择标签一样(提示:当未选择标签时,您是否应该允许在 JTextField 中输入? )

正如@kleopatra 所说,不使用布局管理器不是一个好习惯,就好像您的面板已调整大小(例如,您的程序将在移动设备上运行)您的组件可能会被隐藏,请参阅this discussion

这是使用简单布局管理器GridLayout 的代码。

注意事项:

  • 我已经删除了组件和框架的绝对定位和大小。
  • 框架现在可以调整大小,因此您可以看到布局管理器在大小更改时所做的工作。
  • JFrame 在显示之前是packed。

要获得完全符合您要求的布局,您可以查看GridBagLayout,还可以考虑使用简单的布局管理器嵌套容器。

import javax.swing.*;
import java.awt.*;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.awt.event.MouseAdapter;
import java.awt.event.MouseEvent;

public class GUI {
    JLabel currentEditLabel = null;
    JFrame frame;
    int n1 = 1;
    int n2 = 1;
    int n3 = 1;

    GUI() {
        frame = new JFrame();
        JLabel l1 = new JLabel(Integer.toString(n1));
        JLabel l2 = new JLabel(Integer.toString(n2));
        JLabel l3 = new JLabel(Integer.toString(n3));
        JTextField t = new JTextField();
        GridLayout layout = new GridLayout(4, 1, 10, 10);
        frame.setLayout(layout);
        frame.add(l1);
        frame.add(l2);
        frame.add(l3);
        frame.add(t);
        frame.setResizable(true);

        t.addActionListener(new ActionListener() {
            @Override
            public void actionPerformed(ActionEvent e) {
                if (currentEditLabel != null) {
                    currentEditLabel.setText(t.getText());
                    currentEditLabel = null;
                }
            }
        });

        addMouseListener(l1, t);
        addMouseListener(l2, t);
        addMouseListener(l3, t);
        frame.pack();
        frame.setVisible(true);//making the frame visible
    }

    private void addMouseListener(JLabel label, JTextField t) {
        label.addMouseListener(new MouseAdapter() {
            @Override
            public void mouseClicked(MouseEvent e) {
                currentEditLabel = (JLabel) e.getComponent();
                t.setText(currentEditLabel.getText());
            }
        });
    }

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

【讨论】:

  • 非常感谢这正是我想要的!也感谢您的提示,我将尝试弄清楚。
  • 很抱歉打扰您,但您是否有设置 n1、n2 的提示?
  • 您需要使用类似的方法,其中 mouseClicked 方法设置对包含 int 的对象的引用。您可以使用int[] 并将索引设置为更新,或者您可以使用AtomicInteger 并更新一个字段以指向相关的AtomicInteger
  • 不要使用空布局,这意味着不是传播问题中的错误
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2017-05-09
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2015-12-02
相关资源
最近更新 更多