<Java> MigLayoutの扱い方
部活向けドキュメント
MigLayoutは文字列による指定でレイアウトを変更する、少し変わったレイアウトマネージャです。
初見は複雑に見えますが、それぞれ文字列の意味さえわかってしまえばとても柔軟にレイアウトを組むことができます。
自身も使って間もないですが、その便利さに他のレイアウトマネージャが不要になるぐらいです。
では、実際に見て行きましょう。
<<参考資料>>
MigLayout (MiGLayout 3.7.4 API)
八角研究所 : Java の MiGLayout で超簡単にGUIアプリを作る方法
<<目次>>
コンストラクタ
MigLayout() レイアウトの設定を特にせずインスタンスを生成 MigLayout(String layoutConstraints, String colConstraints, String rowConstraints) 上から、レイアウトの設定、列の設定、行の設定でインスタンスを生成 これらの設定については後述
これだけではもちろんわからないので、実際に例示しながら見て行きましょう。
複数段にコンポーネントを配置(改行)する
// import省略 public class TestFrame extends JFrame { public TestFrame() { JPanel panel = new JPanel(); // レイアウトの設定なしでインスタンス生成 MigLayout layout = new MigLayout("", "", ""); // パネルにレイアウトのインスタンスを設定 panel.setLayout(layout); // パネルにコンポーネントを追加していく panel.add(new JButton("1A"), ""); panel.add(new JButton("1B"), ""); panel.add(new JButton("1C"), "wrap"); // wrapで改行する panel.add(new JButton("2A"), ""); panel.add(new JButton("2B"), ""); panel.add(new JButton("2C"), ""); panel.add(new JButton("2D"), "wrap"); // 改行 panel.add(new JButton("3A"), ""); // 自身(TestFrame)にパネルを追加する this.add(panel); } public static void main(String[] args) { TestFrame testFrame = new TestFrame(); testFrame.setSize(400, 300); // 画面の中央に表示させる testFrame.setLocationRelativeTo(null); testFrame.setVisible(true); } }
表示例
MigLayoutでは、FlowLayoutのようにコンテナ(JPanel)の上からコンポーネントが追加されます。
ここでは、panel.addするときに、"wrap"という文字列を記述することによって、コンポーネントが改行されて追加されました。
このように、特定の文字列を記述することにより、レイアウトの変更ができます。
セルの結合・セルいっぱいにコンポーネントを表示
上記のプログラムを一部書き換えます。
public TestFrame() { // 〜省略〜 panel.add(new JButton("2D"), "wrap"); // 改行 // ↓書き換える↓------------------ panel.add(new JButton("3A"), "span, grow"); // ------------------------------- this.add(panel); }
表示例
"span"は、セルを連結を指定します。
"grow"は、セルいっぱいにコンポーネントを表示します。
と、いきなりセルという言葉が出てきてちょっと混乱しちゃいますね。
実際セルがどのような状態をしているのかは、WindowBuilderを使っていれば視覚的に分かると思います。
上記の画像を見ると、ボタンひとつひとつにセルが割り当てられているのがわかります。
そのうち、"span, grow"を指定した"3A"のボタンは、セルを端まで連結した上に、コンポーネントをセル全体に広げていますね。
補足
"span"の後ろに整数を加えることによって、連結するセルの数を指定することができます。
また、"wrap"の後ろにも整数を加えることによって、行間の幅を指定することができます。
// 行間を100pxに設定 panel.add(new JButton("2D"), "wrap 100"); // セルを2つ連結する panel.add(new JButton("3A"), "span 2, grow");
表示例
コンポーネントの大きさを調整する
コンポーネントの大きさを指定するには、"height","width"を使います。
// 〜省略〜 panel.add(new JButton("1A"), "height 100"); // 高さを100pxに指定 panel.add(new JButton("1B"), "width 200"); // 幅を200pxに指定 panel.add(new JButton("1C"), "wrap"); panel.add(new JButton("2A"), "h 100"); // このように panel.add(new JButton("2B"), "w 200"); // 省略も可能 // 〜省略〜
表示例
セルのサイズを調整する
public TestFrame() { setSize(600, 400); JPanel panel = new JPanel(); MigLayout layout = new MigLayout( "wrap 3", // 全体的なレイアウト設定(layoutConstraints) "[200][200][200]", // 列のセル指定(colConstraints) "[100][100][100]" // 行のセル指定(rowConstraints) ); // パネルにレイアウトのインスタンスを設定 panel.setLayout(layout); // パネルにコンポーネントを追加していく panel.add(new JButton("1A"), ""); panel.add(new JButton("1B"), ""); panel.add(new JButton("1C"), ""); panel.add(new JButton("2A"), ""); panel.add(new JButton("2B"), ""); panel.add(new JButton("2C"), ""); panel.add(new JButton("3A"), ""); panel.add(new JButton("3A"), ""); panel.add(new JButton("3A"), ""); // 自身(TestFrame)にパネルを追加する this.add(panel); }
表示例
コンストラクタにもある、
- layoutConstraints
- colConstraints
- rowConstraints
layoutConstraintsで"wrap 3"を指定しています。
ここでは、3回addするごとに自動的に"wrap"が付加されることを意味します。
colConstraintsでは、中括弧の中に数字を指定しています。
ここでは、列の幅(横の長さ)を200pxに設定しています。
同じく、rowConstraintsも行の幅を100pxに設定しています。
セル内のコンポーネントの位置指定
panel.add(new JButton("1A"), "top, left"); panel.add(new JButton("1B"), "t, center"); panel.add(new JButton("1C"), "t, right");
panel.add(new JButton("2A"), "l"); panel.add(new JButton("2B"), "c"); panel.add(new JButton("2C"), "r");
panel.add(new JButton("3A"), "bottom, left"); panel.add(new JButton("3A"), "b, c"); panel.add(new JButton("3A"), "b, r");
横位置を、
- left(左揃え)
- center(中央揃え)
- right(右揃え)
縦位置を、
- top(上揃え)
- center(中央揃え)
- bottom(下揃え)
それぞれ、頭文字の省略形で書くことも可能です。
表示例
<Java> Swing#JTableの扱い方
部活向けドキュメント
JTableのコンストラクタ
JTable() 行列ゼロの空テーブルを作成 JTable(int numRows, int numColumns) 縦(Rows)×横(Columns)に空のセルを持つテーブルを作成 JTable(Object[][] rowData, Object[] columnNames) 列名(columnNames)と、セルにデータ(rowData)を持ったテーブルを作成 JTable(TableModel model) データモデル(後述)を持ったテーブルを作成 ※ Row = 行, Column = 列
*Example01*
// デザイン周りの記述は省略しています。 String[] columnNames = { "ID", "なまえ", "せんとうりょく"}; String[][] tabledata = { {"01", "Hoge君", "1"}, {"02", "foo子ちゃん", "50000"}, {"03", "bar太郎", "300"} }; JTable table = new JTable(tabledata, columnNames);
表示例
テーブルに後からデータを追加する
JTableクラス単体ではデータの変更や削除をするのが面倒です。
そこで、DefaultTableModelというクラスを使用します。
このクラスはテーブルのデータ部分を管理します。
*Example02(データの追加)*
String[] columnNames = { "ID", "なまえ", "せんとうりょく"}; String[][] tabledata = { {"01", "Hoge君", "1"}, {"02", "foo子ちゃん", "50000"}, {"03", "bar太郎", "300"} }; DefaultTableModel model = new DefaultTableModel(tabledata, columnNames); // テーブルとモデルを対応付ける JTable table = new JTable(model); // modelを弄ることによりテーブルの内容を変更する。 // 列を追加 model.addColumn("趣味"); // 行を追加 String[] huga = {"04","huga","-100","素振り"}; model.addRow(huga);
表示例
データを取得する/変更する/削除する
// データを取得する // 戻り値はObject型であるため、Stringなどにキャストすること。 .getValueAt(int row, int col); // データを変更する .setValueAt(Object value, int row, int col); // 一行削除する .removeRow(int row)
セルを直接編集不可能にする
// DefaultTableModel.isCellEditableをオーバーライドして、 // 常にfalseを返すようにする。 DefaultTableModel model = new DefaultTableModel() { @Override public boolean isCellEditable(int row, int column) { return false; } };
そのほか
自分もまだ試してないこととか
- コンストラクタのObject型にもある通り、テーブルのデータは文字列や数字に限らない。
画像を表示したりなんかもできる(みたい)。 - 行の挿入
insertRow(int row, Object[] rowData) - 行の移動
moveRow(int start, int end, int to)
ゲームパッドの操作でマウスポインタが動いてしまう@Ubuntu
今日もNullpoMinoやるぞー(^o^)
と思ったら、なぜかゲームパッドの操作と一緒にマウスポインタまで動いてしまう…
前回やった数日前までそんなこと無かったのに…
google先生に聞いてみるものの、これといった解決方法が見つからず。
それっぽいのはあったけど英語読めな(ry
ゲームできないのも困るので、とりあえず試行錯誤してみた。
そういえば、タッチパッドをxinputコマンドで無効にしたのを思い出す。
$ xinput --list
⎡ Virtual core pointer id=2 [master pointer (3)] ⎜ ↳ Virtual core XTEST pointer id=4 [slave pointer (2)] ⎜ ↳ PIXART USB OPTICAL MOUSE id=10 [slave pointer (2)] ⎜ ↳ WiseGroup.,Ltd JC-PS101U id=12 [slave pointer (2)] ⎜ ↳ FSPPS/2 Sentelic FingerSensingPad id=15 [slave pointer (2)] ⎣ Virtual core keyboard id=3 [master keyboard (2)] ↳ Virtual core XTEST keyboard id=5 [slave keyboard (3)] ↳ Power Button id=6 [slave keyboard (3)] ↳ Video Bus id=7 [slave keyboard (3)] ↳ Power Button id=8 [slave keyboard (3)] ↳ Sleep Button id=9 [slave keyboard (3)] ↳ USB Webcam id=13 [slave keyboard (3)] ↳ AT Translated Set 2 keyboard id=14 [slave keyboard (3)] ↳ WiseGroup.,Ltd JC-PS101U (keys) id=11 [slave keyboard (3)]
"WiseGroup.,Ltd JC-PS101U"というのがゲームパッドみたい。
っていうか、なんでポインティングデバイスのところにゲームパッドが…
これが原因では…
$ xinput --watch-props 12
Device 'WiseGroup.,Ltd JC-PS101U': Device Enabled (142): 1 Coordinate Transformation Matrix (144): 1.000000, 0.000000, 0.000000, 0.000000, 1.000000, 0.000000, 0.000000, 0.000000, 1.000000 Device Accel Profile (266): 0 ・ ・(以下略) ・
こいつを無効に…
$ xinput --set-prop 12 "Device Enabled" 0
直ったーーーーーーーー\(^o^)/
近状 [2013-02-27]
更新してない間のできごと
仮想環境だと動画とか重いからWin7&Ubuntu12.10のデュアルブート環境に乗り換え。Wubiを使ったのもあり、パーティション分けとかよく考えナシに、Windowsでも使用するパーティションにUbuntuをインストールしてしまった。
結果、それが原因かは不明瞭だがSkypeのインストールができなかった。パーティションを分けて、Wubiを使わずCDブートから再インストール。
Skypeのインストールも成功し、ついでにWubiインストールではサポートされてなかったハイバネーションを獲得。以前からEmacsが気になってたので、本を購入して現在勉強中。
Emacs実践入門 ?思考を直感的にコード化し、開発を加速する (WEB+DB PRESS plus)
- 作者: 大竹智也
- 出版社/メーカー: 技術評論社
- 発売日: 2012/03/07
- メディア: 単行本(ソフトカバー)
- 購入: 22人 クリック: 392回
- この商品を含むブログ (1件) を見る