问题
I have developed a task manager for Linux in Java. The output as of now is displayed in the console whereas a tabbed window appears separately (this was done using Java Swing). Now I want the output from the console to be displayed in the tabbed window.
How do I do it?
There are classes that I've used. One for the task manager functionality and the other for GUI. I've pasted below the coding.
**TabbedPaneDemo1.java**
package components;
import java.io.BufferedReader;
import java.io.BufferedWriter;
import java.io.File;
import java.io.FileOutputStream;
import java.io.FileWriter;
import java.io.IOException;
import java.io.InputStreamReader;
import java.io.PrintStream;
import java.io.Writer;
import java.util.Iterator;
import java.util.List;
/*
* TabbedPaneDemo.java requires one additional file:
* images/middle.gif.
*/
import javax.swing.JTabbedPane;
import javax.swing.ImageIcon;
import javax.swing.JLabel;
import javax.swing.JPanel;
import javax.swing.JFrame;
import javax.swing.JComponent;
import javax.swing.SwingUtilities;
import javax.swing.UIManager;
import javax.swing.JTextField;
import javax.swing.JTextArea;
import java.awt.BorderLayout;
import java.awt.Dimension;
import java.awt.GridLayout;
import java.awt.TextArea;
import java.awt.event.KeyEvent;
import java.io.BufferedReader;
import java.io.FileOutputStream;
import java.io.InputStreamReader;
import java.io.PrintStream;
public class TabbedPaneDemo1
{
public static void main(String args[]) throws Exception
{
try
{
TextArea textarea = new TextArea();
TabbedPaneDemo obj = new TabbedPaneDemo();
obj.fn();
String line;
String result = "";
FileOutputStream out;
//FileOutputStream out; // declare a file output object
PrintStream p;
Process p1 = Runtime.getRuntime().exec("tasklist.exe");
out = new FileOutputStream("myfile.txt");//write to a file//
p = new PrintStream( out );
BufferedReader input = new BufferedReader(new InputStreamReader(p1.getInputStream()));//read form a file//
while ((line = input.readLine()) != null)
{
System.out.println(line);
//textarea.append(line + "\n");
result += line+"\n";
p.println (line);
//textarea.setVisible(true);
}
//msgBox(result);
p.close();
input.close();
}
catch(Exception e)
{
}
}
public static void msgBox(String msg) {
javax.swing.JOptionPane.showConfirmDialog((java.awt.Component)
null, msg, "WindowsUtils",
javax.swing.JOptionPane.DEFAULT_OPTION);
}
}
**TabbedPaneDemo.java**
package components;
import java.awt.BorderLayout;
import java.awt.GridLayout;
import java.awt.event.KeyEvent;
import javax.swing.ImageIcon;
import javax.swing.JComponent;
import javax.swing.JFrame;
import javax.swing.JLabel;
import javax.swing.JPanel;
import javax.swing.JTabbedPane;
import javax.swing.SwingUtilities;
import javax.swing.UIManager;
import javax.swing.JTabbedPane;
import javax.swing.JLabel;
import javax.swing.JPanel;
import javax.swing.JFrame;
import javax.swing.JComponent;
import javax.swing.SwingUtilities;
import javax.swing.UIManager;
import javax.swing.JTextField;
import java.awt.BorderLayout;
import java.awt.Dimension;
import java.awt.GridLayout;
import java.awt.event.KeyEvent;
public class TabbedPaneDemo extends JPanel {
Integer i;
public TabbedPaneDemo() {
super(new GridLayout(1, 1));
JTabbedPane tabbedPane = new JTabbedPane();
ImageIcon icon = createImageIcon("images");
JComponent panel1 = makeTextPanel("tasklist");
tabbedPane.addTab("tasks", icon, panel1,
"ta");
tabbedPane.setMnemonicAt(0, KeyEvent.VK_1);
JComponent panel2 = makeTextPanel("windows");
tabbedPane.addTab("wins", icon, panel2,
"wi");
tabbedPane.setMnemonicAt(1, KeyEvent.VK_2);
add(tabbedPane);`enter code here`
tabbedPane.setTabLayoutPolicy(JTabbedPane.SCROLL_TAB_LAYOUT);
}
protected JComponent makeTextPanel(String text)
{
JPanel panel = new JPanel(false);
JLabel filler = new JLabel(text);
filler.setHorizontalAlignment(JLabel.CENTER);
panel.setLayout(new GridLayout(1, 1));
panel.add(filler);
return panel;
}
protected static ImageIcon createImageIcon(String path) {
java.net.URL imgURL = TabbedPaneDemo.class.getResource(path);
if (imgURL != null) {
return new ImageIcon(imgURL);
} else {
System.err.println("Couldn't find file: " + path);
return null;
}
}
private static void createAndShowGUI() {
JFrame frame = new JFrame("TabbedPaneDemo");
frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
frame.add(new TabbedPaneDemo(), BorderLayout.CENTER);
frame.pack();
frame.setVisible(true);
}
public static void fn() {
SwingUtilities.invokeLater(new Runnable() {
public void run()
{
UIManager.put("swing.boldMetal", Boolean.FALSE);
createAndShowGUI();
}
});
}
}
回答1:
This is a very naive implementation of it.
package test.t100.t001;
import java.awt.*;
import java.awt.event.KeyEvent;
import java.io.BufferedReader;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.InputStreamReader;
import java.io.PrintStream;
import javax.swing.*;
public class TabbedPaneDemo extends JPanel {
private static final long serialVersionUID = 1L;
Integer i;
JTextArea output = new JTextArea();
public static void main(String args[])
{
SwingUtilities.invokeLater(new Runnable() {
public void run()
{
JFrame frame = new JFrame("TabbedPaneDemo");
frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
frame.add(new TabbedPaneDemo(), BorderLayout.CENTER);
frame.pack();
frame.setVisible(true);
}
});
}
private String getDetails() throws IOException {
//fn();
String line;
String result = "";
PrintStream p;
Process p1 = Runtime.getRuntime().exec("tasklist.exe");
// read from a process
BufferedReader input = new BufferedReader(
new InputStreamReader(p1.getInputStream()));
while ((line = input.readLine()) != null)
{
//System.out.println(line);
output.append(line + "\n");
result += line+"\n";
//p.println (line);
//textarea.setVisible(true);
}
//msgBox(result);
//p.close();
input.close();
return result;
}
public TabbedPaneDemo() {
super(new GridLayout(1, 1));
JTabbedPane tabbedPane = new JTabbedPane();
ImageIcon icon = createImageIcon("images");
JComponent panel1 = makeTextPanel("tasklist");
tabbedPane.addTab("tasks", icon, panel1,
"ta");
// add it to something!
panel1.add(new JScrollPane(output));
tabbedPane.setMnemonicAt(0, KeyEvent.VK_1);
JComponent panel2 = makeTextPanel("windows");
tabbedPane.addTab("wins", icon, panel2,
"wi");
tabbedPane.setMnemonicAt(1, KeyEvent.VK_2);
add(tabbedPane);//`enter code here`
tabbedPane.setTabLayoutPolicy(JTabbedPane.SCROLL_TAB_LAYOUT);
try {
String s = getDetails();
output.setText(s);
} catch(IOException e) {
e.printStackTrace();
}
}
public static void msgBox(String msg) {
javax.swing.JOptionPane.showConfirmDialog((java.awt.Component)
null, msg, "WindowsUtils",
javax.swing.JOptionPane.DEFAULT_OPTION);
}
protected JComponent makeTextPanel(String text)
{
JPanel panel = new JPanel(false);
JLabel filler = new JLabel(text);
filler.setHorizontalAlignment(JLabel.CENTER);
panel.setLayout(new GridLayout(1, 1));
panel.add(filler);
return panel;
}
protected static ImageIcon createImageIcon(String path) {
java.net.URL imgURL = TabbedPaneDemo.class.getResource(path);
if (imgURL != null) {
return new ImageIcon(imgURL);
} else {
System.err.println("Couldn't find file: " + path);
return null;
}
}
}
Other notes:
- For better help sooner, post an SSCCE. Especially don't include unnecessary images.
- Use a
JTable
for this type of data. - The code dumps the text area in a tabbed pane that apparently has a
GridLayout
- BNI - Don't mix Swing & AWT components without good reason.
- As already mentioned, use a
SwingWorker
for getting the data.
Update
..but the output from the console doesn't appear.
Uh-huh. Let's think about
I have developed a task manager for Linux in Java
..combined with..
Process p1 = Runtime.getRuntime().exec("tasklist.exe");
Now, correct me if I misunderstand something, but AFIAU Linux has no EXEs.
I'm guessing the code fails on Linux, and since the err
stream of the process is being ignored, you are not being told why. Here is a screen-shot of the code shown above, as it appears on Windows 7.

Now, if the data had been hard-coded, you might be seeing something like above. Which answers the stated question of "(How to) Display output in a tabbed window", right?
More info. on the new problem you are seeing is to be had by implementing all the recommendations of When Runtime.exec() won't. If you implement all the suggestions & still cannot figure the problem, I suggest you ask a new question.
回答2:
only points
TextArea textarea = new TextArea();
why AWT Componentuse Swing
JTextArea textarea = new JTextArea();
you can load data to the JTextArea
directly from
FileOutputStream
fromProcess p1 = Runtime.getRuntime()
or read from File
JTextArea.read(File)
accepting"\n"
or from FileReader
or FileXxxx
e.i.
JTextArea.append(String)
you have issue with Concurency in Swing and you have to call/ to redirect
Process p1 = Runtime.getRuntime()
and
FileIO
to the Background task, there are
- by invoke from
Runnable#Thread
(output to theJTextArea
should be wrapped intoinvokeLater
)
or
- use
SwingWorker
(output fromprocess
orpublish
could be done onEvent Dispatch Thread
)
来源:https://stackoverflow.com/questions/10783123/display-output-in-a-tabbed-window