如何在 Swing 中将 JScrollPane 与 JTextArea 结合使用?

问题描述 投票:0回答:2

我已经设法让我的小实验项目走得更远,但当你走得更远时,总会遇到障碍,所以我再次遇到了障碍。

我得到了

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 的世界。

java eclipse swing jscrollpane jtextarea
2个回答
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);
}

值得阅读如何使用文本区域Swing 教程,以了解更多信息并找到更多详细示例。

一些要点


2
投票

你可以试试这个代码

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

在这种情况下没有必要使用视图端口,在框架可见之前重新验证和重新绘制也是如此。

您所需要的只是

frame.getContentPane().add(scrollPane);

最新问题
© www.soinside.com 2019 - 2025. All rights reserved.