java expandable JDialog

对于我的应用程序,我有一个JDialog ,其中包含一个JPanel ,其中包含一些基本的JTextFieldsJButtons 。 这个想法是有一个按钮,它扩展了JDialog以显示第二个包含一些“高级”设置的JPanel

我通过调用setPreferredSize()pack()来实现这一点,但这不是很优雅。 一个“优雅”的解决方案是将第二个Panel设置为某种方式为null,因此当切换状态为“缩回”时,pack()会忽略它。

很抱歉,我无法为您提供代码(那个东西大约有700个谎言),但就像我在JDialog中基本上说两个JPanels一样。

这里有一些照片:

在此处输入图像描述在此处输入图像描述

问题:如果不必为扩展/正常状态设置固定尺寸,是否有一个技巧可以实现这种扩展。

可能有几种方法可以做到这一点,例如,您可以根据需要简单地添加和删除底部面板。 如果可以,我想避免这种情况,因为它可以使管理布局更加困难。

另一种解决方案是简单地使组件可见/不可见,但是你需要找到一个布局管理器,它实际上会处理一个不可见的组件,就像它不存在一样( 0x0 ) – 是的,我把一对测试放在一起时遇到了问题。 ..

翻动

 import java.awt.EventQueue; import java.awt.GridBagConstraints; import java.awt.GridBagLayout; import java.awt.GridLayout; import java.awt.Insets; import java.awt.Window; import java.awt.event.ActionEvent; import java.awt.event.ActionListener; import javax.swing.JButton; import javax.swing.JFrame; import javax.swing.JLabel; import javax.swing.JPanel; import javax.swing.SwingUtilities; import javax.swing.UIManager; import javax.swing.UnsupportedLookAndFeelException; public class FlipDialog { public static void main(String[] args) { new FlipDialog(); } public FlipDialog() { EventQueue.invokeLater(new Runnable() { @Override public void run() { try { UIManager.setLookAndFeel(UIManager.getSystemLookAndFeelClassName()); } catch (ClassNotFoundException | InstantiationException | IllegalAccessException | UnsupportedLookAndFeelException ex) { ex.printStackTrace(); } JFrame frame = new JFrame("Testing"); frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); frame.add(new TestPane()); frame.pack(); frame.setLocationRelativeTo(null); frame.setVisible(true); } }); } public class TestPane extends JPanel { private JButton flip; private JPanel bottom; public TestPane() { setLayout(new GridBagLayout()); GridBagConstraints gbc = new GridBagConstraints(); gbc.insets = new Insets(8, 8, 8, 8); gbc.gridwidth = GridBagConstraints.REMAINDER; JPanel top = new JPanel(); flip = new JButton("+"); top.add(flip); add(top, gbc); bottom = new JPanel(); bottom.add(new JLabel("Boo")); bottom.setVisible(false); add(bottom, gbc); flip.addActionListener(new ActionListener() { @Override public void actionPerformed(ActionEvent e) { bottom.setVisible(!bottom.isVisible()); if (bottom.isVisible()) { flip.setText("-"); } else { flip.setText("+"); } revalidate(); Window window = SwingUtilities.windowForComponent(bottom); window.pack(); } }); } } } 

应该注意的是, revalidate的调用可能无关紧要,因为无论如何你正在打包窗口

更新了布局示例

关闭Opended

 import java.awt.EventQueue; import java.awt.GridBagConstraints; import java.awt.GridBagLayout; import java.awt.GridLayout; import java.awt.Insets; import java.awt.Window; import java.awt.event.ActionEvent; import java.awt.event.ActionListener; import javax.swing.AbstractSpinnerModel; import javax.swing.JButton; import javax.swing.JCheckBox; import javax.swing.JFrame; import javax.swing.JLabel; import javax.swing.JPanel; import javax.swing.JSpinner; import javax.swing.JTextField; import javax.swing.SwingUtilities; import javax.swing.UIManager; import javax.swing.UnsupportedLookAndFeelException; import javax.swing.border.EmptyBorder; import javax.swing.border.TitledBorder; import javax.swing.event.ChangeEvent; import javax.swing.event.ChangeListener; public class Test100 { public static void main(String[] args) { new Test100(); } public Test100() { EventQueue.invokeLater(new Runnable() { @Override public void run() { try { UIManager.setLookAndFeel(UIManager.getSystemLookAndFeelClassName()); } catch (ClassNotFoundException | InstantiationException | IllegalAccessException | UnsupportedLookAndFeelException ex) { ex.printStackTrace(); } JFrame frame = new JFrame("Testing"); frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); frame.add(new SearchPane()); frame.pack(); frame.setLocationRelativeTo(null); frame.setVisible(true); } }); } public class SearchPane extends JPanel { private ObjectsPane objectsPane; private AdvanceSettingsPane advanceSettingsPane; public SearchPane() { setBorder(new EmptyBorder(8, 8, 8, 8)); setLayout(new GridBagLayout()); GridBagConstraints gbc = new GridBagConstraints(); gbc.gridx = 0; gbc.gridy = 0; gbc.weightx = 1; gbc.weighty = 1; gbc.fill = GridBagConstraints.BOTH; objectsPane = new ObjectsPane(); add(objectsPane, gbc); gbc.gridy++; gbc.weighty = 0; advanceSettingsPane = new AdvanceSettingsPane(); advanceSettingsPane.setVisible(false); add(advanceSettingsPane, gbc); objectsPane.addExpandCollapseListener(new ChangeListener() { @Override public void stateChanged(ChangeEvent e) { System.out.println(objectsPane.isExpanded()); advanceSettingsPane.setVisible(objectsPane.isExpanded()); Window window = SwingUtilities.windowForComponent(SearchPane.this); window.pack(); } }); } public class ObjectsPane extends JPanel { private JSpinner findField; private JTextField replaceField; private JButton expandButton; private JButton replaceButton; private JButton replaceAllButton; private boolean expanded = false; public ObjectsPane() { setLayout(new GridBagLayout()); findField = new JSpinner(new AbstractSpinnerModel() { @Override public Object getValue() { return ""; } @Override public void setValue(Object value) { } @Override public Object getNextValue() { return ""; } @Override public Object getPreviousValue() { return ""; } }); replaceField = new JTextField(10); replaceButton = new JButton("Replace"); replaceAllButton = new JButton("Replace All"); expandButton = new JButton("+"); GridBagConstraints gbc = new GridBagConstraints(); gbc.insets = new Insets(4, 4, 4, 4); gbc.gridx = 0; gbc.gridy = 0; gbc.gridwidth = GridBagConstraints.REMAINDER; gbc.weightx = 1; gbc.anchor = GridBagConstraints.WEST; add(new JLabel("Objects found:"), gbc); gbc.gridx = 0; gbc.gridy = 1; gbc.gridwidth = 1; gbc.weightx = 0; add(new JLabel("Find:"), gbc); gbc.gridy = 2; add(new JLabel("Replace:"), gbc); gbc.gridx = 1; gbc.gridy = 1; gbc.weightx = 1; gbc.fill = GridBagConstraints.HORIZONTAL; gbc.gridwidth = GridBagConstraints.REMAINDER; add(findField, gbc); gbc.gridy = 2; add(replaceField, gbc); gbc.anchor = GridBagConstraints.WEST; gbc.gridwidth = 1; gbc.weightx = 0; gbc.gridx = 0; gbc.gridy = 3; gbc.fill = GridBagConstraints.NONE; add(expandButton, gbc); JPanel pnlButtons = new JPanel(new GridLayout(1, 2)); pnlButtons.add(replaceButton); pnlButtons.add(replaceAllButton); gbc.gridx = 1; gbc.gridy = 3; gbc.fill = GridBagConstraints.HORIZONTAL; gbc.weightx = 1; gbc.gridwidth = GridBagConstraints.REMAINDER; add(pnlButtons, gbc); expandButton.addActionListener(new ActionListener() { @Override public void actionPerformed(ActionEvent e) { expanded = !expanded; if (expanded) { expandButton.setText("-"); } else { expandButton.setText("+"); } fireStateChanged(); } }); } public boolean isExpanded() { return expanded; } public void addExpandCollapseListener(ChangeListener listener) { listenerList.add(ChangeListener.class, listener); } public void removeExpandCollapseListener(ChangeListener listener) { listenerList.remove(ChangeListener.class, listener); } protected void fireStateChanged() { ChangeListener[] listeners = listenerList.getListeners(ChangeListener.class); if (listeners.length > 0) { ChangeEvent evt = new ChangeEvent(this); for (ChangeListener listener : listeners) { listener.stateChanged(evt); } } } } public class AdvanceSettingsPane extends JPanel { public AdvanceSettingsPane() { setBorder(new TitledBorder("Advance Settings")); setLayout(new GridBagLayout()); GridBagConstraints gbc = new GridBagConstraints(); gbc.gridx = 0; // gbc.gridy = 0; gbc.weightx = 1; gbc.anchor = GridBagConstraints.WEST; gbc.gridwidth = GridBagConstraints.REMAINDER; add(new JCheckBox("Live Update"), gbc); add(new JCheckBox("Word search"), gbc); add(new JCheckBox("Ignore Case"), gbc); } } } }