JScrollPane在JTextArea中表现得很糟糕

时间:2014-07-19 20:22:55

标签: java eclipse swing jscrollpane

你好同志们!
多亏了你们,我已经设法让我的小型实验项目更进一步,但随着你们走得更远,总会出现一些问题所以我再次陷入困境。我有一个JTextArea输出一个正在运行的进程列表,但JScrollPane没有显示,但是当我调整窗口本身时,JScrollPane将悬停在整个JTextArea上。
看起来像这样: jscrollpane glitching

经过几个小时的刮伤我的后脑后,我决定问你们!
代码是:

    import java.awt.BorderLayout;
    import java.awt.Component;
    import java.awt.Container;
    import java.awt.Font;
    import java.awt.GridBagLayout;
    import java.io.*;
    import javax.swing.*;

    public class JTask {

        JButton button = new JButton();
        JFrame frame = new JFrame();
        JTextArea area = new JTextArea();
        JScrollPane scrollPane = new JScrollPane();

        JTask() throws IOException{
            frame.setBounds(100, 100, 1000, 700);
            frame.setLayout(null);
            area.setFont(new Font("monospaced", Font.PLAIN, 14));
            area.setBounds(5,25,972,500);
            scrollPane.add(area);
            scrollPane = new JScrollPane(JScrollPane.VERTICAL_SCROLLBAR_ALWAYS,     JScrollPane.HORIZONTAL_SCROLLBAR_ALWAYS);
            scrollPane.setBounds(5,25,972,500);
            scrollPane.setViewportView(area);

            scrollPane.setEnabled(true);
            scrollPane.setVisible(true);
            scrollPane.repaint();
            scrollPane.revalidate();
            area.setVisible(true);  

            frame.add(scrollPane);
            frame.add(area);

            frame.setVisible(true);

            try {
                String line;
                Process p = Runtime.getRuntime().exec(System.getenv("windir") +"\\system32\\"+"tasklist.exe");
                BufferedReader input = new BufferedReader(new InputStreamReader(p.getInputStream()));
                while ((line = input.readLine()) != null) {
                    System.out.println(line);
                    area.append(line);
                    area.append("\n");
                }
                input.close();
            } catch (Exception e) {
                e.printStackTrace();
            }

            frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);

        }

    public static void main(String args []) throws IOException{
        JTask task = new JTask();

    }
}

我为一个混乱的代码道歉,如果有什么可以做得更好,但我希望你明白我只是一个初学者,试图理解Java编程语言的机制,并沉入Java的世界。 提前谢谢大家!

2 个答案:

答案 0 :(得分:2)

为什么你使用两个JScrollPane?只需在JScrollPane中添加JFrame,在JTextArea添加JScrollPane

示例代码:

public JTask() throws IOException {
    JFrame  frame = new JFrame();
    JTextArea  area = new JTextArea();
    area.setFont(new Font("monospaced", Font.PLAIN, 14));
    JScrollPane  scrollPane = new JScrollPane(area);
    frame.add(scrollPane);
    ...
    // set text in JTextArea
    ...
    frame.pack();
    frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
    frame.setLocationRelativeTo(null);
    frame.setVisible(true);
}

值得阅读How to Use Text Areas上的 Swing Tutorial 以了解更多内容并找到更多详细示例。

一些要点

答案 1 :(得分:2)

您可以尝试使用此代码

JScrollPane scrollPane = new JScrollPane(area);
scrollPane.setVerticalScrollBarPolicy(ScrollPaneConstants.VERTICAL_SCROLLBAR_ALWAYS);
scrollPane.setHorizontalScrollBarPolicy(JScrollPane.HORIZONTAL_SCROLLBAR_ALWAYS);

在这种情况下不必使用视口,同样关注在帧可见之前重新验证和重新绘制。

您需要的只是frame.getContentPane().add(scrollPane);