在JSplitPane上设置分隔符位置

时间:2017-04-01 10:19:31

标签: java swing

我想要3个可调整大小的水平JPanel。它工作正常,但我无法设置第一个JSlitPane的位置:sp.setDividerLocation(.3);不起作用。

public class JSplitPanelProva extends JFrame {

        public JSplitPanelProva() {
            this.setLayout(new BorderLayout());

            JPanel leftPanel = new JPanel();
            leftPanel.setBackground(Color.BLUE);
            JPanel centerPanel = new JPanel();
            centerPanel.setBackground(Color.CYAN);
            JPanel rightPanel = new JPanel();
            rightPanel.setBackground(Color.GREEN);

            JSplitPane sp = new JSplitPane(JSplitPane.HORIZONTAL_SPLIT, leftPanel, centerPanel);
            JSplitPane sp2 = new JSplitPane(JSplitPane.HORIZONTAL_SPLIT, sp, rightPanel);

            sp.setOneTouchExpandable(true);
            sp2.setOneTouchExpandable(true);


            this.add(sp2, BorderLayout.CENTER);

            this.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);

            this.setSize(1000, 600);
            this.setVisible(true);

            sp.setDividerLocation(.3);
            sp2.setDividerLocation(.6);
        }

        /**
         * @param args the command line arguments
         */
        public static void main(String[] args) {
            new JSplitPanelProva();

        }

    }

我明白了: enter image description here 有人能帮我吗? 感谢。

3 个答案:

答案 0 :(得分:2)

变化:

    sp2.setDividerLocation(.6);
    ActionListener splitListener = new ActionListener() {

        @Override
        public void actionPerformed(ActionEvent e) {
            sp.setDividerLocation(.3);
        }
    };
    Timer t = new Timer(200, splitListener);
    t.setRepeats(false);
    t.start();

要:

main

它将按预期工作。延迟为GUI重新计算大小提供了时间。

答案 1 :(得分:2)

看起来需要做三件事:

  1. 在框架可见之前无法设置分隔符位置
  2. 需要先设置第二个分割窗格的位置
  3. 需要将第一个拆分窗格的位置添加到Event Dispatch Thread (EDT)
  4. 的末尾

    以下代码将完成所有3:

    this.setVisible(true);
    
    sp2.setDividerLocation(.6);
    
    SwingUtilities.invokeLater(new Runnable()
    {
        public void run()
        {
            sp.setDividerLocation(.3);
        }
    });
    

    注意:应在EDT上创建所有Swing组件。所以你也应该使用以下内容来创建框架:

    EventQueue.invokeLater(new Runnable()
    {
        public void run()
        {
            new JSplitPaneProva();
        }
    });
    

答案 2 :(得分:1)

setDividerLocation(double proportionalLocation)方法的文档说:

  

如果未正确实现拆分窗格并且在屏幕上显示此方法   将没有效果(新的分隔符位置将成为(当前大小*   proportionalLocation)是0)。

您可以做的是使用setDividerLocation(int location)方法,如下所示:

sp.setDividerLocation(300);
sp2.setDividerLocation(600);