我最近开始使用Java + Swing构建用户界面,而我目前在JPanel上使用FlowLayout放置JTextField时遇到问题。Swing:JPanel中的JTextField,重绘问题
在我的例子中,我有一个窗口,包含带按钮的面板。单击该按钮将添加一个派生自JPanel并包含JTextField的组件。
问题是,当我键入JTextField时,它不会被更新(不会被调整大小)。但是,当我调整窗口大小或做其他任何强制窗口/面板重绘的东西时,文本字段被调整大小(正如我期望自动发生的那样)。
当我将基类从JPanel更改为JTextField时,它以我尝试实现的方式工作,但我需要将JPanel作为基类,以便可以利用将子组件添加到基类中。
我已经检查了不同的问题,以及我已经谷歌试图找到解决方案,但它没有为我工作。我尝试过使用不同的组合和不同的组件对validate/invalidate/revalidate/repaint进行尝试,以及试图对每个输入的字符执行重新验证,这对我来说听起来并不正确。到目前为止,我强调这与布局管理器有关。
任何人都可以请帮助我了解这是如何工作的,我应该阅读关于如何摆动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);
}
}
所以你希望你的文本字段根据输入的文本增加其大小?这不是正常的行为,作为一个用户,我会发现它很讨厌... – Ansharja
是的,这是我想要的。我正在创建标签编辑器组件,预计在键入时会增加它的大小。 –
欢迎来到SO。请发布[mcve]。此代码不会运行('btnPlace'和'mainPanel'永远不会初始化也不会添加到框架中) – c0der