JDialog在最大化时不进行重新布局

时间:2012-05-17 22:05:15

标签: java swing layout-manager jdialog maximize

我似乎与其他人有相反的问题。 我的JDialog默认情况下最小化和最大化按钮。 按下最大化按钮时,对话框最大化 - 但内容不会。它只是保持相同的大小,以一个巨大的对话框为中心。 当您抓住边缘并重新调整对话框大小时也会发生相同的情况。

我尝试添加一个WindowStateListener - 但它永远不会被调用。 我添加了一个WindowListener - 它只在Open / Close / Activate / Deactivate上调用。

因此,我需要能够通过对话框获取对话框内容以重新调整大小,或者删除最大化按钮。 (我想摆脱最小化按钮。)

我在创建对话框后做了一个pack(),因为对话框中的控件是从一个数据块动态创建的,所以我没有初始大小可以使用。

好的,所以这是代码。所有生成的UI面板也都在GridBagLayouts中。

public class FastAccessDialog extends JDialog implements BeanActionListener {

private static final long   serialVersionUID = 1L;
private static final Cursor waitCursor       = new Cursor(Cursor.WAIT_CURSOR);

private Cursor              oldCursor;
private JPanel              cmdOutput;
private JScrollPane         cmdOutputScroll;

public FastAccessDialog(Frame owner, ObjectName bean, String methodName) throws InstanceNotFoundException, IntrospectionException,
        ReflectionException, IOException {
    super(owner);
    setResizable(true);
    setModal(false);
    setTitle(BeanUtil.cleanUpCamelCase(methodName));

    boolean enabled = (UIHintUtil.isEnabled(bean) == EnableState.ENABLED);

    // Find the BeanOperationInfo for that method.
    MBeanInfo info = JMXConnectionSingleton.getInstance().getMBeanInfo(bean);
    MBeanOperationInfo[] operations = info.getOperations();
    JComponent comp = null;

    for (MBeanOperationInfo opInfo : operations) {
        if (opInfo.getName().equals(methodName)) {
            comp = OperationsManager.getInstance().createControls(bean, opInfo, this, true, enabled);
            break;
        }
    }

    if (comp == null) {
        throw new IllegalArgumentException("Unknown method name: " + methodName);
    }

    Container cont = getContentPane();
    cont.setLayout(new GridBagLayout());
    GridBagConstraints gbc = new GridBagConstraints();
    gbc.anchor = GridBagConstraints.WEST;
    gbc.gridx = 0;
    gbc.gridy = 0;
    gbc.fill = GridBagConstraints.HORIZONTAL;
    gbc.insets = new Insets(4, 4, 4, 4);
    cont.add(comp, gbc);
    cont.validate();

    SwingUtilities.invokeLater(new Runnable() {
        @Override
        public void run() {
            pack();
        }
    });
    return;
}

... other methods invoked when an operation is performed ...
... none of which are invoked before having the re-size problem ...
}

1 个答案:

答案 0 :(得分:2)

  1. JPanel.(re)validate();

  2. JPanel.repaint();

  3. JDialog.pack();

  4. SwingUtilities.invokeLater(new Runnable() {
        @Override
        public void run() {
            JDialog.setVisible(true);
        }
    });
    
  5. 不扩展Top-Level Containers

  6. 请勿ContentPane使用Java5

  7. JDialog.pack();JDialog.setVisible(true)的案例中没有其他内容;是void,方法或构造函数中返回JDialog实例的最后一行代码行