J'ai une classe (indiquée ci-dessous) qui étend Remarque: strong> Les appels sont uniquement redirigés lorsque la demande se lance. Mais à tout moment après lancement, les appels code> code> ne sont pas redirigés vers le jPanel code> et contient un jtextpane code>. Je veux rediriger system.out code> et system.err code> à mon jtextpane code>. Ma classe ne semble pas fonctionner. Lorsque je l'exécute, il redirige les impressions système, mais elles ne sont pas imprimées à mon jtextpane code>. S'il vous plaît aider! jtextpane code>. (c'est-à-dire si je place un system.out.prinln (); code> dans la classe, il sera appelé, mais s'il est placé dans un ActionListener code> pour une utilisation ultérieure, Il ne redirige pas). P> public class OSXConsole extends JPanel {
public static final long serialVersionUID = 21362469L;
private JTextPane textPane;
private PipedOutputStream pipeOut;
private PipedInputStream pipeIn;
public OSXConsole() {
super(new BorderLayout());
textPane = new JTextPane();
this.add(textPane, BorderLayout.CENTER);
redirectSystemStreams();
textPane.setBackground(Color.GRAY);
textPane.setBorder(new EmptyBorder(5, 5, 5, 5));
}
private void updateTextPane(final String text) {
SwingUtilities.invokeLater(new Runnable() {
public void run() {
Document doc = textPane.getDocument();
try {
doc.insertString(doc.getLength(), text, null);
} catch (BadLocationException e) {
throw new RuntimeException(e);
}
textPane.setCaretPosition(doc.getLength() - 1);
}
});
}
private void redirectSystemStreams() {
OutputStream out = new OutputStream() {
@Override
public void write(final int b) throws IOException {
updateTextPane(String.valueOf((char) b));
}
@Override
public void write(byte[] b, int off, int len) throws IOException {
updateTextPane(new String(b, off, len));
}
@Override
public void write(byte[] b) throws IOException {
write(b, 0, b.length);
}
};
System.setOut(new PrintStream(out, true));
System.setErr(new PrintStream(out, true));
}
}
3 Réponses :
Console de message classe la fait pour vous.
EDIT: P>
Voici une classe de test simple: p>
@Jacob, si vous avez un simple SSCCE ( sscce.org ) qui le démontre ne fonctionne pas, vous pouvez utiliser le "Contactez-nous «Page du site Web pour m'envoyer du code à regarder.
Cela fonctionne si vous l'utilisez correctement. Cependant, pour obtenir une sortie en direct, vous devrez mettre des tâches longues sur un swingworker.
Les flux canalisés me confondent toujours, c'est pourquoi ma solution de console de messages ne les utilise pas. Quoi qu'il en soit, voici ma tentative d'une console à l'aide de flux canalisés. Quelques différences:
a) Il utilise une JTextarea car une jtextarea est plus efficace qu'un JTextpane pour simplement afficher du texte. Bien sûr, si vous avez l'intention d'ajouter des attributs au texte, vous avez besoin d'une fenêtre de texte. P>
b) Cette solution utilise des threads. Je suis sûr que j'ai lu quelque part que cela était nécessaire pour empêcher le blocage de la sortie. En tout cas, cela fonctionne dans mon cas de test simple. P>
import java.io.*;
import java.awt.event.*;
import javax.swing.*;
import javax.swing.text.*;
public class Console implements Runnable
{
JTextArea displayPane;
BufferedReader reader;
private Console(JTextArea displayPane, PipedOutputStream pos)
{
this.displayPane = displayPane;
try
{
PipedInputStream pis = new PipedInputStream( pos );
reader = new BufferedReader( new InputStreamReader(pis) );
}
catch(IOException e) {}
}
public void run()
{
String line = null;
try
{
while ((line = reader.readLine()) != null)
{
// displayPane.replaceSelection( line + "\n" );
displayPane.append( line + "\n" );
displayPane.setCaretPosition( displayPane.getDocument().getLength() );
}
System.err.println("im here");
}
catch (IOException ioe)
{
JOptionPane.showMessageDialog(null,
"Error redirecting output : "+ioe.getMessage());
}
}
public static void redirectOutput(JTextArea displayPane)
{
Console.redirectOut(displayPane);
Console.redirectErr(displayPane);
}
public static void redirectOut(JTextArea displayPane)
{
PipedOutputStream pos = new PipedOutputStream();
System.setOut( new PrintStream(pos, true) );
Console console = new Console(displayPane, pos);
new Thread(console).start();
}
public static void redirectErr(JTextArea displayPane)
{
PipedOutputStream pos = new PipedOutputStream();
System.setErr( new PrintStream(pos, true) );
Console console = new Console(displayPane, pos);
new Thread(console).start();
}
public static void main(String[] args)
{
JTextArea textArea = new JTextArea();
JScrollPane scrollPane = new JScrollPane( textArea );
JFrame frame = new JFrame("Redirect Output");
frame.setDefaultCloseOperation( JFrame.EXIT_ON_CLOSE );
frame.getContentPane().add( scrollPane );
frame.setSize(200, 100);
frame.setVisible(true);
Console.redirectOutput( textArea );
final int i = 0;
Timer timer = new Timer(1000, new ActionListener()
{
public void actionPerformed(ActionEvent e)
{
System.out.println( new java.util.Date().toString() );
System.err.println( System.currentTimeMillis() );
}
});
timer.start();
}
}
Dans la section suivante Lien Vous pouvez trouver la classe Messageconsole que quelqu'un a mentionné. J'ai mis en place un logiciel et utilisé cette solution et cela fonctionne parfaitement pour moi.
J'ai utilisé l'outil de conception NetBeans, le code concernant l'apparence visuelle du JTextpane est un peu encombrant, alors je ne vais pas la placer ici. Désolé, je n'ai pas compris que dans la réponse similaire à cela, ils avaient mis le lien avec la classe Messageconsole. Je ne l'ai pas vu et je voulais aussi montrer ma solution. P> p>
J'ai supprimé ma réponse parce que c'était faux.
Voyons-vous des appels être redirigés et certains pas?
Les appels de l'intérieur de la classe OSXConsole sont imprimés sur le JTextpane.
Correction: Cela fonctionne sur des méthodes extérieures. Le problème est lors de l'exécution d'un fichier JAR dans l'application et de capturer les appels System.out.
Consultez ma solution avec LOWBBACK: Stackoverflow.com/a/33657637/808901