在单击鼠标的位置添加了JTextField

时间:2018-03-15 07:28:54

标签: java swing jtextfield

我正在尝试在鼠标单击发生的位置添加JTextField。文本字段的大小应根据输入的文本而变化。以下是我的代码。

public class Paint {
    public static void main(String[] args) {
        final JFrame frame = new JFrame("Test TextField");
        frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        frame.setLayout(new BorderLayout());
        frame.setSize(400, 250);
        final JTextField text = new JTextField();
        frame.addMouseListener(new MouseListener() {
            @Override
            public void mouseClicked(MouseEvent me) {

            }
        });
        frame.setVisible(true);
    }
}

我想在鼠标单击发生的位置添加文本字段。文本字段的大小应根据在文本字段中输入的文本而增加。有人能告诉我如何实现鼠标点击方法来实现同样的目标吗?

我尝试使用事件x和y位置设置文本框的边界,如

text.setBounds(event.getX(), event.getY(), event.getX(), event.getY());

但是使用它,textField的大小与完整帧相同。但我想要一个不同大小的小文本框

1 个答案:

答案 0 :(得分:0)

首先,我们需要删除布局,以便能够在我们想要的地方添加组件

frame.setLayout(null);

然后,我们可以用以下方法检查事件的结果:

frame.addMouseListener(new MouseAdapter() {
    @Override
    public void mouseClicked(MouseEvent event) {
        System.out.println(event.getX() + " " + event.getY());
    }
}

我们可以注意到,如果我们点击左上角,我们就无法获得(0,0)坐标。由于A frame是完整的屏幕,因此我们需要使用ContentPane,或者我们只需使用JPanel即可保持简单。

final JPanel panel = new JPanel();
panel.setLayout(null);
frame.getContentPane().add(panel);
panel.addMouseListener(new MouseAdapter() {}); //Use the MouseAdapter to not be force to override the full interface of MouseListener.

现在,让我们点击添加一个组件。首先,我们在活动期间创建它(每次创建一个新的,我们设置大小:

final JTextField text = new JTextField();
text.setSize(new Dimension(50, 18)); //I took those randomly...

重要的部分是位置,将其设置为组件,如:

text.setLocation(event.getX(), event.getY());

并将其添加到面板

panel.add(text);

结果是在点击的特定位置添加了新的JTextField

完整测试代码

public static void main(String[] args) {
    final JFrame frame = new JFrame("Test TextField");
    frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
    frame.setSize(400, 250);

    final JPanel panel = new JPanel();
    panel.setLayout(null);
    panel.addMouseListener(new MouseAdapter() {
        @Override
        public void mouseClicked(MouseEvent event) {
            final JTextField text = new JTextField("abc");
            text.setLocation(event.getX(), event.getY());
            text.setSize(new Dimension(50, 18));
            panel.add(text);
        }
    });

    frame.getContentPane().add(panel);
    frame.setVisible(true);
}

请注意,这不是Swing的最佳用法,布局可以轻松构建高效的屏幕。