標準出力コンポーネントについては、参考文献を見てね。
以下が前回作ったGUIに標準出力コンポーネントを追加したプログラムになります。
参考文献1から引用したプログラム(こちらでは、JTextAreaを継承しています。)
import java.awt.*; import java.io.*; import javax.swing.JTextArea; public class OutputTextArea extends JTextArea { private TextAreaOutputStream out; public OutputTextArea() throws HeadlessException { super(); this.setEditable(false); out = new TextAreaOutputStream(this); } public void setToSystemOut() { System.setOut(new PrintStream(this.getOut())); } public void setToSystemErr() { System.setErr(new PrintStream(this.getOut())); } public TextAreaOutputStream getOut() { return out; } public void flush() { this.append(out.toString()); out.reset(); } } class TextAreaOutputStream extends ByteArrayOutputStream { private OutputTextArea textarea; public TextAreaOutputStream(OutputTextArea textarea) { super(); this.textarea = textarea; } public synchronized void write(byte[] b, int off, int len) { super.write(b, off, len); textarea.flush(); } public synchronized void write(int b) { super.write(b); textarea.flush(); } public void write(byte[] b) throws IOException { super.write(b); textarea.flush(); } }前回作ったGUIプログラムを少し変更
import java.awt.Container; import java.awt.GridLayout; import java.awt.event.ActionEvent; import java.awt.event.ActionListener; import javax.swing.JButton; import javax.swing.JFrame; import javax.swing.JPanel; import javax.swing.JScrollPane; import javax.swing.JTextArea; import javax.swing.SwingUtilities; import javax.swing.UIManager; public class Window extends JFrame implements ActionListener, Runnable { /** コンポーネントの宣言 */ private JPanel panel1; private JTextArea textArea1; private JButton button1; private JPanel panel2; private OutputTextArea out; private JPanel panel3; private JButton button31; private JButton button32; private JButton button33; private String putdata; /** コンポーネントのサイズ */ // frameの高さと幅のサイズ private static final int FRAME_HEIGHT = 350; private static final int FRAME_WIDTH = 310; // containerの高さと幅のサイズ private static final int CONTAINER_HEIGHT = 350; private static final int CONTAINER_WIDTH = 310; // panel1の高さと幅のサイズ private static final int PANEL1_HEIGHT = 30; private static final int PANEL1_WIDTH = 300; // panel2の高さと幅のサイズ private static final int PANEL2_HEIGHT = 250; private static final int PANEL2_WIDTH = 300; public static void main(String[] args) { Window test = new Window(); // サブコンポーネントの推奨サイズおよびレイアウトに合わせてこの Window をサイズ変更するように設定 // test.pack(); } public Window() { setTitle("sample");// タイトル setBounds(0, 0, FRAME_WIDTH, FRAME_HEIGHT);// Windowの大きさ setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);// フレームを閉じたときプログラムを終了 try {// 外観をWindows風に設定 UIManager .setLookAndFeel("com.sun.java.swing.plaf.windows.WindowsLookAndFeel"); SwingUtilities.updateComponentTreeUI(this); } catch (Exception e) { e.printStackTrace(); } // Containerを生成(nullLayout) Container container = getContentPane(); container.setLayout(null); container.setBounds(0, 0, CONTAINER_WIDTH, CONTAINER_HEIGHT); panel1 = new JPanel(new GridLayout(1, 2)); panel1.setBounds(0, 0, PANEL1_WIDTH, PANEL1_HEIGHT); textArea1 = new JTextArea(); button1 = new JButton("Put"); textArea1.setBounds(panel1.getVisibleRect());// textAreaをpanel1の位置と大きさに適合させる textArea1.setLineWrap(true);// テキストエリアの幅で文字列を折り返す panel1.add(new JScrollPane(textArea1)); panel1.add(button1); button1.addActionListener(this); // TextArea用のPanel panel2 = new JPanel(new GridLayout(1, 1)); panel2.setBounds(0, PANEL1_HEIGHT, PANEL2_WIDTH, PANEL2_HEIGHT); out = new OutputTextArea(); out.setBounds(panel2.getVisibleRect()); out.setLineWrap(true); out.setToSystemOut(); panel2.add(new JScrollPane(out)); // Button用のPanel panel3 = new JPanel(new GridLayout(1, 3)); panel3.setBounds(0, PANEL2_HEIGHT + PANEL1_HEIGHT, PANEL1_WIDTH, PANEL1_HEIGHT); button31 = new JButton("Get"); button32 = new JButton("button2"); button33 = new JButton("button3"); panel3.add(button31); panel3.add(button32); panel3.add(button33); // ボタンにアクションリスナーを付加 button31.addActionListener(this); button32.addActionListener(this); button33.addActionListener(this); // containerにパネルを追加 container.add(panel1); container.add(panel2); container.add(panel3); setVisible(true); // ウインドウを見えるようにする } public void actionPerformed(ActionEvent ae) { if (ae.getSource() == button1) { putdata = textArea1.getText(); } else if (ae.getSource() == button31) { System.out.println(putdata); } else if (ae.getSource() == button32) { System.out.println("button2が押されました。"); } else if (ae.getSource() == button33) { System.out.println("button3が押されました。"); } } public void run() { } }
これでSystem.out.printlnで出力した値がTextAreaの方に出力されました。
参考文献
1.AllAbout - 標準出力コンポーネントを作ろう
0 件のコメント:
コメントを投稿