JavaマスターVisual EditorでSwingアプリケーションを作成する → Visual EditorでSwingアプリケーションを作成する

Visual EditorでSwingアプリケーションを作成する

Visual Editorの簡単な使い方を紹介します。

Swingプログラミングに慣れている人でも、ソースコード上だけで 思い通りのGUIを作成するのは、かなり骨の折れる作業ではないかと思います。

Visual Editorを使えば、試行錯誤しながら、非常に簡単にGUIアプリケーションが 作成できます。

ここでは、JFrameを拡張して簡単なアプリケーションを作成してみます。

プロジェクトを右クリックして「新規」→「その他」を選択し、 ダイアログにて「JFrame Visual Class」を選択し、 「次へ」をクリックします。

「名前」に適当な名前を入力します。ここではFrameとしました。

プレビュー画面と、コンポーネントパレットが付いた Visual Editorが起動しました。

右側のコンポーネントパレットからコンポーネントを選択し、 プレビュー画面(フレーム)の上でクリックすると、コンポーネントを 貼り付けることができます。

また、編集結果はそのつどソースに反映されます。 コンポーネントの配置などはすべて通常のJavaソースファイルに 格納され、別のプロパティファイルなどは作成されません。

また、ソースを手作業で編集すると、その結果も プレビューに反映されます。

ただし、あまりにも過激にソースを書き換えると Visual Editorがソースを認識できなくなってしまい、 プレビューが崩れたり、表示されなくなってしまったりします。

ソースはなるべくこまめに保存し、かつ、構造的に大きな変更を加えるときは、 前のバージョンのソースをバックアップしておいたほうがよさそうです。

コンポーネントがどのように組み合わさっているのかを確認するには、 「Java Beans」ビューを利用します。 また、メニュー系のコンポーネントなど、画面上で 選択・挿入しにくいものについても、このJava Beansビュー上のツリーで 編集を行います。

編集中のSwingオブジェクトは、「Java Bean」として実行することができます。 実行にあたって、特にmainメソッド等を用意する必要はありません。

実行すると、Swingのオブジェクトを実際に表示して、 GUI動作を確認することができます。

JSplitPaneで2分割した領域にJTreeとJTableを表示し、 エクスプローラのようなアプリケーションを作成してみました。 左側でフォルダを選択すると、右側にそのフォルダのファイル一覧が表示されます。

samples/swing/visualeditor/Frame.java - Eclipse SDK
package samples.swing.visualeditor;

import java.awt.BorderLayout;
import java.io.File;

import javax.swing.JFrame;
import javax.swing.JPanel;
import javax.swing.JSplitPane;
import javax.swing.JTable;
import javax.swing.JTree;

public class Frame extends JFrame {

  private JPanel jContentPane = null;
  private JSplitPane jSplitPane = null;
  private JTree jTree = null;
  private JTable jTable = null;
  /**
   * This is the default constructor
   */
  public Frame() {
    super();
    initialize();
  }

  /**
   * This method initializes this
   
   @return void
   */
  private void initialize() {
    this.setSize(817474);
    this.setContentPane(getJContentPane());
    this.setTitle("JFrame");
  }

  /**
   * This method initializes jContentPane
   
   @return javax.swing.JPanel
   */
  private JPanel getJContentPane() {
    if (jContentPane == null) {
      jContentPane = new JPanel();
      jContentPane.setLayout(new BorderLayout());
      jContentPane.add(getJSplitPane(), java.awt.BorderLayout.CENTER);
    }
    return jContentPane;
  }

  /**
   * This method initializes jSplitPane  
   *   
   @return javax.swing.JSplitPane  
   */
  private JSplitPane getJSplitPane() {
    if (jSplitPane == null) {
      jSplitPane = new JSplitPane();
      jSplitPane.setLeftComponent(getJTree());
      jSplitPane.setRightComponent(getJTable());
    }
    return jSplitPane;
  }

  /**
   * This method initializes jTree  
   *   
   @return javax.swing.JTree  
   */
  private JTree getJTree() {
    if (jTree == null) {
      jTree = new JTree(new FolderTreeNode(new File("c:/")));
      jTree.addTreeSelectionListener(new FolderTreeSelectionListener(this));
    }
    return jTree;
  }

  /**
   * This method initializes jTable  
   *   
   @return javax.swing.JTable  
   */
  private JTable getJTable() {
    if (jTable == null) {
      jTable = new JTable();
    }
    return jTable;
  }

  public void showFolder(File file) {
    jTable = new JTable(new FolderTableModel(file));
    jSplitPane.setRightComponent(jTable);
  }

}  //  @jve:decl-index=0:visual-constraint="10,10"
samples/swing/visualeditor/FolderTableModel.java - Eclipse SDK
package samples.swing.visualeditor;

import java.io.File;
import java.util.ArrayList;
import java.util.Date;

import javax.swing.table.AbstractTableModel;

public class FolderTableModel extends AbstractTableModel {
  private File file;

  private ArrayList<File> fileList = new ArrayList<File>();

  public FolderTableModel(File file) {
    this.file = file;
    for (File child : file.listFiles()) {
      if (!child.isDirectory()) {
        fileList.add(child);
      }
    }
  }

  public int getRowCount() {
    return fileList.size();
  }

  public int getColumnCount() {
    return 3;
  }

  public Object getValueAt(int row, int col) {
    File child = fileList.get(row);
    switch (col) {
    case 0:
      return child.getName();
    case 1:
      return new Long(child.length());
    case 2:
      return new Date(child.lastModified());
    default:
      return null;
    }

  }

}
samples/swing/visualeditor/FolderTreeNode.java - Eclipse SDK
package samples.swing.visualeditor;

import java.io.File;
import java.io.FileFilter;

import javax.swing.tree.DefaultMutableTreeNode;
import javax.swing.tree.TreeNode;

public class FolderTreeNode extends DefaultMutableTreeNode {
  private File file;
  private File[] children;
  public FolderTreeNode(File file) {
    this.file = file;
    if (file.isDirectory()) {
      children = file.listFiles(new FileFilter() {
        public boolean accept(File file) {
          return file.isDirectory();
      }});
    }
  }
  public int getChildCount() {
    return children == null : children.length;
  }
  public TreeNode getChildAt(int i) {
    return new FolderTreeNode(children[i]);
  }
  public String toString() {
    return file.getName();
  }
  public File getFile() {
    return file;
  }
}
samples/swing/visualeditor/FolderTreeSelectionListener.java - Eclipse SDK
package samples.swing.visualeditor;

import javax.swing.event.TreeSelectionEvent;
import javax.swing.event.TreeSelectionListener;

public class FolderTreeSelectionListener implements TreeSelectionListener {
  private Frame frame;
  public FolderTreeSelectionListener(Frame frame) {
    this.frame = frame;
  }
  public void valueChanged(TreeSelectionEvent e) {
    FolderTreeNode ftn = (FolderTreeNode)e.getPath().getLastPathComponent();
    if (ftn != null) {
      frame.showFolder(ftn.getFile());
    }
  }
}