Java Gui,隐藏部分元素后元素之间的间隙

Java Gui,隐藏部分元素后元素之间的间隙,java,swing,layout,netbeans,gaps-in-visuals,Java,Swing,Layout,Netbeans,Gaps In Visuals,我正在使用Netbeans(7.0)用java开发一个GUI 我有一个JFrame,包括一个JPanel和这个面板中的几个元素 我认为布局类型是自由布局 草案: ------------------- |JFrame | | | | --------------- | | |JPanel | | | | | | | | elem1 elem2 | | | | elem3 elem4 | | | | elem5

我正在使用Netbeans(7.0)用java开发一个GUI

我有一个JFrame,包括一个JPanel和这个面板中的几个元素


我认为布局类型是自由布局

草案:

-------------------
|JFrame           |
|                 |
| --------------- |
| |JPanel       | |
| |             | |
| | elem1 elem2 | |
| | elem3 elem4 | |
| | elem5 elem6 | |
| |             | |
| |-------------- |
|                 |
-------------------
在我的程序运行期间,我使用setVisible(false)隐藏了一行中的一些元素(例如elem3和elem4)

除间隙外,所有内容都按预期调整大小(JFrame和JPanel)。 看起来元素被正确地隐藏了,但仍然存在间隙,因此在我隐藏elem3和elem4的示例中,行elem1/elem2和elem5/6之间的间隙仍然较大

希望我的问题是可以理解的:-)

有没有办法修复这种行为

提前谢谢


Steffen

尝试从jpanel中删除该元素,而不是隐藏,但请记住,这对某些布局仍然不起作用。如何处理组件的添加和删除取决于您的布局。

为了避免任何遗漏解释:

如果一次可见,则:

1/对于添加新的JComponent,需要调用
revalidate()
,对于复合JComponents,也需要调用
repaint()
以编程方式设置JComboBox中的项目

2/删除JCComponent后,必须调用
revalidate()
plus
repaint()

3/例如,删除JComponents->添加新JComponents->
revalidate()
plus
repaint()


@Steffen Kuehn有很多可能的问题,最好发送代码说明您所描述的问题

@Steffen Kuehn请查看下面的代码,其中显示了您遇到的“可能”问题。i、 e.您没有重新验证和重新喷涂已更改的面板

请注意,当您使用鼠标左键单击面板时,没有重新绘制/重新验证,起初似乎什么也没有发生。尝试调整框架的大小。它调用操作,您将看到元素5和6实际上是可见的。因此,如果您希望更改是即时的,请使用右键单击进行可见性更改和验证

    import java.awt.Color;
    import java.awt.event.MouseAdapter;
    import java.awt.event.MouseEvent;
    import javax.swing.JComponent;
    import javax.swing.JFrame;
    import javax.swing.JPanel;
    import javax.swing.JTextField;
    import javax.swing.SwingUtilities;

    public class FlowComponentsTest
    {
        public static void main(String[] args)
        {
            SwingUtilities.invokeLater(new Runnable()
            {
                @Override
                public void run()
                {
                    final JPanel p = new JPanel();
                    for(int i = 1; i <= 20; i++)
                    {
                        JComponent c = new JTextField("I am element no. " + i);
                        //so any textfield will not steal the focus from the panel p
                        c.setFocusable(false);
                        p.add(c);
                        if(i == 5 || i == 6)
                        {
                            c.setForeground(Color.GREEN);
                            c.setVisible(false);
                        }
                    }
                    JFrame f = new JFrame();
                    f.addMouseListener(new MouseAdapter()
                    {
                        @Override
                        public void mousePressed(MouseEvent e)
                        {
                            JComponent c5 = (JComponent) p.getComponent(4);
                            JComponent c6 = (JComponent) p.getComponent(5);
                            c5.setVisible(!c5.isVisible());
                            c6.setVisible(!c6.isVisible());

                        if(e.getButton() == MouseEvent.BUTTON3)
                        {
                            System.out.println("Right click");
                            p.revalidate();
                            p.repaint();
                        }
                    }
                });
                f.setContentPane(p);
                f.setSize(300, 330);
                f.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
                f.setVisible(true);
            }
        });
    }
}
导入java.awt.Color;
导入java.awt.event.MouseAdapter;
导入java.awt.event.MouseEvent;
导入javax.swing.JComponent;
导入javax.swing.JFrame;
导入javax.swing.JPanel;
导入javax.swing.JTextField;
导入javax.swing.SwingUtilities;
公共类流组件测试
{
公共静态void main(字符串[]args)
{
SwingUtilities.invokeLater(新的Runnable()
{
@凌驾
公开募捐
{
最终JPanel p=新JPanel();

对于(int i=1;i如果我删除元素,我将无法再次添加它们…我尝试了验证、重新验证、在再次添加元素后重新绘制,但它们不会出现…@Steffen:应该可以。对于您称之为验证/重新绘制的内容?首先,我将使用jPanel1.remove(elemX)删除所有元素->有效,稍后我尝试使用jPanel1只添加必要的内容。添加(elemX)->面板中没有显示任何内容。@Steffen:在为jpanel添加元素和容纳jpanel的框架后,尝试调用
validate();repaint();
。为了更快地获得更好的帮助,请发布一条消息。“我认为布局类型是自由布局。”你认为呢?找出“你的”代码实际上做了什么是调试这个的首要步骤之一。+1@mKorbel@Harry Joy回答得很好。最有帮助的是至少知道使用的布局管理器。也许免费布局OP意味着FlowLayout,默认安装在JPanel上的布局?为什么复杂简单思考+1