Java Gui,隐藏部分元素后元素之间的间隙
我正在使用Netbeans(7.0)用java开发一个GUI 我有一个JFrame,包括一个JPanel和这个面板中的几个元素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
我认为布局类型是自由布局 草案:
-------------------
|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()
plusrepaint()
3/例如,删除JComponents->添加新JComponents->revalidate()
plusrepaint()
@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