Wie legen Sie die Ausgabe-stream zu TextArea
Ich versuche zum erstellen von GUI-Panel für ein Programm, und ich möchte alles, das wäre normal drucken zu meinem Eingabeaufforderung zu drucken, um ein TextArea-Objekt. Ich habe die GUI-panel-formatiert für die meisten Teil, ich kann nicht, um text zu drucken, um das TextArea-obwohl, hier ist meine Datei:
package guipanel;
import javax.swing.*;
import java.awt.*;
import java.io.*;
/**
*
* @author Dan
*/
public class GUIPanel extends JFrame {
public GUIPanel() {
initComponents();
}
private void setOutputStream(boolean catchErrors) {
System.setOut(aPrintStream);
setVisible(true);
requestFocus();
if (catchErrors) {
System.setErr(aPrintStream);
}
}
private void addTabs(JTabbedPane jTabbedPane1) {
JPanel jPanel1 = new JPanel();
JPanel jPanel2 = new JPanel();
JPanel jPanel3 = new JPanel();
JPanel jPanel4 = new JPanel();
jTabbedPane1.add("Main", textArea1);
jTabbedPane1.add("Commands", jPanel);
jTabbedPane1.add("Rules", jPanel1);
jTabbedPane1.add("Links", jPanel2);
jTabbedPane1.add("Information", jPanel3);
jTabbedPane1.add("Shutdown", jPanel4);
setOutputStream(true);
}
@SuppressWarnings("unchecked")
private void initComponents() {
textArea1 = new java.awt.TextArea();
jTabbedPane1 = new javax.swing.JTabbedPane();
jMenuBar1 = new javax.swing.JMenuBar();
jMenu1 = new javax.swing.JMenu();
jMenu2 = new javax.swing.JMenu();
textArea1.setPreferredSize(new java.awt.Dimension(432, 343));
textArea1.getAccessibleContext().setAccessibleParent(jTabbedPane1);
setDefaultCloseOperation(javax.swing.WindowConstants.EXIT_ON_CLOSE);
setTitle("Evolution-X 639");
setBounds(new java.awt.Rectangle(0, 0, 400, 450));
setResizable(false);
getContentPane().setLayout(new java.awt.FlowLayout());
addTabs(jTabbedPane1);
getContentPane().add(jTabbedPane1);
jMenu1.setText("File");
jMenuBar1.add(jMenu1);
jMenu2.setText("Edit");
jMenuBar1.add(jMenu2);
setJMenuBar(jMenuBar1);
pack();
}
public static void main(String args[]) {
try {
for (javax.swing.UIManager.LookAndFeelInfo info : javax.swing.UIManager.getInstalledLookAndFeels()) {
if ("Nimbus".equals(info.getName())) {
javax.swing.UIManager.setLookAndFeel(info.getClassName());
break;
}
}
} catch (ClassNotFoundException ex) {
java.util.logging.Logger.getLogger(GUIPanel.class.getName()).log(java.util.logging.Level.SEVERE, null, ex);
} catch (InstantiationException ex) {
java.util.logging.Logger.getLogger(GUIPanel.class.getName()).log(java.util.logging.Level.SEVERE, null, ex);
} catch (IllegalAccessException ex) {
java.util.logging.Logger.getLogger(GUIPanel.class.getName()).log(java.util.logging.Level.SEVERE, null, ex);
} catch (javax.swing.UnsupportedLookAndFeelException ex) {
java.util.logging.Logger.getLogger(GUIPanel.class.getName()).log(java.util.logging.Level.SEVERE, null, ex);
}
java.awt.EventQueue.invokeLater(new Runnable() {
public void run() {
new GUIPanel().setVisible(true);
}
});
}
private JMenu jMenu1;
private JMenu jMenu2;
private JMenuBar jMenuBar1;
private JTabbedPane jTabbedPane1;
private TextArea textArea1;
private JPanel jPanel = new JPanel();
private PrintStream aPrintStream =
new PrintStream(
new FilterOutputStream(
new ByteArrayOutputStream()));
}
- Wo ist
aPrintStream
? Auch ich würde nicht mit dem gleichen print-stream für die Fehler-und Ausgabe-streams, möchten Sie vielleicht, um Sie zu unterscheiden - private PrintStream aPrintStream = new PrintStream(new FilterOutputStream(new ByteArrayOutputStream()));
Du musst angemeldet sein, um einen Kommentar abzugeben.
Müssen Sie die Umleitung der print-stream in einen output-stream können Sie Steuern,...
Dies ist ein Beispiel für Konzept ich für eine Anwendung entwickelt, die ich arbeite für die Arbeit. Wir verwenden diese, um die Ausgabe-Konsole, wenn es ausgeführt wird bei der Benutzer-Websites, so dass wir sehen können, was gesendet wird zu standard aus...bis wir unsere Feste Protokollierung ist 😉
Grundsätzlich setzt eine benutzerdefinierte
OutputStream
in der print-stream und die Konsole zum erfassen der Ausgabe, aber immer noch erlaubt den Inhalt auf der Konsole ausgegeben. Dies ist hilfreich, wenn Sie das Programm von der Kommandozeile oder IDE. Sie könnten ein Schalter, um dies zu stoppen, wenn Sie wollte...Aktualisiert mit arbeiten Beispiel. Test auf Windows 7, Java 6 und Mac OS Lion Java 7
MadProgrammer die Lösung ist wirklich toll, und ich basiert mine auf seine.
Jedoch, wie bereits von Loopkin, es befasst sich nicht mit Sonderzeichen (um genau zu sein, es scheitert an alle nicht-ASCII-Zeichen).
Loopkin die Lösung nicht für mich arbeiten, aber ich schließlich kam mit 2 Lösungen, hat den job.
Lösung 1: die Griffe alle 1-byte-Zeichen (bis U+00FF)
Diese einfache Lösung verarbeitet alle Zeichen bis U+00FF (alle 1-byte-Zeichen).
Alles ist identisch wie MadProgrammer, außer
write()
die definiert ist als:Habe ich das Präfix Sachen, denn ich Brauch es nicht.
Lösung 2: verarbeitet jedes Objekt wie standard-Ausgabe
Am Ende, habe ich beschlossen, alle Zeichen enthalten, die so landete ich, die sich direkt
PrintStream
, und auch die Präfix - /Gedankenstrich zurück. Das problem ist, ich konnte nicht überschreiben die private Methodewrite(String s)
, so dass ich überschrieb alleprint()
Methoden:Entfernte ich die
Consumer
Aspekt, es einfach zu halten, aber alles, was wirklich benötigt wird hier. Hier ist, wie ich diese Klasse:Ich mag die Antwort von MadProgrammer aber ich glaube nicht, dass das funktionieren würde für UTF-8-chars.
Stattdessen würde ich machen StreamCapturer erweitern ByteArrayOutputStream und diese, wie die write-Implementierung.
Ich überspringe die Präfix-Teil, da brauche ich nicht in meiner Implementierung. Vielen Dank für den code, obwohl es eine große Hilfe gewesen!
Nur ein update des ursprünglichen MadProgrammer code für NOOBS - pass eine JTextArea parameter an den Konstruktor, z.B.