2013-01-23 51 views
1

因此,在这一点上,我只有一个简单的JFrame,其中包含一个简单的JPanel。 (也就是说,它的contentPaneJPanel。)有一个在JFrame一个菜单栏与当前JFrame转换为JInternalFrame一个按钮 - 它集的的JFramecontentPane到预先存在的JDesktopPane和移动JPanel这是内将JFrame添加到新创建的JInternalFrame中 - 并创建第二个JInternalFrame,其中包含新的JPanel。这里是我的代码:问题获取JInternalFrame出现

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越来越高的优先级。也就是说,这段代码执行后,我没有看到两个JInternalFrames,我看到了JDesktopPane。这不是因为JInternalFrame的大小或位置的问题。我已经广泛地检查过了(通过在arrangeHorizontally()方法之后打印尺寸和位置)。所以,我不知所措。任何帮助?

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实际工作,因为它应该..这使我不知道,为什么不是原来的工作?

+1

你将需要提供一个[SSCCE](http://sscce.org/)任何有意义的 – MadProgrammer

+0

@MadProgrammer我添加了一个应该工作相同。我还没有测试过,但即将这样做。 –

+0

奇怪的是,你的例子工作得很好。我稍微调整了一下,但它似乎对我有用。 – MadProgrammer

回答

2

内容窗格中的更改可能不足以让框架自行更新(您认为它应该是干草)。

在交换机的代码,尝试将调用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 

您可能还需要repaint一个电话,但看到这让你。