Java 设置不同JComponent对象组的对齐方式

Java 设置不同JComponent对象组的对齐方式,java,swing,user-interface,alignment,Java,Swing,User Interface,Alignment,我有一个关于如何在GUI上对齐组件的问题 参考上面的屏幕截图,我希望复选框彼此对齐,但这里我得到的是一个复选框LC代理,它不符合要求,因为在同一行上有一个额外的组合框 有人能建议我应该做出哪些必要的改变来实现我的目标吗?我们还欢迎您就如何改进代码/显示提出其他建议 如果标题有误导性,请道歉;我不知道还能叫什么名字 以下是我的GUI的代码: /** * Builds the elements for the GUI */ private void build() { // define

我有一个关于如何在GUI上对齐组件的问题

参考上面的屏幕截图,我希望复选框彼此对齐,但这里我得到的是一个复选框LC代理,它不符合要求,因为在同一行上有一个额外的组合框

有人能建议我应该做出哪些必要的改变来实现我的目标吗?我们还欢迎您就如何改进代码/显示提出其他建议

如果标题有误导性,请道歉;我不知道还能叫什么名字

以下是我的GUI的代码:

/**
 * Builds the elements for the GUI
 */
private void build() {
    // define properties
    this.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
    this.setLocation(100, 100);
    this.setSize(360, 250);
    this.setResizable(false);

    // build elements
    movFileField = new JTextField(30);
    movFileField.setEditable(false);
    JLabel textFieldLabel = new JLabel("MOV file: ");
    textFieldLabel.setLabelFor(movFileField);

    JPanel filenamePane = new JPanel();
    filenamePane.setLayout(new FlowLayout());
    filenamePane.add(textFieldLabel);
    filenamePane.add(movFileField);

    JCheckBox checkIPV = new JCheckBox("IPV Proxy");
    checkIPV.setSelected(configMap.get(EpoxyConfigField.IPV_PROXY.name()).isEnabled());
    toggleMap.put(EpoxyConfigField.IPV_PROXY, checkIPV);
    flickComps.add(checkIPV);

    JCheckBox checkITX = new JCheckBox("ITX Proxy");
    checkITX.setSelected(configMap.get(EpoxyConfigField.ITX_PROXY.name()).isEnabled());
    toggleMap.put(EpoxyConfigField.ITX_PROXY, checkITX);
    flickComps.add(checkITX);

    JCheckBox checkLC = new JCheckBox("LC Proxy");
    checkLC.setSelected(configMap.get(EpoxyConfigField.LC_PROXY.name()).isEnabled());
    toggleMap.put(EpoxyConfigField.LC_PROXY, checkLC);
    flickComps.add(checkLC);

    JComboBox<String> comboLCProfile = new JComboBox<String>("A;C;D;Dxd;E".split(";"));

    JCheckBox checkArchive = new JCheckBox("Archive Asset");
    checkArchive.setSelected(configMap.get(EpoxyConfigField.ARCHIVE.name()).isEnabled());
    toggleMap.put(EpoxyConfigField.ARCHIVE, checkArchive);
    flickComps.add(checkArchive);

    JPanel checkboxPane = new JPanel();
    checkboxPane.setLayout(new BoxLayout(checkboxPane, BoxLayout.PAGE_AXIS));
    checkboxPane.add(checkIPV);
    checkboxPane.add(checkITX);

// This is the part I'm having problems with
    JPanel lcproxyPane = new JPanel();
    lcproxyPane.add(checkLC);
    lcproxyPane.add(comboLCProfile);
    checkboxPane.add(lcproxyPane);

    checkboxPane.add(checkArchive);
    checkboxPane.setBorder(BorderFactory.createEmptyBorder(10,10,10,10));

    JButton processButton = new JButton("Process");
    processButton.setActionCommand(COMMAND_PROCESS);
    processButton.addActionListener(this);
    flickComps.add(processButton);

    JButton selectButton = new JButton("Select");
    selectButton.setActionCommand(COMMAND_SELECT);
    selectButton.addActionListener(this);
    flickComps.add(selectButton);

    statusField = new JTextArea(10,20);
    statusField.setEditable(false);
    statusField.setLineWrap(true);

    JPanel buttonPane = new JPanel();
    buttonPane.setLayout(new BoxLayout(buttonPane, BoxLayout.LINE_AXIS));
    buttonPane.add(Box.createRigidArea(new Dimension(50, 0)));
    buttonPane.add(processButton);
    buttonPane.add(Box.createHorizontalGlue());
    buttonPane.add(selectButton);
    buttonPane.add(Box.createRigidArea(new Dimension(50, 0)));
    buttonPane.setBorder(BorderFactory.createEmptyBorder(0,10,10,10));

    JPanel bottomPane = new JPanel();
    bottomPane.setLayout(new BoxLayout(bottomPane, BoxLayout.PAGE_AXIS));
    bottomPane.add(buttonPane);
    bottomPane.add(new JScrollPane(statusField));

    Container contentPane = this.getContentPane();
    contentPane.add(filenamePane, BorderLayout.PAGE_START);
    contentPane.add(checkboxPane, BorderLayout.CENTER);
    contentPane.add(bottomPane, BorderLayout.PAGE_END);

    this.pack();
}

无法对齐组件的原因是您使用的布局使得对齐这些组件非常困难。 我建议您使用FlowLayout而不是FlowLayout

例如:

    JPanel checkboxPane = new JPanel();

    GridBagLayout gbl_checkboxPane = new GridBagLayout();
    gbl_checkboxPane.columnWidths = new int[]{430, 0, 0};
    gbl_checkboxPane.rowHeights = new int[]{27, 27, 27, 27};
    gbl_checkboxPane.columnWeights = new double[]{1.0, 0.0, Double.MIN_VALUE};
    gbl_checkboxPane.rowWeights = new double[]{0.0, 0.0, 0.0, 0.0, Double.MIN_VALUE};
    checkboxPane.setLayout(gbl_checkboxPane);

    JCheckBox checkIPV = new JCheckBox("IPV Proxy");

    GridBagConstraints gbc_checkIPV = new GridBagConstraints();
    gbc_checkIPV.anchor = GridBagConstraints.WEST;
    gbc_checkIPV.fill = GridBagConstraints.VERTICAL;
    gbc_checkIPV.insets = new Insets(0, 0, 5, 5);
    gbc_checkIPV.gridx = 0;
    gbc_checkIPV.gridy = 0;
    checkboxPane.add(checkIPV, gbc_checkIPV);

谢谢你的例子。问题是,我一直在尝试不同的布局,但由于缺乏对不同管理者的了解,我没有得到多少结果。我将尝试一下,看看会发生什么!使用Swing布局并非易事。我真正建议您做的是使用名为Windows Builder的插件安装eclipse。使用此工具,您可以实时查看正在构建的内容。祝你好运