Java BorderLayout-添加另一个组件后,子组件仍然可见
我试着做以下事情:Java BorderLayout-添加另一个组件后,子组件仍然可见,java,swing,jframe,layout-manager,border-layout,Java,Swing,Jframe,Layout Manager,Border Layout,我试着做以下事情: 使用边框布局将组件添加到JFrame 将另一个组件添加到JFrame 我希望新组件“覆盖”旧组件,因为我使用的是BorderLayout。如果我在调用pack()之前覆盖了旧组件,则此操作有效。现在,如果在调用pack()之后添加第二个组件,两个组件都将保持可见。例如: public class Test extends JFrame{ public Test(){ setLayout(new BorderLayout()); add(
边框布局将组件添加到JFrame
JFrame
BorderLayout
。如果我在调用pack()
之前覆盖了旧组件,则此操作有效。现在,如果在调用pack()
之后添加第二个组件,两个组件都将保持可见。例如:
public class Test extends JFrame{
public Test(){
setLayout(new BorderLayout());
add(new JLabel("Quite a long text"));
setVisible(true);
pack();
add(new JLabel("Another text"));
}
}
结果:
public class Test extends JFrame{
public Test(){
setLayout(new BorderLayout());
add(new JLabel("Quite a long text"));
setVisible(true);
add(new JLabel("Another text"));
pack();
}
}
结果:
public class Test extends JFrame{
public Test(){
setLayout(new BorderLayout());
add(new JLabel("Quite a long text"));
setVisible(true);
add(new JLabel("Another text"));
pack();
}
}
我尝试添加
validate()代码>和重新绘制()代码>,但那没用。这里怎么了 在调用setViisble()之后,您正在调用影响UI的内容——Swing no-no。将影响UI的内容放入invokeLater调用中;查一查
当你这么做的时候,我想你还是应该从添加组件的框架中获取内容窗格。。。我不认为在构造函数中创建东西是个好主意
import java.awt.BorderLayout;
import javax.swing.JFrame;
import javax.swing.JLabel;
import javax.swing.SwingUtilities;
public class SwingTest extends JFrame
{
public void createUI()
{
setDefaultCloseOperation(DISPOSE_ON_CLOSE);
SwingUtilities.invokeLater(
new Runnable()
{
public void run()
{
getContentPane().setLayout(new BorderLayout());
getContentPane().add(new JLabel("Quite a long text"), BorderLayout.CENTER);
getContentPane().add(new JLabel("Another text"), BorderLayout.CENTER);
pack();
setVisible(true);
}
}
);
}
public static void main(String ... args)
{
SwingTest st = new SwingTest();
st.createUI();
}
}
您可以尝试getComponents()[0]=newjlabel(“另一个文本”)
JFrame
s,frame.getContentPane().add
相当于frame.add()
是的,事实证明,您可以从上面删除getContentPane()。没有必要在内容窗格上设置borderLayout,这是它的默认设置…好吧,早在我高中的时候,我们对所有lol都使用空布局。从那以后,它就永远让我瘫痪了。@rcook谢谢你的反馈。在构造函数中执行所有操作只是为了示例:)但是,在我的示例中,我需要在setVisible()之后添加内容。我现在唯一能让它工作的方法是,在添加新组件之前,手动从布局中删除中心组件:BorderLayout l=new BorderLayout()。。。getContentPane().remove(l.getLayoutComponent(BorderLayout.CENTER));