滚动窗格中的TextField无法正确显示

时间:2019-01-16 23:29:29

标签: java swing

如果向下滚动,则在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);
        }
    }
}

1 个答案:

答案 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教程中的部分,以获取更多信息。