JSplitPane 左右各增加了一个 Panel.
现在问题是,有些时候,我不希望JSplitPane 中间的 分隔条移动。 不知道各位有什么好点子没?

解决方案 »

  1.   

    不能移动还不如不用它,直接用两个JPanel,固定大小
      

  2.   

    JSplitPane好像本身不提供这样的方法
    通过设定两边Panel的最大和最小值为一样,可能可以达到目的
      

  3.   

    禁止移动:
    ((BasicSplitPaneUI)jSplitPane.getUI()).getDivider().setBasicSplitPaneUI(null);恢复可动:
    BasicSplitPaneUI ui = new BasicSplitPaneUI();
    ui.installUI(jSplitPane);
    ((BasicSplitPaneUI)jSplitPane.getUI()).getDivider().setBasicSplitPaneUI(ui);
    不过恢复后位置可能有变化,你可能需要手动的设定一下位置
    如果对BasicSplitPaneUI的风格不满意,
    可以用new WindowsSplitPaneUI()
    new MetalSplitPaneUI()
    等等……
      

  4.   


    ls的说法是正确的,但是做法欠妥当。
    每一次都重新创建一个ui对象,首先从时空上来说有浪费,虽然或许浪费不多。而且,界面效果是有问题的,不知道你是否仔细看过。
    较好的一点,至少应该将ui保存起来,用的时候直接用,不用的时候设置成null也没有问题。
    至于installUI,这个方法将所有的内容都初始化了一次。并不应该随处调用,会有问题。请参考:public class TestFrame extends JFrame { private JButton enableButton; private JButton unableButton; private boolean canResize = true;
    private BasicSplitPaneUI ui; public TestFrame() {
    super();
    Container c = getContentPane();
    final JSplitPane jsp = new JSplitPane(); ui = (BasicSplitPaneUI) jsp.getUI();
    jsp.setContinuousLayout(true);
    jsp.setLeftComponent(new JScrollPane(new JTree()));
    jsp.setRightComponent(new JTextArea()); jsp.setOneTouchExpandable(true); c.add(jsp); JPanel p = new JPanel();
    enableButton = new JButton("可以移动");
    enableButton.addActionListener(new ActionListener() { @Override
    public void actionPerformed(ActionEvent e) {
    /******************** 用这种方式 ,不要每次new *****************/
    ((BasicSplitPaneUI) jsp.getUI()).getDivider()
    .setBasicSplitPaneUI(ui);
    /*****************************************/
    // 这种做法的问题运行一下就看到了
    // BasicSplitPaneUI newUI = new BasicSplitPaneUI();
    // newUI.installUI(jsp);
    // ((BasicSplitPaneUI) jsp.getUI()).getDivider()
    // .setBasicSplitPaneUI(newUI);
    /*****************************************/
    }
    });
    p.add(enableButton);
    unableButton = new JButton("不可移动");
    unableButton.addActionListener(new ActionListener() { @Override
    public void actionPerformed(ActionEvent e) {
    ui.getDivider().setBasicSplitPaneUI(null); }
    });
    p.add(unableButton);
    c.add(p, BorderLayout.SOUTH);
    setDefaultCloseOperation(EXIT_ON_CLOSE);
    setSize(600, 400);
    setLocationRelativeTo(null);
    setVisible(true);
    } public static void main(String[] args) {
    new TestFrame();
    }
    }
      

  5.   

    好,谢谢各位献计献策;感激不尽。sunyiz的方案,跟gentalguo的改进方案,切实可行。也感谢nanman提出了宝贵意见。
      

  6.   

    最简单的办法:jSplitPane.setEnabled(false);
    这样不会影响到上下层的操作,如果你的项目特别打的话,用sunyiz的方案,跟gentalguo的改进方案,确实可解决问题,但是会影响到别的组件。
    setEnabled(false);设置是否启用此组件。已启用的组件可能响应用户输入,而未启用的组件则无法响应用户输入。可以在禁用某些组件时更改其可视化表现形式,以向用户提供反馈,说明其无法接受输入。