[英]Java Gui, gap between elements after hiding some of them
我正在使用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行之间仍然存在较大的空隙。
希望我的问题是可以理解的:-)
有什么办法可以解决此问题?
提前致谢。
斯特芬
尝试从jpanel中删除该元素而不是隐藏,但是请记住,这对于某些布局仍然无效。 这取决于您的布局以及如何处理组件的添加和删除。
为了避免任何误解:
如果TopLayoutContainer一旦可见,则:
1 /需要添加新的JComponent来调用revalidate()
,对于以编程方式设置的复合JComponents fe,也需要使用repaint()
来调用JComboBox中的Item
2 /删除JCmponent之后,您必须调用revalidate()
和repaint()
3 /例如删除JComponents->添加新的JComponents-> revalidate()
加repaint()
@Steffen Kuehn有很多可能的问题,最好是发送能说明您所描述问题的代码
@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);
}
});
}
}
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.