当我将其中一个子面板设置为不可见时,如何使主面板中的子面板保持原样?
我的样子:
[ (Panel1) (Panel2) (Panel3) (Panel4) ]
当我panel3.setVisible(false)
时,它看起来像:
[ (Panel1) (Panel2) (Panel4) ]
我希望它看起来像:
[ (Panel1) (Panel2) (Panel4) ]
我正在使用GridBagLayout,我的mainPanel声明如下:
final JPanel panel = new JPanel(new GridBagLayout());
GridBagConstraints c = new GridBagConstraints();
我添加了一个新的面板,如:
final JTextField valueTextField = new JTextField();
valueTextField.setPreferredSize(new Dimension(80, 25));
valueTextField.setName("Value");
c.gridx =0;
panel.add(valueTextField, c);
如果需要,我会提供更多代码,我不关心我使用哪种布局,只要它能得到我想要的东西。
答案 0 :(得分:7)
我建议在单个单元格中使用CardLayout
,而不是将其设置为不可见,而是切换到空面板。
下面的代码演示了这一点。在hidePanel()
内,有两个选项可隐藏当前已启用CardLayout
路由的单元格。
import javax.swing.*;
import java.awt.*;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
public class InvisiblePanels {
public static void main(String... args) throws Exception {
JFrame frame = new JFrame();
frame.setLayout(new GridBagLayout());
frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
GridBagConstraints c = new GridBagConstraints();
c.gridx = 0;
frame.add(new MyPanel(), c);
c.gridx = 1;
frame.add(new MyPanel(), c);
c.gridx = 2;
frame.add(new MyPanel(), c);
frame.pack();
frame.setVisible(true);
}
private static class MyPanel extends JPanel {
CardLayout layout;
public MyPanel() {
layout = new CardLayout();
setLayout(layout);
JButton button = new JButton("Click me");
button.addActionListener(new ActionListener() {
public void actionPerformed(ActionEvent e) {
hidePanel();
}
});
add(button, "visible");
add(new JPanel(), "invisible");
layout.show(this, "visible");
}
public void hidePanel() {
// setVisible(false);
layout.show(this, "invisible");
}
}
}
答案 1 :(得分:4)
我相信所有布局管理器都尊重组件的可见性,并且在首选大小和布局计算中不包含不可见组件。
一种解决方案可能是使用OverlayLayout将所有面板包裹在面板中:
import java.awt.*;
import java.awt.event.*;
import javax.swing.*;
public class OverlayLayoutInvisible
{
public static void main(String[] args)
{
JPanel panel = new JPanel();
panel.add( createPanel("Button 1") );
panel.add( createPanel("Button 2") );
panel.add( createPanel("Button 3") );
panel.add( createPanel("Button 4") );
panel.add( createPanel("Button 5") );
JFrame frame = new JFrame();
frame.setDefaultCloseOperation( JFrame.EXIT_ON_CLOSE );
frame.add( panel );
frame.pack();
frame.setLocationRelativeTo( null );
frame.setVisible(true);
}
public static JPanel createPanel(String text)
{
JButton button = new JButton( text );
button.addActionListener( new ActionListener()
{
public void actionPerformed(ActionEvent e)
{
Component c = (Component)e.getSource();
c.setVisible(false);
}
});
InvisibleComponent ic = new InvisibleComponent( button );
JPanel panel = new JPanel();
panel.setLayout( new OverlayLayout(panel) );
panel.add( ic );
panel.add( button );
return panel;
}
public static class InvisibleComponent extends JComponent
{
private Component master;
public InvisibleComponent(Component master)
{
this.master = master;
setAlignmentX( master.getAlignmentX() );
setAlignmentY( master.getAlignmentY() );
}
public Dimension getPreferredSize()
{
return master.getPreferredSize();
}
}
}
答案 2 :(得分:2)
您可以调整GridLayout(你有SSCCE吗?)
否则:
将Panel3和Panel4放在一起添加到GridBagLayout的面板中。然后在一个布局中设置新面板,如FlowLayout(左对齐首选大小),BorderLayout,GridLayout等。