Hi Victor,
I actually use System.setOut in another class which is basically a
console window with a text area as part of an application (See below).
But Gurobi is not directly affected by that as well as cplex. That's
why I passed cplex.setOut() the outputStream of that class, which
worked well.
Maybe I miss the obvious solution here?
<code>
import java.awt.BorderLayout;
import java.awt.Point;
import java.io.IOException;
import java.io.OutputStream;
import java.io.PipedInputStream;
import java.io.PipedOutputStream;
import java.io.PrintStream;
import javax.swing.JFrame;
import javax.swing.JScrollPane;
import javax.swing.JTextArea;
import javax.swing.SwingUtilities;
public class Console extends JFrame {
class ReaderThread extends Thread {
PipedInputStream pi;
ReaderThread(final PipedInputStream pi) {
this.pi = pi;
}
@Override
public void run() {
final byte[] buf = new byte[1024];
try {
while (true) {
final int len = pi.read(buf);
if (len == -1) {
break;
}
SwingUtilities.invokeLater(new Runnable() {
@Override
public void run() {
textArea.append(new String(buf, 0, len));
// Make sure the last line is always visible
textArea.setCaretPosition(textArea.getDocument().getLength());
// Keep the text area down to a certain character
// size
final int idealSize = 1000;
final int maxExcess = 500;
final int excess = textArea.getDocument().getLength() -
idealSize;
if (excess >= maxExcess) {
textArea.replaceRange("", 0, excess);
}
}
});
}
} catch (final IOException e) {
}
}
}
PipedInputStream piOut;
PipedInputStream piErr;
PipedOutputStream poOut;
PipedOutputStream poErr;
JTextArea textArea = new JTextArea();
public Console(final int xPos, final int yPos) throws IOException {
// Set up System.out
piOut = new PipedInputStream();
poOut = new PipedOutputStream(piOut);
System.setOut(new PrintStream(poOut, true));
// Set up System.err
piErr = new PipedInputStream();
poErr = new PipedOutputStream(piErr);
System.setErr(new PrintStream(poErr, true));
// Add a scrolling text area
textArea.setEditable(false);
textArea.setRows(20);
textArea.setColumns(130);
getContentPane().add(new JScrollPane(textArea),
BorderLayout.CENTER);
pack();
setLocation(new Point(xPos, yPos));
setVisible(true);
setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
// Create reader threads
new ReaderThread(piOut).start();
new ReaderThread(piErr).start();
}
public OutputStream getOutputStream() {
return poOut;
}
}
</code>