2012-10-09 2 views
4

JSplitPane은 (는) Component에 국경을 추가했습니다.JSplitPane이 구성 요소에 테두리를 추가하는 이유는 무엇입니까? 중단하려면 어떻게해야합니까?

이 중첩의 JSplitPane 대부분 볼 - 예컨대 :

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

테두리가 추가되는 이유는 알 수 없습니다. 외관상으로는 그것의 어떤 종류의 특징. 우리는 그것을 원하지 않는 것으로 발견하고 위의 방법으로 문제를 해결합니다. 아마도이 문제를 다루는 더 쉬운 방법 일 것입니다.하지만 이봐, 작동하는 somethig가 발견되면 대안을 찾지 않을 것입니다.

+1

같이 JScrollPane의에 의해 setBroder 우선합니다. –

+0

@GuillaumePolet는 oliholz가 게시 한 aswer에도 적용됩니까? 내가 게시 한 전에 솔루션을 시도 기억하고 분할 된 창에서 구성 요소 주위에 회색 테두리를 제거하지 않았습니다. – predi

+0

그는 splitpane의 UI를 변경하지 않으므로 BasicSplitPaneUI의 경계 만 변경합니다. 그러나 이것은 BasicSplitPaneUI를 확장하지 않는 SplitPaneUI를 사용하는 L & F를 사용하고 코드에있는 모든 분할 창에 대해 해당 작업을 수행해야하는 경우에도 확장 성이 뛰어납니다. –

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

감사합니다. 원래 IDE에서 splitPane이라고 불렀습니다. SO로 렌더링하기 위해 'sp'로 이름이 변경되었습니다. 분명히, 나는 놓쳤다. .. 지금 고쳤다. – amaidment

0

다른 대안은 JSplitPane의 각 Component에 빈 테두리를 설정하는 것입니다.

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

그냥이 서로 다른 플랫폼과 다른 L & F를 통해 잘 작동하지 않는

public class MyScrollPane extends JScrollPane { 
... 
@Override 
public void setBorder(Border b) {} 
} 
관련 문제