1. 如何让JSplitPane的两边的component不嵌在坑里面?
2. 如何让Dialog里面的JSplitPane也可以做到,鼠标移动到divider上的时候变成双箭头的图标?关于第一个问题,默认的JSplitPane实现之后,leftComponent和rightComponent都是下陷的,好像在一个坑里面。我想把他们弄到根divider同一平面上,如何做呢?参看了其他系统的源代码,没发现有特别的对splitpane的操作,怀疑是总体的一个UI风格控制问题。关于第二个问题,JSplitPane放在窗口上之后,如果是放在JFrame里面,默认就是鼠标移动到divider上就成了双箭头的调节指针图标。但是我放到JDialog里面之后,鼠标指针却固执的保持他的箭头风格。不知道如何才能与JFrame里面的一样呢?

解决方案 »

  1.   

    1. 你感觉这两个组件是下陷的, 一般来说是边界的风格给人造成的感觉. 可以把边界改成提高的, 不过效果不是特别明显:
    // 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);
    }
    }
      

  2.   

    1、你给两边分别放个JPanel,再给JPanel设置一个合适的Border,在视觉效果是就好多了,没有坑的感觉了啊。
      

  3.   

    感谢楼上第一位,使用setBorder(null)或者setBorder(emptyBorder)有一定的效果。
    第二位的建议…… 之前我也试过,说实话几乎没有效果。:-( 不过,现在divider还是突起的。希望divider不要突起,比如在Windows的L&F里面,如果看不到divider才比较完美。
      

  4.   

    另外,楼上第一位的意思好像是如果不用loweredBevelBorder就不会出现坑。事实上是默认就是个坑。呵呵……(我通常很懒的加修饰代码的,也不会不明就里的照抄程序)
      

  5.   

    import java.awt.BorderLayout;
    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;
    }
    }
      

  6.   

    在冷血动物和gtlang78(比我大两岁?)大力借助下,第一个问题告破!代码片段如下:
    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上的时候变成双箭头的图标?
      

  7.   

    楼主的第二个问题在我这显示为双箭头啊~~~~~奇怪package test;import javax.swing.JDialog;
    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();
    }
    }
      

  8.   

    不是吧?!
    我把你的代码原本抄写过来运行,结果还是普通的鼠标箭头。而且,我原来的程序分别在两台机器上测试都是普通箭头。我用的操作系统是Windows XP, JDK的版本是5.0 JRE的版本是1.5_06难道与这些配置有关?
      

  9.   

    我windows2000,JDK是1.4.2
    呵呵,莫非真是JDK版本的问题,还是操作系统
      

  10.   

    这是1.5里面的一个Bug, 在1.6版里面改正了
    http://bugs.sun.com/bugdatabase/view_bug.do?bug_id=5079694
      

  11.   

    第一个问题,又努力了一下,发现了一个不错的解决方案,一劳永逸,所有的splitpane都跟着变。
    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不行)。感谢各位帮助,这个问题到此我想可以结贴了。