2010年7月26日月曜日

標準出力コンポーネントを作ろう - Java - GUI

前回作ったGUIに標準出力コンポーネントを追加してみる。
標準出力コンポーネントについては、参考文献を見てね。


以下が前回作った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 件のコメント:

コメントを投稿