java - 组布局错误: can't find the wrong line in my code

标签 java swing layout-manager grouplayout

我正在尝试制作一个 GroupLayout,但每次编译时都会出现错误。我在代码中找不到错误的行,在我看来是正确的。为什么我会收到这些错误?

构造函数中的代码(扩展 JFrame):

mem_settings = new JPanel();

    lbl_mem_settings = new JLabel("Memory settings");
    lbl_mem_select = new JLabel("Type");
    cb_mem_select = new JComboBox(new String[] {"24C01","24C02","24C04"});


    // Layout
    GroupLayout GL = new GroupLayout(mem_settings);
    mem_settings.setLayout(GL);
    GL.setAutoCreateGaps(true);
    GL.setAutoCreateContainerGaps(true);

    GL.setHorizontalGroup(GL.createSequentialGroup()
        .addGroup(GL.createParallelGroup(LEADING)
            .addComponent(lbl_mem_settings)
            .addComponent(lbl_mem_select))
        .addGroup(GL.createParallelGroup(LEADING)
            .addComponent(cb_mem_select))
    );
    GL.setVerticalGroup(GL.createSequentialGroup()
        .addGroup(GL.createParallelGroup(BASELINE)
            .addComponent(lbl_mem_settings))
        .addGroup(GL.createParallelGroup(BASELINE)
            .addComponent(lbl_mem_settings)
            .addComponent(cb_mem_select))  
    );

    add(mem_settings);
    setDefaultCloseOperation(EXIT_ON_CLOSE);
    pack();
    setVisible(true);

以及我得到的错误:

run:
Exception in thread "main" java.lang.IllegalStateException: javax.swing.JLabel[,0,0,0x0,invalid,alignmentX=0.0,alignmentY=0.0,border=,flags=8388608,maximumSize=,minimumSize=,preferredSize=,defaultIcon=,disabledIcon=,horizontalAlignment=LEADING,horizontalTextPosition=TRAILING,iconTextGap=4,labelFor=,text=Type,verticalAlignment=CENTER,verticalTextPosition=CENTER] is not attached to a vertical group
    at javax.swing.GroupLayout.checkComponents(GroupLayout.java:1090)
    at javax.swing.GroupLayout.prepare(GroupLayout.java:1040)
    at javax.swing.GroupLayout.preferredLayoutSize(GroupLayout.java:878)
    at java.awt.Container.preferredSize(Container.java:1794)
    at java.awt.Container.getPreferredSize(Container.java:1778)
    at javax.swing.JComponent.getPreferredSize(JComponent.java:1661)
    at java.awt.BorderLayout.preferredLayoutSize(BorderLayout.java:719)
    at java.awt.Container.preferredSize(Container.java:1794)
    at java.awt.Container.getPreferredSize(Container.java:1778)
    at javax.swing.JComponent.getPreferredSize(JComponent.java:1661)
    at javax.swing.JRootPane$RootLayout.preferredLayoutSize(JRootPane.java:920)
    at java.awt.Container.preferredSize(Container.java:1794)
    at java.awt.Container.getPreferredSize(Container.java:1778)
    at javax.swing.JComponent.getPreferredSize(JComponent.java:1661)
    at java.awt.BorderLayout.preferredLayoutSize(BorderLayout.java:719)
    at java.awt.Container.preferredSize(Container.java:1794)
    at java.awt.Container.getPreferredSize(Container.java:1778)
    at java.awt.Window.pack(Window.java:809)
    at memcryp.GUI.<init>(GUI.java:46)
    at memcryp.MEMCRYP.main(MEMCRYP.java:20)
BUILD STOPPED (total time: 6 minutes 39 seconds)

最佳答案

但是错误消息很清楚。您名为 lbl_mem_selectJLabel 仅附加到水平组:

GL.setHorizontalGroup(GL.createSequentialGroup()
        .addGroup(GL.createParallelGroup(LEADING)
            .addComponent(lbl_mem_settings)
            .addComponent(lbl_mem_select)) //here you attach the label
        .addGroup(GL.createParallelGroup(LEADING)
            .addComponent(cb_mem_select))
    );

但是,在您的垂直组中,您没有包含该标签。将垂直组的代码更改为

GL.setVerticalGroup(GL.createSequentialGroup()
        .addGroup(GL.createParallelGroup(BASELINE)
            .addComponent(lbl_mem_settings)
            .addComponent(lbl_mem_select)) //add this line
        .addGroup(GL.createParallelGroup(BASELINE)
            .addComponent(lbl_mem_settings)
            .addComponent(cb_mem_select))  
    );

应该这样做。

话虽这么说……您真的想使用GroupLayout 来手动编写 UI 代码吗?引自 GroupLayout 教程

GroupLayout is a layout manager that was developed for GUI builders such as Matisse, the GUI builder provided with the NetBeans IDE

虽然可以用它来手动编写布局,但它需要大量(不可读的恕我直言)代码来完成。还有其他(第三方)布局管理器更适合手动编码布局。

关于java - 组布局错误: can't find the wrong line in my code,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/26452809/

相关文章:

java - 使用 JFrame/JPanel/Netbeans 自定义图形位置

java - 如何使用java拍摄多个应用程序的屏幕截图,即多个https URL?

java - 使用 Jackson Parser 从 JSON 代码获取属性

java - 将耳朵部署到 Glassfish 时出错

java - JTable 的 setValueAt() 方法不更新单元格数据

java - Swing 布局 - 中心面板滚动多个 JEditorPanes

JavaFX 阻止 UI(和代码)直到服务器调用完成

java - 对加载最多约 30,000 条记录的相关下拉列表的性能影响

具有固定边框的 Java GUI Jlabel

java - 如何将所有元素放入 JPanel 中?