【问题标题】:How to automatically organize and resize a JFrame according to content in Java swing application如何在 Java swing 应用程序中根据内容自动组织和调整 JFrame 大小
【发布时间】:2012-09-25 03:37:38
【问题描述】:

我正计划创建一个要求用户在多个字段中输入数据的应用程序,但是某些字段可能并不总是被使用。我将为其开发此程序的人希望每次都能选择他要使用的字段。我想到了以下内容(但我不确定该怎么做):

首先,显示所有可用字段的列表以及用于选择每个字段的复选框。然后,准备好所有字段的 JFrame,并根据用户的选择,布置表单以抑制未使用的字段并消除可能出现的任何间隙。 (我考虑过对框架的组件使用 setvisible() ,然后找到一种方法来消除它们之间的间隙,这些间隙在隐藏不需要的元素时会出现)。但我认为这不是最有效的方法。无需说框架应该看起来井井有条且美观。我愿意接受建议,并提前感谢您。

如果有什么不同,我将为此使用 netbeans 设计模式。

【问题讨论】:

    标签: java swing netbeans


    【解决方案1】:

    http://docs.oracle.com/javase/6/docs/api/java/awt/Window.html#pack()

    JFrame 有一个 pack() 方法可以调整窗口大小以适应其内容。

    【讨论】:

      【解决方案2】:

      与布局要求一样,任务是找到合适的 LayoutManager,然后让它完成工作:即根据组件的可见性确定如何分配可用空间。这样,您的工作就归结为切换可见性并向后倾斜。

      大多数核心管理器只是忽略隐藏的组件(可能是也可能不是您想要的)。高级管理器可以进行全方位配置——从以与可见组件完全相同的方式处理到忽略。菲MigLayout(我个人目前最喜欢的),具有 4 个级别的隐藏模式(相同方式,将组件大小设置为 0,0,将组件大小设置为 0,0,周围的所有间隙都为零,完全忽略)

      下面是一个简单的示例:尝试隐藏模式的不同排列,将文本字段的标签与文本字段一起隐藏以查看不同的行为。

      // hidemode 3 == ignore in layout
      // hidemode 2 == zero size and zero gaps
      // hidemode 1 == zero size
      // hidemode 0 == same as visible
      MigLayout layout = new MigLayout("wrap 2, hidemode 3");
      JComponent content = new JPanel(layout);
      JPopupMenu popup = new JPopupMenu();
      for (int i = 0; i < 5; i++) {
          JTextField field = new JTextField("field " + i, 20);
          field.setName(field.getText());
          JLabel label = new JLabel("Label " + i);
          label.setLabelFor(field);
          content.add(label);
          content.add(field);
          popup.add(new JCheckBoxMenuItem(new ToggleVisibilityAction(field, true)));
      }
      content.setComponentPopupMenu(popup);
      
      // action to toggle the visibility of a target component
      // optionally w/out its label
      public static class ToggleVisibilityAction extends AbstractAction {
      
          private JComponent target;
          private boolean hideLabel;
      
          public ToggleVisibilityAction(JComponent comp, boolean hideLabel) {
              super(comp.getName());
              this.target = comp;
              this.hideLabel = hideLabel;
              putValue(SELECTED_KEY, target.isVisible());
          }
          @Override
          public void actionPerformed(ActionEvent e) {
              boolean visible = (boolean) getValue(SELECTED_KEY);
              target.setVisible(visible);
              if (hideLabel && target.getClientProperty("labeledBy") instanceof JComponent) {
                  ((Component) target.getClientProperty("labeledBy")).setVisible(visible);
              }
              target.getParent().revalidate();
          }
      
      }
      

      【讨论】:

      • 这真的很有趣,我不知道它存在......我会看看。感谢您的帮助。
      猜你喜欢
      • 1970-01-01
      • 2020-08-23
      • 2020-10-20
      • 1970-01-01
      • 1970-01-01
      • 2022-11-10
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多