Comment définir le flux de sortie à TextArea
Je suis en train de créer une interface graphique pour un programme et j'aimerais tout, qui serait normalement l'impression à mon invite de commande, de l'imprimer sur un objet TextArea. J'ai le panneau GUI formaté pour la plupart, je ne peux pas obtenir le texte à imprimer pour le TextArea bien, voici mon fichier:
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()));
}
Où est
privé PrintStream aPrintStream = new PrintStream(nouveau FilterOutputStream(nouveau ByteArrayOutputStream()));
aPrintStream
? J'ai aussi ne pas utiliser le même flux d'impression pour les deux l'erreur et de flux de sortie, vous pouvez les différencierprivé PrintStream aPrintStream = new PrintStream(nouveau FilterOutputStream(nouveau ByteArrayOutputStream()));
OriginalL'auteur Dan | 2012-10-18
Vous devez vous connecter pour publier un commentaire.
Vous avez besoin de rediriger le flux d'impression vers un flux de sortie, vous pouvez contrôler...
Ceci est un exemple de concept que j'ai développé pour une application que je suis en train de travailler sur le travail. Nous nous en servons pour afficher la sortie de la console quand ça tourne à l'utilisateur des sites afin que nous puissions voir ce qui est envoyé à la norme...jusqu'à ce que nous avons fixé notre journalisation 😉
Fondamentalement, il met une coutume
OutputStream
entre les flux d'impression et la console pour capturer la sortie, mais permet toujours le contenu à afficher dans la console. Ceci est utile si vous exécutez le programme à partir de la ligne de commande ou IDE. Vous pourriez mettre un interrupteur pour arrêter cela, si vous vouliez...Mis à jour avec exemple de travail. Test sur Windows 7, Java 6 et Mac OS Lion Java 7
Merci pour le heads up, j'ai corriger le bug et l'a testé sur Windows (Java 6 & 7) et Mac OS Lion (Java 7)
Merci, fonctionne parfaitement. 😀
Désolé pour le bug, en essayant d'être intelligent 😛
Qu'en montrant la sortie de la console au cours de l'exécution? Vous pouvez consulter un exemple?
OriginalL'auteur MadProgrammer
MadProgrammer la solution est vraiment super, et j'ai fondé la mine de sur sa.
Toutefois, comme l'a souligné Loopkin, il ne traite pas de caractères spéciaux (pour être précis, il échoue sur tous les caractères non-ASCII).
Loopkin la solution ne fonctionne pas pour moi, mais j'ai finalement venu avec 2 solutions qui ont fait le travail.
Solution 1: les poignées de chaque 1 byte character (jusqu'à U+00FF)
Cette solution simple poignées de chaque personnage jusqu'à U+00FF (tous les 1-byte character).
Tout est identique que MadProgrammer, à l'exception de
write()
qui est définie comme:Je n'ai pas mis le préfixe de trucs, parce que je n'ai pas besoin d'elle.
Solution 2: les poignées de chaque Objet comme sortie standard
En fin de compte, j'ai décidé d'inclure tous les personnages alors j'ai fini par étendre directement
PrintStream
, et aussi mettre le préfixe/retrait de retour. Le problème est que je ne pouvais pas remplacer la méthode privéewrite(String s)
, donc j'ai remplacé tous lesprint()
méthodes:J'ai enlevé le
Consumer
aspect de garder les choses simples, mais tout ce qui est vraiment nécessaire est ici. Voici comment j'ai utilisé cette classe:OriginalL'auteur Joffrey
J'aime la réponse de MadProgrammer mais je ne pense pas que cela fonctionnera pour l'UTF-8 caractères.
Au lieu de cela, je voudrais faire StreamCapturer étendre ByteArrayOutputStream et de l'utiliser comme l'écriture, à la mise en œuvre.
Je suis à sauter le préfixe partie parce que je n'en ai pas besoin dans mon œuvre. Merci pour le code bien, il a été d'une grande aide!
OriginalL'auteur loopkin
Juste une mise à jour de l'original MadProgrammer du code pour les NOOBS - passer un JTextArea paramètre de constructeur, par exemple
OriginalL'auteur Erikas