【发布时间】:2014-04-26 13:06:43
【问题描述】:
所以我正在使用 swing 制作类似于井字游戏的东西。我做了一个 GridLayout 和 9 个按钮,现在我希望我的一个 jbuttons 在我点击它时显示 jtextfield?我尝试使用 MouseListener,但没有设法以这种方式找到解决方案。有什么建议么?
【问题讨论】:
标签: java swing jbutton jtextfield
所以我正在使用 swing 制作类似于井字游戏的东西。我做了一个 GridLayout 和 9 个按钮,现在我希望我的一个 jbuttons 在我点击它时显示 jtextfield?我尝试使用 MouseListener,但没有设法以这种方式找到解决方案。有什么建议么?
【问题讨论】:
标签: java swing jbutton jtextfield
您可以创建自定义按钮。
一种方法是为按钮使用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();
}
});
}
}
【讨论】:
使用 addActionListener 为按钮添加合适的监听器。您可以使用 setVisible(boolean) 方法切换组件的可见性。但是,您可能必须在此操作之后调整窗口大小/重新绘制窗口。
编辑:如果你想替换整个窗口内容,你可能还想看看 Swing 的 CardLayout:http://docs.oracle.com/javase/tutorial/uiswing/layout/card.html
【讨论】: