2

ユーザーが複数のフィールドにデータを入力する必要があるアプリケーションを作成する予定ですが、一部のフィールドは常に使用されるとは限りません。私がこのプログラムを開発する相手は、使用するフィールドを毎回選択できるようにしたいと考えています。私は次のことを考えました(しかし、それを行う方法はよくわかりません):

まず、使用可能なすべてのフィールドのリストと、それぞれを選択するためのチェックボックスを表示します。次に、すべてのフィールドが用意された JFrame を用意し、ユーザーの選択に基づいて、未使用のフィールドを抑制し、表示される可能性のあるギャップを削除してフォームをレイアウトします。(フレームのコンポーネントに setvisible() を使用し、必要のない要素を非表示にするときに表示されるそれらの間のギャップを解消する方法を見つけることを考えました)。しかし、これが最も効果的な方法だとは思いません。フレームが整頓されていて美しく見えるべきであると言う必要はありません。提案をお待ちしております。よろしくお願いします。

違いがある場合は、これに netbeans デザイン モードを使用します。

4

2 に答える 2

6

http://docs.oracle.com/javase/6/docs/api/java/awt/Window.html#pack ()

JFrame内容に合わせてウィンドウのサイズを変更するpack()メソッドがあります。

于 2012-09-25T03:49:58.897 に答える
4

レイアウト要件の場合と同様に、タスクは適切な LayoutManager を見つけて、コンポーネントの可視性に応じて利用可能なスペースをどのように配分するかを判断することです。これで、あなたの仕事は要約すると、可視性を切り替えて身を乗り出すことになります。

ほとんどのコア マネージャは、非表示のコンポーネントを単純に無視します (これは、必要な場合とそうでない場合があります)。高度なマネージャーは、可視コンポーネントとまったく同じ方法で処理することから、無視することまで、あらゆる範囲で構成できます。Fi MigLayout (現時点での私のお気に入り) には、4 つのレベルの非表示モードがあります (同じように、コンポーネントのサイズを 0,0 に、コンポーネントのサイズを 0,0 に変更し、周囲のすべてのギャップをゼロにし、完全に無視します)。

以下は簡単な例です。異なる動作を確認するには、textField と一緒に textfield のラベルを非表示にして、hidemode のさまざまな順列を試してみてください。

// hidemode 3 == ignore in layout
// hidemode 2 == zero size and zero gaps
// hidemode 1 == zero size
// hidemode 0 == same as visible
MigLayout layout = new MigLayout("wrap 2, hidemode 3");
JComponent content = new JPanel(layout);
JPopupMenu popup = new JPopupMenu();
for (int i = 0; i < 5; i++) {
    JTextField field = new JTextField("field " + i, 20);
    field.setName(field.getText());
    JLabel label = new JLabel("Label " + i);
    label.setLabelFor(field);
    content.add(label);
    content.add(field);
    popup.add(new JCheckBoxMenuItem(new ToggleVisibilityAction(field, true)));
}
content.setComponentPopupMenu(popup);

// action to toggle the visibility of a target component
// optionally w/out its label
public static class ToggleVisibilityAction extends AbstractAction {

    private JComponent target;
    private boolean hideLabel;

    public ToggleVisibilityAction(JComponent comp, boolean hideLabel) {
        super(comp.getName());
        this.target = comp;
        this.hideLabel = hideLabel;
        putValue(SELECTED_KEY, target.isVisible());
    }
    @Override
    public void actionPerformed(ActionEvent e) {
        boolean visible = (boolean) getValue(SELECTED_KEY);
        target.setVisible(visible);
        if (hideLabel && target.getClientProperty("labeledBy") instanceof JComponent) {
            ((Component) target.getClientProperty("labeledBy")).setVisible(visible);
        }
        target.getParent().revalidate();
    }

}
于 2012-09-25T08:45:17.877 に答える