Swing JSplitPane 如果让他不能左右移动? JSplitPane 左右各增加了一个 Panel.现在问题是,有些时候,我不希望JSplitPane 中间的 分隔条移动。 不知道各位有什么好点子没? 解决方案 » 免费领取超大流量手机卡,每月29元包185G流量+100分钟通话, 中国电信官方发货 不能移动还不如不用它,直接用两个JPanel,固定大小 JSplitPane好像本身不提供这样的方法通过设定两边Panel的最大和最小值为一样,可能可以达到目的 禁止移动:((BasicSplitPaneUI)jSplitPane.getUI()).getDivider().setBasicSplitPaneUI(null);恢复可动:BasicSplitPaneUI ui = new BasicSplitPaneUI();ui.installUI(jSplitPane);((BasicSplitPaneUI)jSplitPane.getUI()).getDivider().setBasicSplitPaneUI(ui);不过恢复后位置可能有变化,你可能需要手动的设定一下位置如果对BasicSplitPaneUI的风格不满意,可以用new WindowsSplitPaneUI()new MetalSplitPaneUI()等等…… 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(); }} 好,谢谢各位献计献策;感激不尽。sunyiz的方案,跟gentalguo的改进方案,切实可行。也感谢nanman提出了宝贵意见。 最简单的办法:jSplitPane.setEnabled(false);这样不会影响到上下层的操作,如果你的项目特别打的话,用sunyiz的方案,跟gentalguo的改进方案,确实可解决问题,但是会影响到别的组件。setEnabled(false);设置是否启用此组件。已启用的组件可能响应用户输入,而未启用的组件则无法响应用户输入。可以在禁用某些组件时更改其可视化表现形式,以向用户提供反馈,说明其无法接受输入。 Socket如何按照一定格式发送消息? 今天刚学缓冲区,在自己编写MyBufferedReader 时,在使用myReadLine()时,总是不能督导最后一行,求大神们指点。 组件边框问题 你能回答吗?谢谢了 scrollPane 向下滚动? 关于得到服务器目录结构--求助 如何知道一个class在那个jar文件中 请教用javamail群发邮件的原理。 Does C# mean the end of Java?? 微软胃口大! 在JAVA小程序中用SWING组件怎样才可在IE中正确显示 关于网络聊天加网络文件传输的问题 FTPClient做的下载程序执行时异常,手工却能下载,什么原因?
通过设定两边Panel的最大和最小值为一样,可能可以达到目的
((BasicSplitPaneUI)jSplitPane.getUI()).getDivider().setBasicSplitPaneUI(null);恢复可动:
BasicSplitPaneUI ui = new BasicSplitPaneUI();
ui.installUI(jSplitPane);
((BasicSplitPaneUI)jSplitPane.getUI()).getDivider().setBasicSplitPaneUI(ui);
不过恢复后位置可能有变化,你可能需要手动的设定一下位置
如果对BasicSplitPaneUI的风格不满意,
可以用new WindowsSplitPaneUI()
new MetalSplitPaneUI()
等等……
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();
}
}
这样不会影响到上下层的操作,如果你的项目特别打的话,用sunyiz的方案,跟gentalguo的改进方案,确实可解决问题,但是会影响到别的组件。
setEnabled(false);设置是否启用此组件。已启用的组件可能响应用户输入,而未启用的组件则无法响应用户输入。可以在禁用某些组件时更改其可视化表现形式,以向用户提供反馈,说明其无法接受输入。