我似乎与其他人有相反的问题。 我的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 ...
}
答案 0 :(得分:2)
JPanel.(re)validate();
JPanel.repaint();
JDialog.pack();
SwingUtilities.invokeLater(new Runnable() {
@Override
public void run() {
JDialog.setVisible(true);
}
});
不扩展Top-Level Containers
请勿ContentPane
使用Java5
JDialog.pack();
和JDialog.setVisible(true)
的案例中没有其他内容;是void,方法或构造函数中返回JDialog实例的最后一行代码行