如果向下滚动,则在ScrollPane中显示多个TextField时会出现问题。但是,如果我自己调整窗口大小,则会呈现缺少的TextField。我尝试了多种方法来渲染缺少的TextField,但无法使其正常工作。 Window
这是我在启动程序时构造的Window类:
public class Window {
private JFrame frame;
private JScrollPane scrollPane;
private Model model;
public Window() {
new Thread() {
{
setName("Window Thread");
}
public void run() {
initialize();
}
}.start();
}
private void initialize() {
frame = new JFrame();
frame.setBounds(100, 100, 1200, 600);
frame.setDefaultCloseOperation(JFrame.DO_NOTHING_ON_CLOSE);
frame.setResizable(false);
frame.setLayout(null);
scrollPane = new JScrollPane();
scrollPane.setVerticalScrollBarPolicy(ScrollPaneConstants.VERTICAL_SCROLLBAR_ALWAYS);
scrollPane.setHorizontalScrollBarPolicy(ScrollPaneConstants.HORIZONTAL_SCROLLBAR_ALWAYS);
scrollPane.setSize(frame.getWidth() - 10, frame.getHeight() - 30);
frame.add(scrollPane);
model = new ChatModel(frame.getWidth() - 10);
scrollPane.setViewportView(model);
frame.setVisible(true);
}
public void add(Data d) {
while (model == null) {
try {
Thread.sleep(1);
} catch (InterruptedException e) {
e.printStackTrace();
}
}
model.add(d);
}
}
这是一个面板,其中添加了带有我在其上编写的文本字段的面板:
public class Model extends Panel {
private ArrayList < Line > lines = new ArrayList < Line > ();
private final int width;
public Model(int width) {
this.width = width;
setLayout(null);
setBounds(getX(), getY(), width, 5 * 30);
setBackground(Color.RED);
}
public void add(Data d) {
synchronized(getTreeLock()) {
Line cl = new Line(d.txt, width);
lines.add(cl);
cl.setBounds(0, lines.size() * 30, width, 30);
add(cl);
setSize(width, (lines.size() + 1) * 30);
}
}
private class Line extends Panel {
TextField txt;
public ChatLine(String data, int width) {
setLayout(null);
txt = new TextField(textUserS);
txt.setBounds(0, 0, width, 30);
add(txt);
setBackground(Color.BLUE);
}
}
}
答案 0 :(得分:0)
不要在Swing应用程序中使用AWT组件。
Swing组件以“ J”开头(JTextField,JPanel等)。
请勿使用空布局。 Swing旨在与布局管理器一起使用。一方面,如果添加到视口的面板不使用布局管理器,则滚动窗格将无法正常工作。
在面板上动态添加组件时,基本逻辑是:
panel.add(...);
panel.revalidate();
panel.repaint();
不需要同步块。 Swing组件应从Event Dispatch Thread (EDT)
更新。如果您的代码未在EDT
上执行,则需要使用SwingUtilities.invokeLater(...)
将代码放置在EDT
上。阅读Concurrency上Swing教程中的部分,以获取更多信息。