Java 获取JInternalFrame以显示的问题

Java 获取JInternalFrame以显示的问题,java,swing,jframe,jinternalframe,jdesktoppane,Java,Swing,Jframe,Jinternalframe,Jdesktoppane,所以,在这一点上,我有一个简单的JFrame,里面有一个简单的JPanel。(也就是说,它是contentPane是JPanel)JFrame中有一个菜单栏,带有一个按钮,可将当前的JFrame转换为JInternalFrame——它将JFrame的contentPane设置为预先存在的JDesktopPane,并将JFrame中的JPanel>移动到新创建的JInternalFrame-并创建第二个JInternalFrame,其中包含一个新的JPanel。这是我的密码: if(ae.getA

所以,在这一点上,我有一个简单的
JFrame
,里面有一个简单的
JPanel
。(也就是说,它是
contentPane
JPanel
JFrame
中有一个菜单栏,带有一个按钮,可将当前的
JFrame
转换为
JInternalFrame
——它将
JFrame
contentPane
设置为预先存在的
JDesktopPane
,并将
JFrame
中的
JPanel>移动到新创建的
JInternalFrame
-并创建第二个
JInternalFrame
,其中包含一个新的
JPanel
。这是我的密码:

if(ae.getActionCommand().equals("newWindow"))
{
    if(jdp.getComponentCount() > 0)//jdp is the pre-existing JDesktopPane
    {
        //All of the code in this if statement works fine. It's the else in which I am getting problems.
        DefaultInternalFrame dif = new DefaultInternalFrame();//DefaultInternalFrame is an extension of JInternalFrame which is literally nothing more than a JInternalFrame right now.
        jdp.add(dif);
        dif.setContentPane(new DefaultPanel());//Much like DefaultInternalFrame, DefaultPanel is just an extension of JPanel which I plan on adding to, but have not yet.
        dif.setVisible(true);
        dif.moveToFront();
    }else
    {
        //Again, this is where I'm having issues..
        DefaultPanel dp = (DefaultPanel)baseFrame.getContentPane();
        jdp.setVisible(true);
        baseFrame.setContentPane(jdp);
        DefaultInternalFrame dif = new DefaultInternalFrame();
        jdp.add(dif);
        dif.setContentPane(dp);
        dif.setVisible(true);
        dif.moveToFront();

        DefaultInternalFrame dif2 = new DefaultInternalFrame();
        jdp.add(dif2);
        dif2.setContentPane(new DefaultPanel());
        dif2.setVisible(true);
        dif2.moveToFront();
    }
    arrangeHorizontally();//This takes care of resizing and relocating the JInternalFrames. (It is definitely not the problem.)
}
我遇到的问题是,
JDesktopPane
的优先级似乎越来越高。也就是说,在这个代码执行之后,我没有看到两个
jinternalframe
,而是看到了
JDesktopPane
。这并不是因为
JInternalFrame
的大小或位置问题。我已经广泛地检查过了(通过在
水平排列()
方法之后打印大小和位置),所以我不知所措。有什么帮助吗

SSCCE:

private static JFrame f;
private static JDesktopPane desktop;
public static void main(String[] args) throws InterruptedException
{
    desktop = new JDesktopPane();

    f = new JFrame("Test");
    f.setPreferredSize(new Dimension(500,500));
    f.setContentPane(new JPanel());

    f.pack();
    f.setVisible(true);

    Thread.sleep(4000); //Just so you can see the before/after

    JPanel panel = (JPanel)f.getContentPane();

    desktop.setVisible(true);
    f.setContentPane(desktop);

    JInternalFrame inFrame = new JInternalFrame("1");
    desktop.add(inFrame);
    inFrame.setContentPane(panel);
    inFrame.setPreferredSize(new Dimension(200,200));//Just some random size; doesn't matter.
    inFrame.pack();
    inFrame.setVisible(true);

    JInternalFrame inFrame2 = new JInternalFrame("2");
    desktop.add(inFrame2);
    inFrame2.setContentPane(new JPanel());
    inFrame2.setPerferedSize(new Dimension(200,200));
    inFrame2.pack();
    inFrame2.setVisible(true);
}
那应该行。。
好的,SSCCE实际上工作正常。。这让我想知道,为什么原来的框架不起作用?

内容窗格中的更改可能不足以让框架自我更新(您认为是这样,但是很好)

在切换代码中,尝试从帧添加对
validate
的调用

//Again, this is where I'm having issues..
DefaultPanel dp = (DefaultPanel)baseFrame.getContentPane();
jdp.setVisible(true);
baseFrame.setContentPane(jdp);
DefaultInternalFrame dif = new DefaultInternalFrame();
jdp.add(dif);
dif.setContentPane(dp);
dif.setVisible(true);
dif.moveToFront();

DefaultInternalFrame dif2 = new DefaultInternalFrame();
jdp.add(dif2);
dif2.setContentPane(new DefaultPanel());
dif2.setVisible(true);
dif2.moveToFront();

baseFrame.validate(); // <-- Call me
//再说一遍,这就是我遇到的问题。。
DefaultPanel dp=(DefaultPanel)baseFrame.getContentPane();
setVisible(true);
baseFrame.setContentPane(jdp);
DefaultInternalFrame dif=新的DefaultInternalFrame();
jdp.add(dif);
设置内容窗格(dp);
dif.setVisible(真);
dif.moveToFront();
DefaultInternalFrame dif2=新的DefaultInternalFrame();
jdp.add(dif2);
setContentPane(新的DefaultPanel());
dif2.setVisible(真);
dif2.moveToFront();

baseFrame.validate();//你需要为任何一个这样做提供一个sense@MadProgrammer我添加了一个应该工作相同的。我还没有测试过它,但我马上就要测试了。奇怪的是,你们的例子很好用。我稍微调整了一下以确定,但它似乎对我有效。@Mad是的,我也注意到了。。。所以,我不知道我的原始代码是怎么回事。。我尝试过移动部件,但是,不管我做什么,我都无法让它工作..我可能建议,在您的原始代码中,您在框架上调用
validate
(可能还有
repaint