Swing JSplitPane 如果让他不能左右移动?

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


...全文
353 8 打赏 收藏 转发到动态 举报
AI 作业
写回复
用AI写文章
8 条回复
切换为时间正序
请发表友善的回复…
发表回复
xiahanlin213 2011-05-16
  • 打赏
  • 举报
回复
最简单的办法:jSplitPane.setEnabled(false);
这样不会影响到上下层的操作,如果你的项目特别打的话,用sunyiz的方案,跟gentalguo的改进方案,确实可解决问题,但是会影响到别的组件。
setEnabled(false);设置是否启用此组件。已启用的组件可能响应用户输入,而未启用的组件则无法响应用户输入。可以在禁用某些组件时更改其可视化表现形式,以向用户提供反馈,说明其无法接受输入。
sunyiz 2010-12-09
  • 打赏
  • 举报
回复
禁止移动:
((BasicSplitPaneUI)jSplitPane.getUI()).getDivider().setBasicSplitPaneUI(null);


恢复可动:
BasicSplitPaneUI ui = new BasicSplitPaneUI();
ui.installUI(jSplitPane);
((BasicSplitPaneUI)jSplitPane.getUI()).getDivider().setBasicSplitPaneUI(ui);

不过恢复后位置可能有变化,你可能需要手动的设定一下位置
如果对BasicSplitPaneUI的风格不满意,
可以用new WindowsSplitPaneUI()
new MetalSplitPaneUI()
等等……
Mybeautiful 2010-12-09
  • 打赏
  • 举报
回复
试下看看。
我想用另外一个途径,就是 如果不想移动时,就把响应鼠标拖动的事件监听器 暂时移除,
让需要可以移动时,就把这个事件监听器加进去.

但是不知道这个事件监听器是哪个?
  • 打赏
  • 举报
回复
JSplitPane好像本身不提供这样的方法
通过设定两边Panel的最大和最小值为一样,可能可以达到目的
Mybeautiful 2010-12-09
  • 打赏
  • 举报
回复
需要动,但是有时候它不能动.
  • 打赏
  • 举报
回复
不能移动还不如不用它,直接用两个JPanel,固定大小
Mybeautiful 2010-12-09
  • 打赏
  • 举报
回复
好,谢谢各位献计献策;感激不尽。

sunyiz的方案,跟gentalguo的改进方案,切实可行。也感谢nanman提出了宝贵意见。
gentalguo 2010-12-09
  • 打赏
  • 举报
回复
[Quote=引用 5 楼 sunyiz 的回复:]
禁止移动:

Java code
((BasicSplitPaneUI)jSplitPane.getUI()).getDivider().setBasicSplitPaneUI(null);


恢复可动:

Java code
BasicSplitPaneUI ui = new BasicSplitPaneUI();
ui.installUI(jSplitPane);
((……
[/Quote]

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


62,635

社区成员

发帖
与我相关
我的任务
社区描述
Java 2 Standard Edition
社区管理员
  • Java SE
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧