2015-10-01 1 views
1

В моем приложении есть консоль, на которой перенаправляется весь контент для печати в системе.Добавление вывода консоли в Swing gui, который может поддерживать специальные символы

Мое приложение будет также вывода специальных символов, в частности на других языках (азиатские языки, русский, арабский и т.д.)

Я использую JTextArea как консоль из:

consoleOutput = new JTextArea(1, 50); 

    DefaultCaret caret = (DefaultCaret) consoleOutput.getCaret(); 
    caret.setUpdatePolicy(DefaultCaret.ALWAYS_UPDATE); 

    Font font = new Font("Consolas", Font.PLAIN, 12); 
    consoleOutput.setFont(font); 

    JScrollPane scrollPane = new JScrollPane(consoleOutput); 
    this.add(scrollPane, BorderLayout.CENTER); 


    //CHANGE OUTPUT TO THIS CONSOLE 
    PrintStream out = new PrintStream(new TextAreaOutput(consoleOutput)); 

    System.setOut(out); 
    System.setErr(out); 

И этот класс для перенаправления печати:

public class TextAreaOutput extends OutputStream { 
    JTextArea outputConsole; 

    public TextAreaOutput(JTextArea outputConsole) { 
     this.outputConsole = outputConsole; 
    } 

    @Override 
    public void write(int b) throws IOException { 
     outputConsole.append(String.valueOf((char)b)); 
    } 
} 

Это работает, и печать распространяется на этот jtextarea. Однако у меня проблемы с кодировкой. Специальные символы, такие как ▒, █, .نت, 览, etc, не отображаются правильно. Некоторые могут быть жестко закодированы в исходные файлы (я использую UTF-8), но некоторые могут быть извлечены из Интернета с помощью selenium webdriver.

+2

Unicode символы более чем 1 байт длиной. В UTF-8 каждый символ может быть представлен от 1 до 6 байтов. Поэтому ваш метод 'write' не будет работать. Вы можете изучить UTF-8 и разработать более эффективный метод. – RealSkeptic

+2

'Font font = new Font (« Консола », Font.PLAIN, 12);' Поддерживает ли этот шрифт соответствующие наборы символов? –

+0

@AndrewThompson. Вы правы, шрифт, похоже, не поддерживает специальные символы, но еще одна проблема заключается в том, что метод записи не работает правильно с UTF-8, за другой комментарий. – Andrio

ответ

2
import java.awt.*; 
import java.awt.event.*; 
import java.io.*; 
import java.util.Date; 
import javax.swing.*; 

public class TextAreaOutputStreamTest { 
    private final JTextArea consoleOutput = new JTextArea(); 
    private final JTextField textField = new JTextField(); 

    public JComponent makeUI() { 
    try { 
     OutputStream os = new TextAreaOutputStream(consoleOutput); 
     System.setOut(new PrintStream(os, true, "UTF-8")); 
    } catch (IOException ex) { 
     ex.printStackTrace(); 
    } 
    Box box = Box.createHorizontalBox(); 
    box.setBorder(BorderFactory.createEmptyBorder(5, 5, 5, 5)); 
    box.add(Box.createHorizontalGlue()); 
    box.add(textField); 
    box.add(Box.createHorizontalStrut(5)); 
    box.add(new JButton(new AbstractAction("Enter") { 
     @Override public void actionPerformed(ActionEvent e) { 
     String s = new Date().toString(); 
     System.out.println(s + "\n " + textField.getText()); 
     } 
    })); 
    consoleOutput.setEditable(false); 

    JPanel p = new JPanel(new BorderLayout()); 
    p.add(new JScrollPane(consoleOutput)); 
    p.add(box, BorderLayout.SOUTH); 
    return p; 
    } 
    public static void main(String... args) { 
    EventQueue.invokeLater(new Runnable() { 
     @Override public void run() { 
     createAndShowGUI(); 
     } 
    }); 
    } 
    public static void createAndShowGUI() { 
    JFrame f = new JFrame(); 
    f.setDefaultCloseOperation(WindowConstants.EXIT_ON_CLOSE); 
    f.getContentPane().add(new TextAreaOutputStreamTest().makeUI()); 
    f.setSize(320, 240); 
    f.setLocationRelativeTo(null); 
    f.setVisible(true); 
    } 
} 

class TextAreaOutputStream extends OutputStream { 
    private final ByteArrayOutputStream buf = new ByteArrayOutputStream(); 
    private final JTextArea consoleOutput; 
    public TextAreaOutputStream(JTextArea consoleOutput) { 
    super(); 
    this.consoleOutput = consoleOutput; 
    } 
    @Override public void flush() throws IOException { 
    consoleOutput.append(buf.toString("UTF-8")); 
    buf.reset(); 
    } 
    @Override public void write(int b) throws IOException { 
    buf.write(b); 
    } 
} 

 Смежные вопросы

  • Нет связанных вопросов^_^