JButton 文本会自行更改吗?
JButton text changes on its own?
下面的简单代码:
import java.awt.BorderLayout;
import javax.swing.JButton;
import javax.swing.JFrame;
import javax.swing.JPanel;
import javax.swing.JTextField;
import javax.swing.SwingUtilities;
public class ButtonTextMain {
public static void main(final String[] args) {
SwingUtilities.invokeLater(() -> {
final JTextField field = new JTextField(20);
final JButton button = new JButton("Click to change text");
button.addActionListener(e -> button.setText(field.getText()));
final JPanel panel = new JPanel(new BorderLayout());
panel.add(field, BorderLayout.CENTER);
panel.add(button, BorderLayout.PAGE_END);
final JFrame frame = new JFrame("Test");
frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
frame.getContentPane().add(panel);
frame.pack();
frame.setLocationRelativeTo(null);
frame.setVisible(true);
});
}
}
总是可以重现相同的错误(至少对于我的设置,如下所示)。
程序应该在单击按钮时根据文本字段的文本更改按钮文本。
问题是按钮的文本 reverts/changes 意外地自行恢复到原来的值。
当我在按钮和文本字段之间使用 Tab 到 alternate/navigate 时出现问题。以下是总是在我的设置中重现相同错误的具体步骤:
- 运行 程序。
- 将框架调整为比原来大一点。
- 在文本字段中键入一些短文本。
- 按 Tab 将焦点导航到按钮。
- 按空格键调用按钮。
- 按 Tab 将焦点导航回文本字段。
- 在文本字段中输入您喜欢的任何字母。
备注:
- 我知道第 2 步是相关的,因为如果我忽略它,那么错误就不会重现。
- 在第 2 步之后(和第 3 步之前),应该不再需要鼠标了。别管它。程序的焦点应该在程序启动时的文本字段中。
- 在第 3 步中,我通常会输入类似
abc
的内容,但对于我尝试过的任何其他输入,错误都会重现。
- 在第 6 步中,您还可以使用 Shift+Tab 导航回文本字段。
- 在第 7 步,输入第一个字母后,您会看到按钮的文本变回其 initial/previous 值。
我的第一个测试设置:
Apache NetBeans IDE 8.2,有点过时了。
java -version
产量:
java version "1.8.0_321"
Java(TM) SE Runtime Environment (build 1.8.0_321-b07)
Java HotSpot(TM) Client VM (build 25.321-b07, mixed mode)
javac -version
产生 javac 1.8.0_161
。这里和运行时环境不匹配。
我的第二个测试设置:
Apache NetBeans IDE 11.0.
java -version
产量:
java version "12.0.2" 2019-07-16
Java(TM) SE Runtime Environment (build 12.0.2+10)
Java HotSpot(TM) 64-Bit Server VM (build 12.0.2+10, mixed mode, sharing)
javac -version
产生 javac 12.0.2
.
操作系统在两种设置上都是 Windows 10。
所以问题是:我是不是做错了什么,如果是,请问是什么?首先,其他人能否重现我在他们的设置中遇到的错误?
更新:
我也可以在系统 L&F 上重现此行为,方法是:
UIManager.setLookAndFeel(UIManager.getSystemLookAndFeelClassName());
在 JTextField
创建之前(以及捕获异常等)。
我没有这个问题。
我使用 VScode、java 版本 1.8.0.25。
我认为问题出在你的编译器上。
根据以上评论,我重新测试了,现在我可以重现问题了。当您增加文本字段的垂直高度(最小量)时会出现此问题。
我想我之前只是通过增加文本字段的水平大小进行了测试。
我找到了一个简单的解决方法:
import java.awt.BorderLayout;
import javax.swing.JButton;
import javax.swing.JFrame;
import javax.swing.JPanel;
import javax.swing.JTextField;
import javax.swing.SwingUtilities;
public class ButtonTextMain {
public static void main(final String[] args) {
SwingUtilities.invokeLater(() -> {
final JTextField field = new JTextField(20);
final JButton button = new JButton("Click to change text");
button.addActionListener(e ->
{
button.setText(field.getText());
//button.getParent().revalidate();
button.getParent().repaint();
});
final JPanel panel = new JPanel(new BorderLayout());
panel.add(field, BorderLayout.CENTER);
panel.add(button, BorderLayout.PAGE_END);
final JFrame frame = new JFrame("Test");
frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
frame.setContentPane(panel);
frame.pack();
frame.setLocationRelativeTo(null);
frame.setVisible(true);
});
}
}
这对我来说绝对像是一个错误。
话虽如此,您很少希望增加文本字段的垂直高度。那么也许您可以找到一个只影响水平尺寸而不影响垂直高度的布局管理器?
下面的简单代码:
import java.awt.BorderLayout;
import javax.swing.JButton;
import javax.swing.JFrame;
import javax.swing.JPanel;
import javax.swing.JTextField;
import javax.swing.SwingUtilities;
public class ButtonTextMain {
public static void main(final String[] args) {
SwingUtilities.invokeLater(() -> {
final JTextField field = new JTextField(20);
final JButton button = new JButton("Click to change text");
button.addActionListener(e -> button.setText(field.getText()));
final JPanel panel = new JPanel(new BorderLayout());
panel.add(field, BorderLayout.CENTER);
panel.add(button, BorderLayout.PAGE_END);
final JFrame frame = new JFrame("Test");
frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
frame.getContentPane().add(panel);
frame.pack();
frame.setLocationRelativeTo(null);
frame.setVisible(true);
});
}
}
总是可以重现相同的错误(至少对于我的设置,如下所示)。
程序应该在单击按钮时根据文本字段的文本更改按钮文本。
问题是按钮的文本 reverts/changes 意外地自行恢复到原来的值。
当我在按钮和文本字段之间使用 Tab 到 alternate/navigate 时出现问题。以下是总是在我的设置中重现相同错误的具体步骤:
- 运行 程序。
- 将框架调整为比原来大一点。
- 在文本字段中键入一些短文本。
- 按 Tab 将焦点导航到按钮。
- 按空格键调用按钮。
- 按 Tab 将焦点导航回文本字段。
- 在文本字段中输入您喜欢的任何字母。
备注:
- 我知道第 2 步是相关的,因为如果我忽略它,那么错误就不会重现。
- 在第 2 步之后(和第 3 步之前),应该不再需要鼠标了。别管它。程序的焦点应该在程序启动时的文本字段中。
- 在第 3 步中,我通常会输入类似
abc
的内容,但对于我尝试过的任何其他输入,错误都会重现。 - 在第 6 步中,您还可以使用 Shift+Tab 导航回文本字段。
- 在第 7 步,输入第一个字母后,您会看到按钮的文本变回其 initial/previous 值。
我的第一个测试设置:
Apache NetBeans IDE 8.2,有点过时了。
java -version
产量:java version "1.8.0_321" Java(TM) SE Runtime Environment (build 1.8.0_321-b07) Java HotSpot(TM) Client VM (build 25.321-b07, mixed mode)
javac -version
产生javac 1.8.0_161
。这里和运行时环境不匹配。
我的第二个测试设置:
Apache NetBeans IDE 11.0.
java -version
产量:java version "12.0.2" 2019-07-16 Java(TM) SE Runtime Environment (build 12.0.2+10) Java HotSpot(TM) 64-Bit Server VM (build 12.0.2+10, mixed mode, sharing)
javac -version
产生javac 12.0.2
.
操作系统在两种设置上都是 Windows 10。
所以问题是:我是不是做错了什么,如果是,请问是什么?首先,其他人能否重现我在他们的设置中遇到的错误?
更新:
我也可以在系统 L&F 上重现此行为,方法是:
UIManager.setLookAndFeel(UIManager.getSystemLookAndFeelClassName());
在 JTextField
创建之前(以及捕获异常等)。
我没有这个问题。 我使用 VScode、java 版本 1.8.0.25。 我认为问题出在你的编译器上。
根据以上评论,我重新测试了,现在我可以重现问题了。当您增加文本字段的垂直高度(最小量)时会出现此问题。
我想我之前只是通过增加文本字段的水平大小进行了测试。
我找到了一个简单的解决方法:
import java.awt.BorderLayout;
import javax.swing.JButton;
import javax.swing.JFrame;
import javax.swing.JPanel;
import javax.swing.JTextField;
import javax.swing.SwingUtilities;
public class ButtonTextMain {
public static void main(final String[] args) {
SwingUtilities.invokeLater(() -> {
final JTextField field = new JTextField(20);
final JButton button = new JButton("Click to change text");
button.addActionListener(e ->
{
button.setText(field.getText());
//button.getParent().revalidate();
button.getParent().repaint();
});
final JPanel panel = new JPanel(new BorderLayout());
panel.add(field, BorderLayout.CENTER);
panel.add(button, BorderLayout.PAGE_END);
final JFrame frame = new JFrame("Test");
frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
frame.setContentPane(panel);
frame.pack();
frame.setLocationRelativeTo(null);
frame.setVisible(true);
});
}
}
这对我来说绝对像是一个错误。
话虽如此,您很少希望增加文本字段的垂直高度。那么也许您可以找到一个只影响水平尺寸而不影响垂直高度的布局管理器?