2012-10-09 16 views
4

JSplitPane似乎添加邊框添加到任何Component爲什麼JSplitPane會爲我的組件添加邊框,我該如何阻止它?

這與嵌套JSplitPanes最明顯的 - 例如爲:

public class JSplitPaneToy { 

    public static void main(String[] args) { 
    JSplitPane sp = new JSplitPane(JSplitPane.VERTICAL_SPLIT, 
     makePanel(), makePanel()); 
    sp = new JSplitPane(JSplitPane.VERTICAL_SPLIT, makePanel(), sp); 
    sp = new JSplitPane(JSplitPane.VERTICAL_SPLIT, makePanel(), sp); 
    sp = new JSplitPane(JSplitPane.VERTICAL_SPLIT, makePanel(), sp); 

    JFrame frame = new JFrame("JSplitPane Toy"); 
    frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); 
    frame.setContentPane(sp); 
    frame.pack(); 
    frame.setVisible(true); 
    } 

    private static JScrollPane makePanel() { 
    JScrollPane pane = new JScrollPane(new JTable(
     new Object[][]{{0, 1, 2}, {1, 2, 3}, {2, 3, 4}}, new Object[]{1, 2, 3})); 
    pane.setPreferredSize(new Dimension(200, 100)); 
    return pane; 
    } 
} 

即每個後續的嵌套組件似乎要被設置進一步向後 - 即有一些形式的陰影邊界的被添加。

  • 爲什麼被加入這一邊界? (這實際上是一個邊界被添加...?)
  • 我怎樣才能防止這個'邊界'被添加?

回答

6

如果要在所有JSplitPane上放置這些邊界,可以像這樣更改UI的默認值。不過,我通常不會混淆UI默認值。

import java.awt.Dimension; 

import javax.swing.BorderFactory; 
import javax.swing.JFrame; 
import javax.swing.JScrollPane; 
import javax.swing.JSplitPane; 
import javax.swing.JTable; 
import javax.swing.SwingUtilities; 
import javax.swing.UIManager; 

public class JSplitPaneToy { 

    public static void main(String[] args) { 
     UIManager.getDefaults().put("SplitPane.border", BorderFactory.createEmptyBorder()); 
     SwingUtilities.invokeLater(new Runnable() { 
      @Override 
      public void run() { 
       new JSplitPaneToy().initUI(); 
      } 
     }); 
    } 

    public void initUI() { 
     JSplitPane sp = new JSplitPane(JSplitPane.VERTICAL_SPLIT, makePanel(), makePanel()); 
     sp = new JSplitPane(JSplitPane.VERTICAL_SPLIT, makePanel(), sp); 
     sp = new JSplitPane(JSplitPane.VERTICAL_SPLIT, makePanel(), sp); 
     sp = new JSplitPane(JSplitPane.VERTICAL_SPLIT, makePanel(), sp); 

     JFrame frame = new JFrame("JSplitPane Toy"); 
     frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); 
     frame.setContentPane(sp); 
     frame.pack(); 
     frame.setVisible(true); 
    } 

    private JScrollPane makePanel() { 
     JScrollPane pane = new JScrollPane(new JTable(new Object[][] { { 0, 1, 2 }, { 1, 2, 3 }, { 2, 3, 4 } }, new Object[] { 1, 2, 3 })); 
     pane.setPreferredSize(new Dimension(200, 100)); 
     return pane; 
    } 
} 

您可能希望有代替嵌套這麼多splitpanes看看SwingX項目JXMultiSplitPane。

+0

美麗 - 非常感謝。 – amaidment

3

我們用這種方法爲 「扁平化」 JSplitPane的一個。也許這是你正在尋找的:

/** 
* Makes a split pane invisible. Only contained components are shown. 
* 
* @param splitPane 
*/ 
public static void flattenJSplitPane(JSplitPane splitPane) { 
    splitPane.setBorder(BorderFactory.createEmptyBorder(1, 1, 1, 1)); 
    BasicSplitPaneUI flatDividerSplitPaneUI = new BasicSplitPaneUI() { 
     @Override 
     public BasicSplitPaneDivider createDefaultDivider() { 
      return new BasicSplitPaneDivider(this) { 
       @Override 
       public void setBorder(Border b) { 
       } 
      }; 
     } 
    }; 
    splitPane.setUI(flatDividerSplitPaneUI); 
    splitPane.setBorder(null); 
} 

至於爲什麼邊界被添加,不知道。顯然它是某種功能。我們發現它是不需要的,上面的方法可以解決它。處理這個問題可能有一個更簡單的方法,但是,嘿,當你發現一些有效的工作時,你就不再尋找替代品。

+1

這不跨越不同的平臺和不同的L&F工作。 –

+0

@GuillaumePolet是否也適用於oliholz發佈的aswer?我記得在我發佈的解決方案之前嘗試瞭解決方案,它並未在拆分窗格中移除組件周圍的灰色邊框。 – predi

+0

不,因爲他沒有更改分隔面板的UI,只有BasicSplitPaneUI的邊框。但是,這也不是的情況下,很可擴展您使用的是L&F使用不延伸BasicSplitPaneUI的一個SplitPaneUI的,你必須爲每個splitpane你必須在你的代碼 –

2

我用這個,重置邊界形成的分隔符。

SplitPaneUI ui = sp.getUI(); 
    if(ui instanceof BasicSplitPaneUI) { 
     ((BasicSplitPaneUI)ui).getDivider().setBorder(null); 
    } 

注意:你舉的例子不工作splitPane是未知的,它應該是sp

public class JSplitPaneToy { 

    public static void main(String[] args) { 
    JSplitPane sp = new JSplitPane(JSplitPane.VERTICAL_SPLIT, makePanel(), makePanel()); 
    SplitPaneUI ui = sp.getUI(); 

    if(ui instanceof BasicSplitPaneUI) { 
     ((BasicSplitPaneUI)ui).getDivider().setBorder(null); 
    } 
    sp.setBorder(BorderFactory.createEmptyBorder()); 

    sp = new JSplitPane(JSplitPane.VERTICAL_SPLIT, makePanel(), sp); 
    ui = sp.getUI(); 
    if(ui instanceof BasicSplitPaneUI) { 
     ((BasicSplitPaneUI)ui).getDivider().setBorder(null); 
    } 
    sp.setBorder(BorderFactory.createEmptyBorder()); 

    sp = new JSplitPane(JSplitPane.VERTICAL_SPLIT, makePanel(), sp); 
    ui = sp.getUI(); 
    if(ui instanceof BasicSplitPaneUI) { 
     ((BasicSplitPaneUI)ui).getDivider().setBorder(null); 
    } 
    sp.setBorder(BorderFactory.createEmptyBorder()); 

    sp = new JSplitPane(JSplitPane.VERTICAL_SPLIT, makePanel(), sp); 
    ui = sp.getUI(); 
    if(ui instanceof BasicSplitPaneUI) { 
     ((BasicSplitPaneUI)ui).getDivider().setBorder(null); 
    } 
    sp.setBorder(BorderFactory.createEmptyBorder()); 

    JFrame frame = new JFrame("JSplitPane Toy"); 
    frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); 
    frame.setContentPane(sp); 
    frame.pack(); 
    frame.setVisible(true); 
    } 

    private static JScrollPane makePanel() { 
    JScrollPane pane = new JScrollPane(new JTable(
     new Object[][]{{0, 1, 2}, {1, 2, 3}, {2, 3, 4}}, new Object[]{1, 2, 3}){ 
    }); 
    pane.setPreferredSize(new Dimension(200, 100)); 
    return pane; 
    } 
} 
+0

由於執行該操作 - 原先把它稱爲splitPane(在IDE)但重命名爲'sp'用於在SO中進行渲染。顯然,我錯過了一個...現在修復了。 – amaidment

0

一個替代解決辦法是設置每個ComponentJSplitPane有一個空的邊界 - 例如

JComponent a = ...; 
JComponent b = ...; 
a.setBorder(BorderFactory.createEmptyBorder()); 
b.setBorder(BorderFactory.createEmptyBorder()); 
JSplitPane splitPane = new JSplitPane(JSplitPane.VERTICAL_SPLIT, a, b); 
0

由JScrollPane的只是覆蓋setBroder這樣

public class MyScrollPane extends JScrollPane { 
... 
@Override 
public void setBorder(Border b) {} 
} 
相關問題