【发布时间】:2018-01-05 09:19:43
【问题描述】:
我最近开始使用 Java+Swing 构建 UI,但我目前在使用 FlowLayout 的 JPanel 上放置 JTextField 时遇到问题。
在我的示例中,我有一个窗口,其中包含带有按钮的面板。单击该按钮会添加一个从 JPanel 派生并包含 JTextField 的组件。
问题是当我输入 JTextField 时它没有得到更新(没有调整大小)。但是,当我调整窗口大小或执行任何其他强制窗口/面板重绘的操作时,文本字段的大小将被调整(这正是我期望自动发生的)。
当我将基类从 JPanel 更改为 JTextField 时,它以我尝试实现的方式工作,但我需要将 JPanel 作为基类,以便我可以利用将子组件放入其中的优势。
我在这里检查了不同的问题,并在 Google 上搜索过试图找到解决方案,但它对我不起作用。我已经尝试在不同的组合和不同的组件中验证/无效/重新验证/重新绘制,并尝试对每个键入的字符强制重新验证,这对我来说听起来不是正确的方式。到目前为止,我明白这与布局管理器有关。
谁能帮助我理解它是如何工作的,以及我应该阅读哪些关于 Swing UI、布局管理和重绘如何工作的内容?
另外,如果有人可以帮助我解决我的代码的特定问题,我会很高兴。
提前致谢!
下面是我的代码:
import javax.swing.*;
import java.awt.*;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
class TagVisual extends JPanel /*JTextField*/ {
private JTextField editField;
public TagVisual() {
FlowLayout layout = new FlowLayout();
layout.setHgap(0);
layout.setVgap(0);
setLayout(layout);
editField = new JTextField();
editField.setBackground(Color.RED);
editField.addActionListener(new ActionListener() {
public void actionPerformed(ActionEvent e) {
editField.setSize(editField.getSize());
editField.revalidate();
remove(editField);
add(editField);
revalidate();
repaint();
}
});
add(editField, FlowLayout.LEFT);
}
public void place(JPanel panel) {
panel.add(this);
editField.grabFocus();
}
}
public class MainWindow {
private JPanel mainPanel;
private JButton btnPlace;
private JFrame frame;
public MainWindow(JFrame frame) {
mainPanel = new JPanel(new FlowLayout());
btnPlace = new JButton();
btnPlace.setText("Place");
mainPanel.add(btnPlace);
this.frame = frame;
btnPlace.addActionListener(new ActionListener() {
@Override
public void actionPerformed(ActionEvent e) {
TagVisual v = new TagVisual();
v.place(mainPanel);
mainPanel.revalidate();
mainPanel.repaint();
mainPanel.updateUI();
frame.revalidate();
frame.repaint();
}
});
}
public static void main(String[] args) {
JFrame frame = new JFrame("TextFieldUpdateIssue");
frame.setContentPane(new MainWindow(frame).mainPanel);
frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
frame.pack();
frame.setVisible(true);
}
}
【问题讨论】:
-
所以您希望您的文本字段根据输入的文本增加其大小?这不是正常的行为,作为用户,我会觉得这很讨厌......
-
是的,这就是我想要的。我正在创建标签编辑器组件,预计在键入时会增加其大小。
-
欢迎来到 SO。请发帖minimal reproducible example。此代码不会运行(
btnPlace和mainPanel永远不会初始化也不会添加到框架中) -
感谢指出,更新了代码。
标签: java swing jpanel jtextfield