4

でMigLayoutを使用しDialogBoxます。

すべてのパネルは MigLayout を使用します。

ショー行のパネルがあります。列ごとにパネルがあります(配信タイプ、要素の選択、出撃)。出力ファイル行のパネルがあります。ボタン用のパネルがあります。

あまりにも多くのパネルなしでそれを行うためのより良い方法があるかもしれません?

milayout の例

私のコード

//set global layout
this.setLayout( new MigLayout( "wrap 3, debug" ) );

this.add( getSearchPanel(), "span 3, wrap" );

// middle section
this.add( getLivraison(), "width 33%" );
this.add( getChoixElement(), "width 33%" );
this.add( getProfile(), "width 33%" );

JLabel lblFichierSortie = new JLabel( "Output file" );
JTextField txtFichierSortie = new JTextField();
this.add( lblFichierSortie, "span 2, right" );
this.add( txtFichierSortie, "width 33%, wrap" );

this.add( getButton(), "span 3, right" );

private JPanel getSearchPanel() {
    JPanel searchPanel = new JPanel( new MigLayout() );

    JLabel lblEmission = new JLabel( "Show" );
    JTextField txtEmission = new JTextField( 10 );
    JTextField txtEM = new JTextField( 5 );

    searchPanel.add( lblEmission, "width 2%" );
    searchPanel.add( txtEmission, "split 2,right,width 60%, growx" );
    searchPanel.add( txtEM, "width 38%, growx" );

    return searchPanel;
}

private JPanel getLivraison() {
    JPanel livraisonPanel = new JPanel( new MigLayout() );
    JLabel lblComponent1 = new JLabel( "Delivery type" );
    JCheckBox chkFluxElementaire = new JCheckBox( "Flux" );
    JCheckBox chkTranscoding = new JCheckBox( "Transcoding" );

    livraisonPanel.add( lblComponent1, "wrap" );
    livraisonPanel.add( chkFluxElementaire, "wrap" );
    livraisonPanel.add( chkTranscoding, "wrap" );

    return livraisonPanel;
}

private JPanel getChoixElement() {
    JPanel component2 = new JPanel( new MigLayout() );
    JLabel lblChoix = new JLabel( "Choose element" );
    JLabel lblVideo = new JLabel( "Vidéo" );


    JLabel lblAudio = new JLabel( "Audio" );
    JLabel lblAudio2 = new JLabel( "Audio 2" );
    JLabel lblSubTitle = new JLabel( "ST" );
    JLabel lblMontage = new JLabel( "Montage" );

    //todo put combobox below every label
    component2.add( lblChoix, "wrap" );
    component2.add( lblVideo,"wrap" );
    component2.add( lblAudio,"wrap" );
    component2.add( lblAudio2, "wrap" );
    component2.add( lblSubTitle, "wrap" );
    component2.add( lblMontage, "wrap" );

    return component2;
}

private JPanel getProfile() {
    JPanel component3 = new JPanel( new MigLayout() );
    JLabel lblSortie = new JLabel( "Sortie" );
    component3.add( lblSortie, "wrap" );

    JLabel lblProfil = new JLabel( "Profil" );
    component3.add( lblProfil, "wrap" );

    JComboBox cbxProfil = new JComboBox();
    component3.add( cbxProfil, "wrap" );

    return component3;
}

private JPanel getButton() {
    JPanel buttonPanel = new JPanel( new MigLayout( "fillx,insets 0" ) );

    JButton okButton = new JButton( "Ok" );
    okButton.setMnemonic( 'O' );
    buttonPanel.add( okButton, "split,right,width 100!" );

    // Cancel button
    JButton cancelButton = new JButton( "Cancel" );
    cancelButton.setMnemonic( 'C' );

    buttonPanel.add( cancelButton, "width 100!" );
    return buttonPanel;
}

ウィンドウを移動するまでテキストフィールドのサイズがありません。理由がわかりません。また、すべての列のコンポーネントがパネルの上部から始まっていないのはなぜですか?

4

1 に答える 1

3

「上部の配置の問題」に対してこれを試してください:

// set global layout
this.setLayout(new MigLayout("wrap 3, debug", null, "[top]"));

そして「テックスフィールドのサイズの問題」の場合:

this.add(getSearchPanel(), "span 3, wrap, grow");

内部 JPanel なしで同じ結果を得たい場合は、次のようにします。

final JLabel lblEmission = new JLabel("Show");
final JTextField txtEmission = new JTextField(10);
final JTextField txtEM = new JTextField(5);

this.add(lblEmission, "width 2%, span 3, split 3");
this.add(txtEmission, "right,width 60%, growx");
this.add(txtEM, "width 38%, growx");

ただし、これは私のお気に入りのソリューションではありません。内部パネルを使用すると、コードがよりシンプルになり、再利用可能になります。コンポーネント上でのユーザー インタラクション用のリスナーと、モデルとのインタラクション用のコントローラを追加すると、このコードは非常に複雑になると思います。これが発生した場合、単一の責任SearchPanelを持つ再利用可能な最上位クラスに抽出することができます。単純な内部パネルがないと、このクラスを抽出するのははるかに困難になります。

これが、Swing GUI を設計するとき、最初にBorderLayoutを使用し、次に MigLayout (より複雑なパネル用) を使用することを好む理由です。

于 2012-08-24T12:19:22.557 に答える