【发布时间】:2014-11-11 18:29:10
【问题描述】:
如果我设置了一个带有一些组件和一个布局管理器的 JFrame,它最初看起来非常好,然后由于某些条件(例如,单击一个按钮)我隐藏了其中一个组件 - 布局管理器将所有组件又来了。
查看示例代码 - 最初出现 3 个按钮。当您单击“隐藏”按钮时,“隐藏”按钮会被隐藏 - 但两个外部按钮会挤在一起。当您单击显示按钮时,它们会再次分开以腾出空间。我怎样才能阻止这种情况的发生,以便在我调用 pack() 之后,组件保持在原来的位置,无论它们后来是否被隐藏?
在我的真实代码中,我使用 GridBagLayout 执行此操作,但在下面的示例中使用了 FlowLayout,因为它的代码更简单、更少,并且表现出完全相同的行为。
我只能想到一些讨厌的方法,比如使用 .setEnabled (false) 而不是 .setVisible (false),然后重写组件的 paintComponent() 方法以在组件被禁用时不绘制组件。
这似乎与这里完全相反的问题 - Hide a button from Layout in Java Swing - 抱怨隐藏按钮 do 仍然占用空间:) 但是那里没有示例代码显示它以这种方式工作。
非常感谢您的任何建议:)
例子:
import java.awt.FlowLayout;
import java.awt.event.ActionEvent;
import javax.swing.AbstractAction;
import javax.swing.Action;
import javax.swing.JButton;
import javax.swing.JFrame;
import javax.swing.JPanel;
import javax.swing.SwingUtilities;
public class RevalidateWhenSetChildInvisibleExample
{
private JButton button1;
private JButton button2;
private JButton button3;
public void run ()
{
// Set up action
Action hideButtonAction = new AbstractAction ()
{
@Override
public void actionPerformed (ActionEvent e)
{
button2.setVisible (false);
}
};
hideButtonAction.putValue (Action.NAME, "Hide");
Action showButtonAction = new AbstractAction ()
{
@Override
public void actionPerformed (ActionEvent e)
{
button2.setVisible (true);
}
};
showButtonAction.putValue (Action.NAME, "Show");
// Set up buttons
button1 = new JButton ("Dummy");
button2 = new JButton (hideButtonAction);
button3 = new JButton (showButtonAction);
// Set up content pane
JPanel contentPane = new JPanel ();
contentPane.setLayout (new FlowLayout ());
contentPane.add (button1);
contentPane.add (button2);
contentPane.add (button3);
// Set up frame
JFrame frame = new JFrame ();
frame.setContentPane (contentPane);
frame.pack ();
frame.setVisible (true);
}
public static void main (String args [])
{
SwingUtilities.invokeLater (new Runnable ()
{
public void run ()
{
new RevalidateWhenSetChildInvisibleExample ().run ();
}
});
}
}
【问题讨论】:
标签: java swing layout hide invisible