3

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();
            }
        });
    }
}
Andrew Thompson
  • 168,117
  • 40
  • 217
  • 433
celebrate celeb
  • 75
  • 1
  • 3
  • 10

2 Answers2

3

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:

  1. For better help sooner, post an SSCCE. Especially don't include unnecessary images.
  2. Use a JTable for this type of data.
  3. The code dumps the text area in a tabbed pane that apparently has a GridLayout - BNI
  4. Don't mix Swing & AWT components without good reason.
  5. 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.

Working output in tabbed pane

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.

Andrew Thompson
  • 168,117
  • 40
  • 217
  • 433
  • Thnx Andrew.. But the output from the console doesn't appear. I had the same problem previously too. Can you guide me pls as to how to get the output onto the tabbed window. – celebrate celeb May 29 '12 at 06:48
  • See the **Update** to answer. – Andrew Thompson May 30 '12 at 02:48
  • I am using tasklist.exe in java eclipse under windows platform. One done, I will use "ps-ef" or "ps-aux" in java o get the output. But the correct linkage from the console to the panewindow doesn't happen. I am stuck there – celebrate celeb May 30 '12 at 05:19
  • How does the source I provided behave on your Windows machine? Have you read & implemented **all** of the recommendations of the linked article on `exec()`? – Andrew Thompson May 30 '12 at 05:48
  • It still remains the same. I have seriously lost track. The output in the concole also doesn't appear. – celebrate celeb May 30 '12 at 06:40
  • @Thompson: Yes, i have got it... Thnx much. Will continue from here. :) – celebrate celeb May 31 '12 at 03:53
  • @Thompson: The coding that you helped me with, works fine on windows platform but not on Linux platform. I gave ~ Process p1 = Runtime.getRuntime().exec("ps"); ~ instead of "tasklist.exe"... Why is isn't it working. What should I do? – celebrate celeb May 31 '12 at 06:18
  • That code I posted **does not implement** all the recommendations of the linked article. I think you should start a new question and try it in the command line (no GUI) first. But make sure you take care of the typical traps first. – Andrew Thompson May 31 '12 at 06:59
  • @Thompson: Okie:) Thnx... Will do – celebrate celeb May 31 '12 at 07:00
2

only points

  • TextArea textarea = new TextArea(); why AWT Component

    use Swing JTextArea textarea = new JTextArea();

you can load data to the JTextArea directly from

  • FileOutputStream from Process 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 the JTextArea should be wrapped into invokeLater)

or

  • use SwingWorker (output from process or publish could be done on Event Dispatch Thread)
mKorbel
  • 109,525
  • 20
  • 134
  • 319