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

时间:2014-04-26 13:06:43

标签: java swing jbutton jtextfield

所以我正在使用挥杆来制作类似于井字游戏的东西。我制作了一个GridLayout和9个按钮,现在我想让我的一个jbuttons在点击它时显示jtextfield?我尝试使用MouseListener,但没有设法找到解决方案。有什么建议?

2 个答案:

答案 0 :(得分:2)

您可以创建自定义按钮。

一种方法是使用CardLayout按钮,并为其添加JTextFieldJLabel。在按钮的ActionListener中,如果按下该按钮,则显示文本字段并禁用该按钮。在字段中输入文本并按输入后,带有show的标签和按钮将被启用。

enter image description here enter image description here enter image description here

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();
            }
        });
    }
}

答案 1 :(得分:0)

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

编辑:如果您想要替换整个窗口内容,您可能还想看看Swing的CardLayout:http://docs.oracle.com/javase/tutorial/uiswing/layout/card.html