Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/399.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 文本字段大小和垂直对齐_Java_Swing_Layout_Miglayout - Fatal编程技术网

Java 文本字段大小和垂直对齐

Java 文本字段大小和垂直对齐,java,swing,layout,miglayout,Java,Swing,Layout,Miglayout,我在对话框中使用 每个面板都使用MIG布局 有一个用于显示行的面板。 每列都有一个面板(交付类型、选择元素、架次)。 输出文件行有一个面板。 有一个按钮面板 也许有一个更好的方法,不用太多的面板 我的代码 //set global layout this.setLayout( new MigLayout( "wrap 3, debug" ) ); this.add( getSearchPanel(), "span 3, wrap" ); // middle section this.add

我在
对话框中使用

每个面板都使用MIG布局

有一个用于显示行的面板。 每列都有一个面板(交付类型、选择元素、架次)。 输出文件行有一个面板。 有一个按钮面板

也许有一个更好的方法,不用太多的面板

我的代码

//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;
}
在我移动窗口之前,我的文本字段没有大小,我不明白为什么。 还有,为什么每一列的组件都不是从面板顶部开始的呢?

试试这个“顶部对齐问题”:

对于“texfield大小问题”:

如果希望在没有内部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时,我更喜欢先使用,然后使用MigLayout(对于更复杂的面板)。

一行中的组件默认为垂直居中-您可以向布局添加“顶部”行约束以修复该部分。我将这些方法的布局置于顶部:getLivraison()getChoixElement()getProfile()我得到了相同的结果。将其作为行约束放在主布局中:
this.setLayout(新的MigLayout(“wrap 3,debug”);
。我使用的行很好:
this.setLayout(新的MigLayout(“wrap 3,debug”),null,“[top]”)
hmm…您使用嵌套面板的原因是什么?虽然可行,但miglaway设计为多功能一体(或多功能一体)布局这项工作,对于文本字段大小问题,有没有办法不用面板来解决?习惯上,我更喜欢有一个简单的解决方案。通常使用嵌套面板会更容易。我从来没有发现性能上有很大的差异。我用过几次miglayout,理解它的代码并不总是很简单。当然,我不认为有几个简单的面板l的性能不如单一的复杂面板。嵌套的主要缺点是难以跨容器对齐组件
this.add(getSearchPanel(), "span 3, wrap, grow");
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");