如何解决SetVisiblefalse更改面板中组件的布局
|| 将子面板之一设置为不可见时,如何使主面板中的子面板保持原样? 我长什么样:[ (Panel1) (Panel2) (Panel3) (Panel4) ]
当我做“ 1”时,它看起来像:
[ (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);
如果需要,我将提供更多代码,并且我不在乎我使用哪种布局,只要它可以让我得到所需的内容即可。
解决方法
我建议在各个单元格中使用“ 6”,而不是将其设置为不可见,而是切换到空白面板。
下面的代码演示了这一点。在
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\");
}
}
}
,我相信所有的布局管理器都尊重组件的可见性,并且在首选的尺寸和布局计算中不包括不可见的组件。
一种解决方案是使用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();
}
}
}
,您也许可以调整GridLayout(您有SSCCE吗?)
除此以外:
将Panel3和Panel4放在一起,添加到GridBagLayout中。然后将新面板设置为FlowLayout(左对齐并具有首选大小),BorderLayout,GridLayout等布局。
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。