У меня проблема с отображением нескольких TextFields внутри ScrollPane, если я прокручиваю его вниз. Но, тем не менее, если я сам изменю размер окна, недостающие TextFields будут отображены. Я пробовал несколько способов рендеринга отсутствующих TextFields, но я не мог заставить его работать.
Окно
Это класс 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);
}
}
}