Java 如何通过单击在JButton上添加JTextField?

Java 如何通过单击在JButton上添加JTextField?,java,swing,jbutton,jtextfield,Java,Swing,Jbutton,Jtextfield,所以我用swing做了一些类似于tic-tac-toe的东西。我制作了一个GridLayout和9个按钮,现在我想让我的一个JButton在单击它时显示jtextfield?我尝试使用MouseListener,但没有找到这样的解决方案。有什么建议吗 使用addActionListener向按钮添加合适的侦听器。可以使用setVisible(布尔)方法切换零部件的可见性。但是,执行此操作后,可能必须调整窗口的大小/重新绘制窗口 编辑:如果要替换整个窗口内容,还可以查看Swing的CardLayo

所以我用swing做了一些类似于tic-tac-toe的东西。我制作了一个GridLayout和9个按钮,现在我想让我的一个JButton在单击它时显示jtextfield?我尝试使用MouseListener,但没有找到这样的解决方案。有什么建议吗

使用addActionListener向按钮添加合适的侦听器。可以使用setVisible(布尔)方法切换零部件的可见性。但是,执行此操作后,可能必须调整窗口的大小/重新绘制窗口


编辑:如果要替换整个窗口内容,还可以查看Swing的CardLayout:

您可以创建一个自定义按钮

一种方法是对按钮使用
CardLayout
,并向其添加
JTextField
JLabel
。在按钮的
ActionListener
中,如果按下按钮,则显示文本字段并禁用按钮。在字段中输入文本并按enter键后,将显示标签并启用按钮

import java.awt.CardLayout;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import javax.swing.JButton;
import javax.swing.JFrame;
import javax.swing.JLabel;
import javax.swing.JTextField;
import javax.swing.SwingConstants;
import javax.swing.SwingUtilities;

public class TestButtonTextField {
    public TestButtonTextField() {
        JFrame frame = new JFrame();
        frame.add(new TextFieldButton("Hello"));
        frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        frame.pack();
        frame.setLocationRelativeTo(null);
        frame.setVisible(true);
    }

    protected class TextFieldButton extends JButton {

        private static final String FIELD = "field";
        private static final String LABEL = "label";

        private final CardLayout layout = new CardLayout();
        private final JLabel label;

        public TextFieldButton(String text) {
            super();
            setLayout(layout);

            label = new JLabel(text);
            label.setHorizontalAlignment(SwingConstants.CENTER);
            this.add(label, LABEL);

            final JTextField field = createField();
            this.add(field, FIELD);

            this.addActionListener(new ActionListener(){
                public void actionPerformed(ActionEvent e) {
                    layout.show(TextFieldButton.this, FIELD);
                    TextFieldButton.this.setEnabled(false);
                }
            });

        }

        private JTextField createField() {
            final JTextField field = new JTextField(5);
            field.addActionListener(new ActionListener(){
                public void actionPerformed(ActionEvent e) {
                    label.setText(field.getText());
                    field.setText("");
                    layout.show(TextFieldButton.this, LABEL);
                    TextFieldButton.this.setEnabled(true);
                }
            });
            return field;
        }
    }

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


我不想替换整个窗口内容。只需在单击时用一些字符串填充按钮。它甚至在setVisible(true)下也不起作用。有点被卡住了。您想显示JTextField还是填充按钮?您希望在单击按钮或单击文本字段时做出反应吗?我不确定我是否理解您想要做什么。我希望当我单击JButton(JButton)时,JTextField会出现在JButton的顶部,以便键入一个字符串,我可以保存它或做其他事情(我稍后会处理它的用法,一旦我通过了它),我仍然不确定这是否是您想要的,但是:1)创建textfield,但将可见性设置为false;2) 将ActionListener添加到按钮。操作侦听器将文本字段的可见性设置为true,并重新绘制/调整窗口大小。