java - 滚动 Pane 不工作

标签 java swing jscrollpane jtextarea

我正在尝试将大量数据(成员(member)记录)输出到 JTextArea,然后将其转储到 scrollPane。这是代码。

package Ginfo;

import java.awt.*;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import javax.swing.*;
import java.io.*;


public class ReviewAll extends JFrame implements ActionListener {
    Container RA;
    JPanel ReviewAll;
    JTextArea output;
    JButton back, quit;

    Message m;
    ConnectInfo c;
    ObjectOutputStream oout;
    ObjectInputStream oin;

    public ReviewAll(ObjectOutputStream oout2, ObjectInputStream oin2,
            Message m2, ConnectInfo a) {
        super("Full results");
        m = m2;
        c = a;
        oout = oout2;
        oin = oin2;
        try {
            oout.reset();
        } catch (IOException e) {

        }
        RA = getContentPane();
        BuildGUI();
        RA.add(ReviewAll);
        pack();
        setLocationRelativeTo(null);
        setVisible(true);

        try {
            m.type = Message.REVIEWALL;
            oout.writeObject(m);
            while (!m.response.equals("End of list")) {
                m = (Message) oin.readObject();
                output.append("Member: " + m.main + "\n");
                output.append("Invited by: " + m.invitedBy + " on " + m.when
                        + "\n");
                output.append("Recommended by: " + m.HDTH + "\n\n");
            }
            m.response = "";

        } catch (IOException e) {
            e.printStackTrace();
        } catch (ClassNotFoundException e) {
            e.printStackTrace();
        }

    }

    private void BuildGUI() {
        ReviewAll = new JPanel();
        output = new JTextArea();
        output.setPreferredSize(new Dimension(400, 400));
        output.setEditable(false);
        JScrollPane scrollPane = new JScrollPane(output);
        scrollPane
                .setVerticalScrollBarPolicy(ScrollPaneConstants.VERTICAL_SCROLLBAR_ALWAYS);
        back = new JButton("Close window");
        quit = new JButton("Exit Program");

        ReviewAll.add(scrollPane, BorderLayout.NORTH);
        ReviewAll.add(back, BorderLayout.SOUTH);
        ReviewAll.add(quit, BorderLayout.SOUTH);

        back.addActionListener(this);
        quit.addActionListener(this);
    }

    public void actionPerformed(ActionEvent re) {
        if (re.getSource() == back) {
            new WhatToDo(oout, oin, m, c);
            dispose();
        } else if (re.getSource() == quit) {
            if (oout != null) {
                try {
                    oout.flush();
                    oout.close();
                    oin.close();
                } catch (IOException e1) {
                    e1.printStackTrace();
                }
            }
            System.exit(0);
        }
    }
}

不过,当我这样做时,我只能看到前 5 条记录(足以填满我的 JTextArea)并且无法向下滚动以查看其余记录。作为记录,当发送的记录保存在 list.size() 时,我在服务器代码上有 m.response = "End of List",然后它被传输到客户端(如下所列)并且我知道它工作正常。我知道这是滚动条的问题。提前感谢您的帮助。

最佳答案

I know this is an issue with the scroller.

问题不在于滚动条,而在于您如何设置 JTextArea 的大小或 preferredSize,这会阻止它正常扩展。而是设置它的列和行,因为这将告诉 JScrollPane 它应该在其视口(viewport)中查看多少行和多少列。

即,改变这个:

ReviewAll = new JPanel();
output = new JTextArea();
output.setPreferredSize(new Dimension (400,400));

为此:

ReviewAll = new JPanel();

// ROW_COUNT & COL_COUNT are int constants defined elsewhere
output = new JTextArea(ROW_COUNT, COL_COUNT); // using whatever numbers work best.

// don't set the text area's preferredSize:
// output.setPreferredSize(new Dimension (400,400));

当然,最好避免使用魔数(Magic Number),而是对行数和列数使用常量。

关于java - 滚动 Pane 不工作,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/11181083/

相关文章:

java - JScrollPane 中的 JEditorPane 具有修复背景图像

Java ScrollPane 重叠内容

java - Selenium 键盘按钮

java - mouseEntered() 和 mouseMoved() 之间的混淆

java - Swing:从 JScrollPane 中定位弹出窗口

java - JTable 在 JPanel 中不可见

java - Guice 3.0 - 对于仅具有依赖注入(inject)的 Swing 应用程序,我需要哪些 jar?

java - 从火力基地得到 child ?

java - 在 Java Eclipse 中指定绝对路径时找不到文件

java - 这个方法占用这么多内存的原因是什么?