JSplitPane没有绘画纠正

时间:2016-08-23 07:05:58

标签: java swing jsplitpane

在我的应用程序中,我有JFrame显示JSplitPane,其中分割为VERTICAL_SPLIT。顶部显示JLabel,底部显示JInternalFrame。发生了两个问题。

  1. JLabel正在显示,但JInternalFrame未显示。

    2。我必须调整应用程序的大小才能显示JSplitPane

  2. 我认为这与JSplitPane的错误使用有关。但是,我一直无法弄清楚是什么。我可以帮忙解决一下这个问题吗?

    P.S。我已经运行测试以确保GUIWindow.getInsideFrame()没有返回null。最后的instanceof检查表明窗格中的两个组件都存在且属于该类型。非常感谢你的帮助:

    protected static void newWindow(GUIFrame window) {
            SwingUtilities.invokeLater(new Runnable(){
    
                @Override
                public void run() {
                    JSplitPane pane = new JSplitPane(JSplitPane.VERTICAL_SPLIT);
                    JInternalFrame intFrame = window.getInsideFrame();
                    pane.setRightComponent(intFrame);
                    pane.setLeftComponent(new JLabel(window.getDescription()));
                    synchronized(lock){
                        frame.remove(currentPane);
                        frame.add(pane);
                    }
                    synchronized(lock){
                        frame.revalidate();
                        pane.setVisible(true);
                        frame.repaint();
                        if(window instanceof ColourFrameShower) return;
                        currentWindow = window;
                        currentPane = pane;
                        currentFrame = intFrame;
                    }
                    if(pane.getLeftComponent() instanceof JLabel) System.out.println("JLabel exists!");
                    else System.out.println("JLabel does not exist!");
    
                    if(pane.getRightComponent() instanceof JInternalFrame) System.out.println("JInternalFrame exists!");
                    else System.out.println("JInternalFrame does not exist!");
                }
    
            });
        }
    

    编辑:我在第二个frame.revalidate()块的开头调用synchronised(lock)修复了问题2。这已包含在代码中。

2 个答案:

答案 0 :(得分:1)

正如我在评论中告诉你的那样,你只需要在setVisible(true)上使用JInternalFrame,否则你的JSplitPane将无法使用{{1}}。

这是java swing上一个非常常见的错误!

我很高兴它帮助了你;)

答案 1 :(得分:0)

尝试设置resizeWeight:pane.setResizeWeight(0.5);