【问题标题】:GridBagLayout anchorGridBagLayout 锚点
【发布时间】:2014-09-26 17:28:24
【问题描述】:

我正在尝试使用 Anchor 来设置组件的对齐方式。 这是我的代码:

public void intiConOpt()
{
    /*********************************** connection options ****************************************/
    
    conOptGBC.insets = new Insets(5, 5, 5, 5);
    conOptGBC.weightx = 1.0;
    conOptGBC.weighty = 1.0;
    conOptGBC.anchor = GridBagConstraints.NORTHWEST;
    conOpt = new JPanel();
    conOpt.setLayout(new GridBagLayout());
    
    //////////////////////////////////////////cycle time////////////////////////////////////////////
    
    readPeriodLabel = new JLabel("Node read cycle time:");
    conOptGBC.gridx = 0;
    conOptGBC.gridy = 0;
    conOpt.add(readPeriodLabel, conOptGBC);
    
    readPeriodNumberModel = new SpinnerNumberModel();
    readPeriodSpinner = new JSpinner(readPeriodNumberModel);
    JSpinner.NumberEditor readPeriodEditor = new JSpinner.NumberEditor(readPeriodSpinner,"###");
    readPeriodSpinner.setEditor(readPeriodEditor);
    readPeriodNumberModel.setValue(TopologyMain.settings.getSettingsList().get("nodeReadingCycleTime"));

    readPeriodSpinner.setPreferredSize(new Dimension(40, 20));
    conOptGBC.gridx = 1;
    conOptGBC.gridy = 0;
    conOpt.add(readPeriodSpinner, conOptGBC);
    
    readPeriodLabel2 = new JLabel("<html><font size=2>(4-180 sec)</font></html>");
    conOptGBC.gridx = 2;
    conOptGBC.gridy = 0;
    conOpt.add(readPeriodLabel2, conOptGBC);
    
    ///////////////////////////////////////////time out////////////////////////////////////////////
    
    cliTimeoutLabel = new JLabel("CLI response timeout:");
    conOptGBC.gridx = 0;
    conOptGBC.gridy = 1;
    conOpt.add(cliTimeoutLabel, conOptGBC);
    
    cliTimeoutNumberModel = new SpinnerNumberModel();
    cliTimeoutSpinner = new JSpinner(cliTimeoutNumberModel);
    JSpinner.NumberEditor cliTimeoutEditor = new JSpinner.NumberEditor(cliTimeoutSpinner,"###");
    cliTimeoutSpinner.setEditor(cliTimeoutEditor);
    cliTimeoutNumberModel.setValue(TopologyMain.settings.getSettingsList().get("cliTimeout") /10);

    cliTimeoutSpinner.setPreferredSize(new Dimension(40, 20));
    conOptGBC.gridx = 1;
    conOptGBC.gridy = 1;
    conOpt.add(cliTimeoutSpinner, conOptGBC);
    
    cliTimeoutLabel2 = new JLabel("<html><font size=2>(8-999 sec)</font></html>");
    conOptGBC.gridx = 2;
    conOptGBC.gridy = 1;
    conOpt.add(cliTimeoutLabel2, conOptGBC);
    
    ///////////////////////////////////////busy response//////////////////////////////////////////////
            
    cliBusySleepLabel = new JLabel("CLI busy check time:");
    conOptGBC.gridx = 0;
    conOptGBC.gridy = 2;
    conOpt.add(cliBusySleepLabel, conOptGBC);
    
    cliBusySleepNumberModel = new SpinnerNumberModel();
    cliBusySleepSpinner = new JSpinner(cliBusySleepNumberModel);
    JSpinner.NumberEditor cliBusySleepEditor = new JSpinner.NumberEditor(cliBusySleepSpinner,"###");
    cliBusySleepSpinner.setEditor(cliBusySleepEditor);
    cliBusySleepNumberModel.setValue(TopologyMain.settings.getSettingsList().get("cliBusySleep") /1000);
    
    cliBusySleepSpinner.setPreferredSize(new Dimension(40, 20));
    conOptGBC.gridx = 1;
    conOptGBC.gridy = 2;
    conOpt.add(cliBusySleepSpinner, conOptGBC);
    
    cliBusySleepLabel2 = new JLabel("<html><font size=2>(1-999 sec)</font></html>");
    conOptGBC.gridx = 2;
    conOptGBC.gridy = 2;
    conOpt.add(cliBusySleepLabel2, conOptGBC);
    conOpt.setVisible(false);
    contentPanel.add(conOpt);
}

我的问题是 GridBagConstraints 锚点无效,我的组件仍在面板中心。

【问题讨论】:

  • 您要么误解了视觉结果,要么正在查看依赖于我们无法从您的代码片段中推断出的外部组件状态的东西。你能发布一个截图(连同你没想到的部分的文字描述吗?
  • 我已经编辑了帖子并添加了截图链接。
  • 我能看到的红色和蓝色版本之间的唯一区别可能是包含组件的容器上的EmptyBorder
  • 它看起来更像是带有GridBagLayout 的容器没有您期望的大小。重要的是与父母的关系。您可以为conOptGBC 添加可见边框以进行验证。或者只需在窗口内按 CTRL+SHIFT+F1 并检查文本输出的大小。
  • 确实,这就是问题所在。谢谢!

标签: java swing jpanel layout-manager gridbaglayout


【解决方案1】:

anchor 属性工作正常,您遇到的问题是...

conOptGBC.weightx = 1.0;
conOptGBC.weighty = 1.0;

问题是,您已要求 GridBagLayout 为每列分配相同数量的空间,因此它们将占用,在这种情况下,它们是每个列的第三个,这就是要考虑的问题。

通过删除 conOptGBC.weightx = 1.0; 你得到...

有点难看,但如果我们在...中添加一些指南...

您可以看到这些字段开始向西北对齐...

【讨论】:

  • 我明白了,谢谢。所以文本在它的单元格内与西北对齐,但我怎样才能将单元格与我的 JPanel 内的西北对齐?
  • 您可以将weightx 设置为1 最后一列中的一个组件,我将weighty 设置为1 最后一行中的一个组件。 .或者您可以在最后一行/col + 1 中添加一个“不可见”组件,并将weightxweighty 分配给该组件的1
猜你喜欢
  • 2011-06-17
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-07-13
  • 2020-10-27
  • 1970-01-01
  • 1970-01-01
  • 2012-09-18
相关资源
最近更新 更多