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 时出现问题。以下是总是在我的设置中重现相同错误的具体步骤:

  1. 运行 程序。
  2. 将框架调整为比原来大一点。
  3. 在文本字段中键入一些短文本。
  4. Tab 将焦点导航到按钮。
  5. 空格键调用按钮。
  6. Tab 将焦点导航回文本字段。
  7. 在文本字段中输入您喜欢的任何字母。

备注:

我的第一个测试设置:

我的第二个测试设置:

操作系统在两种设置上都是 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);
        });
    }
}

这对我来说绝对像是一个错误。

话虽如此,您很少希望增加文本字段的垂直高度。那么也许您可以找到一个只影响水平尺寸而不影响垂直高度的布局管理器?