【问题标题】:How to add JTextField on a JButton just by clicking?如何通过单击在 JButton 上添加 JTextField?
【发布时间】:2014-04-26 13:06:43
【问题描述】:

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

【问题讨论】:

    标签: java swing jbutton jtextfield


    【解决方案1】:

    您可以创建自定义按钮。

    一种方法是为按钮使用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();
                }
            });
        }
    }
    

    【讨论】:

      【解决方案2】:

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

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

      【讨论】:

      • 我不想替换整个窗口内容。只是在点击时用一些字符串填充按钮。即使使用 setVisible(true) 也无法正常工作。有点卡住了。
      • 您想显示 JTextField 还是填充按钮?您想对按钮单击或文本字段单击做出反应吗?不确定我是否了解您想要做什么。
      • 我希望 JTextField 出现在 JButton 的顶部,当我单击它(JButton)时,为了输入我可以保存的字符串或其他东西(我会处理稍后使用它,一旦我通过了这个)
      • 仍然不确定这是否是您想要的,但是:1)创建文本字段,但将可见性设置为false; 2)向按钮添加一个ActionListener。动作侦听器将文本字段的可见性设置为 true 并重新绘制/调整窗口大小。
      猜你喜欢
      • 2019-12-11
      • 1970-01-01
      • 2012-12-10
      • 2011-07-16
      • 2019-10-16
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多