1

我正在使用 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 行之间存在更大的间隙。

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

有没有办法解决这种行为?

提前致谢。

史蒂芬

4

3 回答 3

1

@Steffen Kuehn 请查看以下代码,该代码显示您遇到的“可能”问题。即您没有重新验证和重新绘制已更改的面板。

请注意,当您使用鼠标左键单击面板时,没有重新绘制/重新验证,起初似乎什么也没有发生。尝试调整框架的大小。它调用操作,您将看到元素 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);
            }
        });
    }
}
于 2011-05-20T11:23:40.147 回答
1

为了避免任何误解:

如果TopLayoutContainer一次可见,则:

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

2/ 删除 JCmponent(s) 后,您必须调用revalidate()plusrepaint()

3/ 例如删除 JComponents -> 添加新的 JComponents -> revalidate()plusrepaint()

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

于 2011-05-19T09:54:49.707 回答
1

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

于 2011-05-19T08:49:24.793 回答