ぶらっ記ぃ(旧)

やりなおし→ http://nomadblacky.hatenablog.com/

<Java> MigLayoutの扱い方

部活向けドキュメント

MigLayoutは文字列による指定でレイアウトを変更する、少し変わったレイアウトマネージャです。
初見は複雑に見えますが、それぞれ文字列の意味さえわかってしまえばとても柔軟にレイアウトを組むことができます。
自身も使って間もないですが、その便利さに他のレイアウトマネージャが不要になるぐらいです。
では、実際に見て行きましょう。

<<参考資料>>

MigLayout (MiGLayout 3.7.4 API)

miglayout-tutorial

八角研究所 : Java の MiGLayout で超簡単にGUIアプリを作る方法

<<目次>>

  1. コンストラクタ
  2. 複数段にコンポーネントを配置(改行)する
  3. セルの結合・セルいっぱいにコンポーネントを表示
  4. コンポーネントの大きさを調整する
  5. セルのサイズを調整する
  6. セル内のコンポーネントの位置指定


コンストラクタ

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の扱い方

部活向けドキュメント

  1. JTableのコンストラクタ
  2. テーブルに後からデータを追加する
  3. データを取得する/変更する/削除する
  4. セルを直接編集不可能にする
  5. そのほか




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);

表示例
jtable01


テーブルに後からデータを追加する

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);

表示例
jtable02


データを取得する/変更する/削除する


// データを取得する
// 戻り値は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^)/

GitHubめも

GitHub使い始めた。
個人的なメモ。色々間違ってるかも。

リポジトリの作成とプッシュ

  1. GitHubでリポジトリを作成
  2. 以下のコマンドを入力
    1. $ git init
      // 初期化。
    2. $ git add .
      // ディレクトリ内すべてのファイルをadd(よくわかr)
    3. $ git commit -m "commit message"
      // ローカル環境へのコミット。
    4. $ git remote add origin [URL]
      // githubのリポジトリを"origin"という名前で登録。
      // リポジトリのページに表示されたURLを記述。
    5. $ git push -u origin master
      // githubにプッシュ。


更新をプッシュ

  1. $ git add .
  2. $ git commit -m "commit message"
  3. $ git push -u origin master
    // "$ git push" と省略可


リポジトリを取得(チェックアウト)

$ git clone [URL]

近状 [2013-02-27]

更新してない間のできごと


  • 仮想環境だと動画とか重いからWin7&Ubuntu12.10のデュアルブート環境に乗り換え。

  • Wubiを使ったのもあり、パーティション分けとかよく考えナシに、Windowsでも使用するパーティションにUbuntuをインストールしてしまった。
    結果、それが原因かは不明瞭だがSkypeのインストールができなかった。

  • パーティションを分けて、Wubiを使わずCDブートから再インストール。
    Skypeのインストールも成功し、ついでにWubiインストールではサポートされてなかったハイバネーションを獲得。

  • 以前からEmacsが気になってたので、本を購入して現在勉強中。

Emacs実践入門 ?思考を直感的にコード化し、開発を加速する (WEB+DB PRESS plus)

Emacs実践入門 ?思考を直感的にコード化し、開発を加速する (WEB+DB PRESS plus)