4

プロジェクトの MigLayout をテストしていますが、レイアウトされているパネル全体のサイズを制御する MigLayout の方法がわかりません。MigLayout ホワイトペーパーの例を適応させています。また、私は Python で書いており、Java ではなく Jython を使用しています。とはいえ、これが私の現在のコードです。

layout = MigLayout("fillx",
                   # Column constraints
                   "[right]rel[grow,fill]",
                   # Row constraints
                   "[]10[]10[]")
panel = JPanel(layout)

panel.add(JLabel("Enter size:"),
          "")
panel.add(JTextField(""),
          "wrap, width 150:250")
panel.add(JLabel("Enter weight:"),
          "")
panel.add(JTextField(""),
          "wrap, width 150:250")
panel.add(JButton("Ok"),
          "span 2, align center, width 100:150")

次に、パネルは表示のために JFrame に入ります。フレームのサイズを変更すると、コントロールのサイズが適切に変更され、最小サイズに従います。ただし、フレームに最小サイズはなく、パネルの実際の最小サイズに到達してフレームに設定する方法もないようです。パネルの最小サイズを要求すると、フレーム (およびインセット) に設定すると、ボタンとテキスト フィールドの半分を切り取るサイズが返されます。

私が欲しいのは、フレームの最小サイズを設定できるようにすることです (ハードコードではありません!) ので、パネルが収まり、そのコントロールが切り取られないようにすることができます。これを行う最善の方法は何ですか?

4

3 に答える 3

2

パック方法はどうですか???

アップデート:

今、私はあなたがやろうとしていることを理解しています。がっかりさせて申し訳ありませんが、スタンドアロン アプリケーションの 90% は

  1. 固定サイズ (サイズ変更不可) で、コンテンツに合わせて完全に調整されたダイアログ ウィンドウ

  2. サイズ変更可能だが最小サイズ (例: 800x600) のメイン ウィンドウ

あなたが望むもの (ハードコーディングされた値のないサイズ変更可能なウィンドウ) は可能ですが、達成するのは非常に困難です (これはアプリケーションの残りの 10% です)

Java Swing にはレイアウトに関する悪名高い問題があるため (これが非常に多くのレイアウト マネージャーが存在する主な理由です)、簡単な方法に従うことをお勧めします。

さまざまなコンポーネントの setPreferredSize メソッドと setMinimum size メソッドをいじることはできますが、完璧にするのは難しいでしょう。

于 2009-08-26T10:07:41.317 に答える
2

個人的には、優先サイズ (pack() の後に得られるものが適切である限り) である限り、最小サイズについてあまり強調しません。何らかの理由で、ユーザーがウィンドウをウィンドウ内のコンポーネントが収まるサイズに縮小したい場合たぶん、彼らはあなたのウィンドウの下部を邪魔にならないようにしたいだけなので、モニターに残っているものと他の何かを同時に見ることができます.

ウィンドウの真の最小サイズは、その境界線とタイトル バー、およびタイトル テキストと省略記号の数文字分のスペースの合計であると私は主張します。ユーザーが、すべてのコンポーネントがクリップされていない状態で表示できるものよりも小さいものを望んでいる場合、そうでなければ誰を強制する必要がありますか?

MIG Layout など、Web で利用可能ないくつかのテーブルベースのレイアウト マネージャーのいずれかを使用すると、必要なサイズ変更動作を簡単に取得できるはずです。

恥知らずなセルフ プラグイン: MIG Layout が使いにくい場合は、私のMatrixLayoutの方が使いやすいと思います。しかし、MIG レイアウトはより強力です。パネルが計算された最小サイズを下回ることを妨げないように、MatrixLayout を意図的にコード化することにしました。

于 2009-08-27T04:53:38.843 に答える
0

何もハードコーディングせずに、含まれているすべてのコンポーネントのサイズの合計に従ってフレームサイズを更新する方法を見つけました。

  1. JPanel panelに触れる代わりに、作業パネルとして を作成しますcontentPane。に追加するだけcontentPaneです。に触れないでくださいcontentPane。鍵です。

  2. panelハードコーディングされた行の高さ、列の幅などを使用せずにレイアウトを設定します。これにより、ハードコーディングされた高さがより少ないか、より多く必要になる可能性があり、間違ったサイズの行が残り、最後の行/列の半分がカットされたままになるため、レイアウトが台無しになる可能性がありますオフ。

  3. 要素を に追加しますpanel。それらを追加するときは、サイズを指定できます。

  4. panel戻すcontentPane:getContentPane().add(panel);のレイアウトを設定する必要はありませんcontentPane

  5. 最後にpack()setVisible(true)あなたが望むように。setSize()setBounds()などは必要ありません。インセットとギャップは MigLayout によって自動的に処理されます。ビオラ!

SCCEE:

import javax.swing.JButton;
import javax.swing.JFrame;
import javax.swing.JLabel;
import javax.swing.JPanel;
import javax.swing.SwingUtilities;

import net.miginfocom.swing.MigLayout;

public class InsetsAndBorder extends JFrame {
    public InsetsAndBorder() {
        begin();
    }

    private void begin() {
        setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);

        JPanel panel = new JPanel();
        panel.setLayout(new MigLayout("insets 2 2 2 2, fillx, debug", "3[]3[]3[]3", "5[]5[]5[]5"));

        JLabel label1 = new JLabel("1");
        JLabel label2 = new JLabel("2");

        JButton button = new JButton("No way!");

        panel.add(label1, "cell 1 2, grow");

        panel.add(label2, "cell 2 2, grow");

        panel.add(button, "cell 0 1, grow");

        getContentPane().add(panel);
        pack();
        setLocationRelativeTo(null);
        setVisible(true);
    }
    public static void main(String[] args) {
        SwingUtilities.invokeLater(new Runnable() {

            @Override
            public void run() {
                InsetsAndBorder frame = new InsetsAndBorder();

            }

        });
    }
}
于 2016-10-07T12:28:53.103 に答える