【问题标题】:Setting divider location on a JSplitPane在 JSplitPane 上设置分隔线位置
【发布时间】:2017-04-01 23:21:04
【问题描述】:

我想要 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();

        }

    }

我明白了: 有人能帮我吗? 谢谢。

【问题讨论】:

    标签: java swing


    【解决方案1】:

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

    如果拆分窗格未正确实现并显示在屏幕上,则此方法 将无效(新的分隔线位置将变为(当前大小 * 比例位置),即 0)。

    您可以改为使用setDividerLocation(int location) 方法,如下所示:

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

    【讨论】:

      【解决方案2】:

      变化:

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

      收件人:

          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();
      

      它会按预期工作。延迟让 GUI 有时间重新计算大小。

      【讨论】:

        【解决方案3】:

        看起来需要做 3 件事:

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

        以下代码将完成所有 3 个:

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

        注意:所有 Swing 组件都应在 EDT 上创建。因此,您还应该使用以下内容来创建框架:

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

        【讨论】:

          猜你喜欢
          • 2023-03-20
          • 1970-01-01
          • 1970-01-01
          • 2017-03-05
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2016-07-04
          相关资源
          最近更新 更多