1. 如何让JSplitPane的两边的component不嵌在坑里面?
2. 如何让Dialog里面的JSplitPane也可以做到,鼠标移动到divider上的时候变成双箭头的图标?关于第一个问题,默认的JSplitPane实现之后,leftComponent和rightComponent都是下陷的,好像在一个坑里面。我想把他们弄到根divider同一平面上,如何做呢?参看了其他系统的源代码,没发现有特别的对splitpane的操作,怀疑是总体的一个UI风格控制问题。关于第二个问题,JSplitPane放在窗口上之后,如果是放在JFrame里面,默认就是鼠标移动到divider上就成了双箭头的调节指针图标。但是我放到JDialog里面之后,鼠标指针却固执的保持他的箭头风格。不知道如何才能与JFrame里面的一样呢?
2. 如何让Dialog里面的JSplitPane也可以做到,鼠标移动到divider上的时候变成双箭头的图标?关于第一个问题,默认的JSplitPane实现之后,leftComponent和rightComponent都是下陷的,好像在一个坑里面。我想把他们弄到根divider同一平面上,如何做呢?参看了其他系统的源代码,没发现有特别的对splitpane的操作,怀疑是总体的一个UI风格控制问题。关于第二个问题,JSplitPane放在窗口上之后,如果是放在JFrame里面,默认就是鼠标移动到divider上就成了双箭头的调节指针图标。但是我放到JDialog里面之后,鼠标指针却固执的保持他的箭头风格。不知道如何才能与JFrame里面的一样呢?
// SimpleSplitPane.java
// A quick test of the JSplitPane class.
//
import java.awt.*;
import java.awt.event.*;
import javax.swing.*;
import javax.swing.border.*;public class SimpleSplitPane extends JFrame { static String sometext = "This is a simple text string that is long enough "
+ "to wrap over a few lines in the simple demo we're about to build. "
+ "We'll put two text areas side by side in a split pane."; public SimpleSplitPane() {
super("Simple SplitPane Frame");
setSize(450, 200);
setDefaultCloseOperation(EXIT_ON_CLOSE);
try {
UIManager.setLookAndFeel(UIManager.getSystemLookAndFeelClassName());
} catch (Exception e) {
// TODO Auto-generated catch block
e.printStackTrace();
} JTextArea jt1 = new JTextArea(sometext);
JTextArea jt2 = new JTextArea(sometext);
jt1.setBorder(BorderFactory.createRaisedBevelBorder());
jt2.setBorder(BorderFactory.createRaisedBevelBorder()); // Make sure our text boxes do line wrapping and have reasonable
// minimum sizes.
jt1.setLineWrap(true);
jt2.setLineWrap(true);
jt1.setMinimumSize(new Dimension(150, 150));
jt2.setMinimumSize(new Dimension(150, 150));
jt1.setPreferredSize(new Dimension(250, 200));
JSplitPane sp = new JSplitPane(JSplitPane.HORIZONTAL_SPLIT, jt1, jt2);
// sp.setBorder(BorderFactory.createLoweredBevelBorder());
sp.setDividerSize(10);
getContentPane().add(sp, BorderLayout.CENTER);
} public static void main(String args[]) {
SimpleSplitPane ssb = new SimpleSplitPane();
ssb.setVisible(true);
}
}
第二位的建议…… 之前我也试过,说实话几乎没有效果。:-( 不过,现在divider还是突起的。希望divider不要突起,比如在Windows的L&F里面,如果看不到divider才比较完美。
import java.awt.Color;
import java.awt.Graphics;import javax.swing.*;
import javax.swing.plaf.basic.BasicSplitPaneDivider;
import javax.swing.plaf.basic.BasicSplitPaneUI;public class T
{
public static void main(String[] args)
{
JPanel p1 = new JPanel();
JPanel p2 = new JPanel();
p1.setBackground(Color.LIGHT_GRAY);
p2.setBackground(Color.LIGHT_GRAY);
JSplitPane splitPane = new JSplitPane();
splitPane.setUI(new FlatSplitPaneUI());
splitPane.setBorder(null);
splitPane.setLeftComponent(p1);
splitPane.setRightComponent(p2);
JFrame f = new JFrame();
f.getContentPane().add(splitPane, BorderLayout.CENTER);
((JComponent) f.getContentPane()).setBorder(BorderFactory.createEmptyBorder(10, 10, 10, 10));
f.setSize(300, 200);
f.setLocationRelativeTo(null);
f.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
f.setVisible(true);
}
}class FlatSplitPaneUI extends BasicSplitPaneUI {
public BasicSplitPaneDivider createDefaultDivider()
{
BasicSplitPaneDivider divider = new BasicSplitPaneDivider(this) {
public void paint(Graphics g)
{
}
};
return divider;
}
}
JSplitPane settingPane = new JSplitPane(JSplitPane.HORIZONTAL_SPLIT, new JScrollPane(this.getNavList()), new JPanel(new BorderLayout()));
SplitPaneUI ui = settingPane.getUI();
if (ui instanceof BasicSplitPaneUI) {
((BasicSplitPaneUI)ui).getDivider().setBorder(null);
}
settingPane.setBorder(null); 这个是我想要的效果。呵呵……第二个问题…… 还请大家多多帮助呀!
2. 如何让Dialog里面的JSplitPane也可以做到,鼠标移动到divider上的时候变成双箭头的图标?
import javax.swing.JSplitPane;public class SplitDialog extends JDialog{
public SplitDialog(){
super();
JSplitPane splitPane = new JSplitPane();
getContentPane().add(splitPane);
setSize(300, 400);
setVisible(true);
}
public static void main(String[] args){
SplitDialog dialog = new SplitDialog();
}
}
我把你的代码原本抄写过来运行,结果还是普通的鼠标箭头。而且,我原来的程序分别在两台机器上测试都是普通箭头。我用的操作系统是Windows XP, JDK的版本是5.0 JRE的版本是1.5_06难道与这些配置有关?
呵呵,莫非真是JDK版本的问题,还是操作系统
http://bugs.sun.com/bugdatabase/view_bug.do?bug_id=5079694
UIDefaults defaults = UIManager.getDefaults();
defaults.remove("SplitPane.border");
defaults.remove("SplitPaneDivider.border");第二个问题…… 看了gtlang78给的Link,解决掉了!
Work Around Use a dialog with a visible owner. (This entails usage of
a constructor with the owner agrument instead of the no-arg one.)
xxxxx@xxxxx 2005-1-12 11:39:50 GMT
这段话很有用。其实我的dialog本来就是要有一个frame的owner的,只不过调试时没有挂进去罢了。
经过测试,JDialog dialog = new JDialog(frame); 这样改一下就好了。frame是一个JFrame的对象,并且已经显示(测试结果表明,visible不是true不行)。感谢各位帮助,这个问题到此我想可以结贴了。