2012-03-19 28 views
9

konsol java görselleştirmek nasıl Swing kütüphaneleri kullanarak bir Java programı yaptım. Şimdi konsol çıktılarımı bir JFrame veya JPanel'e yönlendirmek istiyorum.JFrame/JPanel

+2

Yani tam olarak sorun nedir? –

+0

Belki tüm bu içeriği başka bir Swing bileşenine (ör. JTextArea') ekleyebilirsiniz? – Moonbeam

cevap

6

JFrame veya JPanel numaranızı aldıktan sonra, buna bir metin alanı ekleyin. Birden çok satır olduğu için, iyi bir seçimdir

. eklendiği sonra .append('text'); bunun yerine yazma can System.out.print();

JFrame jFrame = new JFrame(); 

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

jFrame.add(jTextArea); 
+0

Tamam, bunu okudum. Bunu yapacak başka bir şey olduğunu düşündüm. Zaten println var çünkü yeni bir textarea eklemek istemedim ve ekledim – Gianfra

16
Metin alanına çıktı ve bu OutputStream arayüzünün gerekli tüm yöntemleri uygular-yönlendirir yeniden bir OutputStream yapmak gerekir

, ve sonra ana programınızda, Standart çıkışınızı bu akışa yönlendirin. Benim programlardan biri için böyle bir şey kullandım:

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); 
    } 
} 

Ve bu onu gösterebilir:

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(); 
     } 
     }); 
    } 
}