我已经设法让我的小实验项目走得更远,但当你走得更远时,总会遇到障碍,所以我再次遇到了障碍。
我得到了
JTextArea
输出正在运行的进程列表,但是 JScrollPane
没有显示,但是当我调整窗口本身的大小时,JScrollPane
悬停在整个 JTextArea
上。
看起来像这样:
经过几个小时的挠头后,我决定问你们!
代码是:
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 的世界。
为什么要使用两个
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 教程,以了解更多信息并找到更多详细示例。
尝试使用Java7 - try-with-resources 语句在程序完成后关闭资源。
首先不要使用
null
布局。有很多布局管理器是为此目的而设计的。
请参阅Swing 教程,了解如何使用各种布局管理器
最后调用
frame.setVisible(true)
以确保所有内容都添加到JFrame中使用 SwingUtilities.invokeLater() 或 EventQueue.invokeLater() 确保 EDT 正确初始化。
你可以试试这个代码
JScrollPane scrollPane = new JScrollPane(area);
scrollPane.setVerticalScrollBarPolicy(ScrollPaneConstants.VERTICAL_SCROLLBAR_ALWAYS);
scrollPane.setHorizontalScrollBarPolicy(JScrollPane.HORIZONTAL_SCROLLBAR_ALWAYS);
在这种情况下没有必要使用视图端口,在框架可见之前重新验证和重新绘制也是如此。
您所需要的只是
frame.getContentPane().add(scrollPane);