2012-03-19 53 views
9

Hice un programa Java utilizando bibliotecas Swing. Ahora me gustaría redirigir las salidas de mi consola a un JFrame o JPanel.cómo visualizar consola java en JFrame/JPanel

+2

Entonces, ¿cuál es exactamente su problema? –

+0

¿Tal vez añada todo ese contenido a otro componente de Swing (por ejemplo, 'JTextArea')? – Moonbeam

Respuesta

6

Una vez que tenga su JFrame o JPanel, agregue un campo de texto a la misma.

JTextArea es una buena opción, porque tiene varias líneas. Una vez que se añade, puede .append('text'); a ella en lugar de escribir la System.out.print();

JFrame jFrame = new JFrame(); 

JTextArea jTextArea = new JTextArea(); 
jTextArea.append("Hello World."); 

jFrame.add(jTextArea); 
+0

bien, he leído sobre eso. Pensé que había algo más para hacer eso. Debido a que ya hay println, no quiero agregar un nuevo textarea y anexarlos – Gianfra

16

Es necesario hacer un OutputStream que redirige la salida al área de texto y que implementa todos los métodos necesarios de la interfaz OutputStream, y luego en su programa principal, redirija su salida estándar a esta secuencia. He usado algo como esto para uno de mis programas:

import java.io.IOException; 
import java.io.OutputStream; 

import javax.swing.JTextArea; 
import javax.swing.SwingUtilities; 

public class TextAreaOutputStream extends OutputStream { 

    private final JTextArea textArea; 
    private final StringBuilder sb = new StringBuilder(); 
    private String title; 

    public TextAreaOutputStream(final JTextArea textArea, String title) { 
     this.textArea = textArea; 
     this.title = title; 
     sb.append(title + "> "); 
    } 

    @Override 
    public void flush() { 
    } 

    @Override 
    public void close() { 
    } 

    @Override 
    public void write(int b) throws IOException { 

     if (b == '\r') 
     return; 

     if (b == '\n') { 
     final String text = sb.toString() + "\n"; 
     SwingUtilities.invokeLater(new Runnable() { 
      public void run() { 
       textArea.append(text); 
      } 
     }); 
     sb.setLength(0); 
     sb.append(title + "> "); 
     return; 
     } 

     sb.append((char) b); 
    } 
} 

Y se puede demostrar con esto:

import java.awt.BorderLayout; 
import java.awt.event.ActionEvent; 
import java.awt.event.ActionListener; 
import java.io.PrintStream; 
import javax.swing.*; 

@SuppressWarnings("serial") 
public class TextAreaOutputStreamTest extends JPanel { 

    private JTextArea textArea = new JTextArea(15, 30); 
    private TextAreaOutputStream taOutputStream = new TextAreaOutputStream(
     textArea, "Test"); 

    public TextAreaOutputStreamTest() { 
     setLayout(new BorderLayout()); 
     add(new JScrollPane(textArea, JScrollPane.VERTICAL_SCROLLBAR_ALWAYS, 
      JScrollPane.HORIZONTAL_SCROLLBAR_NEVER)); 
     System.setOut(new PrintStream(taOutputStream)); 

     int timerDelay = 1000; 
     new Timer(timerDelay , new ActionListener() { 
     int count = 0; 
     @Override 
     public void actionPerformed(ActionEvent arg0) { 

      // though this outputs via System.out.println, it actually displays 
      // in the JTextArea: 
      System.out.println("Count is now: " + count + " seconds"); 
      count++; 
     } 
     }).start(); 
    } 

    private static void createAndShowGui() { 
     JFrame frame = new JFrame("Test"); 
     frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); 
     frame.getContentPane().add(new TextAreaOutputStreamTest()); 
     frame.pack(); 
     frame.setLocationRelativeTo(null); 
     frame.setVisible(true); 
    } 

    public static void main(String[] args) { 
     SwingUtilities.invokeLater(new Runnable() { 
     public void run() { 
      createAndShowGui(); 
     } 
     }); 
    } 
}