package tk.amberide.ide.swing.misc; import java.awt.Graphics; import java.awt.Rectangle; import javax.swing.JSplitPane; import javax.swing.UIManager; import javax.swing.border.Border; import javax.swing.plaf.basic.BasicSplitPaneDivider; import javax.swing.plaf.basic.BasicSplitPaneUI; /** * * @author Tudor */ public class ThinSplitPane extends JSplitPane { private int dividerDragSize = 9; private int dividerDragOffset = 4; public ThinSplitPane() { setDividerSize(1); setContinuousLayout(true); } @Override public void doLayout() { super.doLayout(); // increase divider width or height BasicSplitPaneDivider divider = ((BasicSplitPaneUI) getUI()).getDivider(); Rectangle bounds = divider.getBounds(); if (orientation == HORIZONTAL_SPLIT) { bounds.x -= dividerDragOffset; bounds.width = dividerDragSize; } else { bounds.y -= dividerDragOffset; bounds.height = dividerDragSize; } divider.setBounds(bounds); } @Override public void updateUI() { setUI(new SplitPaneWithZeroSizeDividerUI()); revalidate(); } private class SplitPaneWithZeroSizeDividerUI extends BasicSplitPaneUI { @Override public BasicSplitPaneDivider createDefaultDivider() { return new ZeroSizeDivider(this); } } private class ZeroSizeDivider extends BasicSplitPaneDivider { public ZeroSizeDivider(BasicSplitPaneUI ui) { super(ui); super.setBorder(null); setBackground(UIManager.getColor("controlShadow")); } @Override public void setBorder(Border border) { // ignore } @Override public void paint(Graphics g) { g.setColor(getBackground()); if (orientation == HORIZONTAL_SPLIT) { g.drawLine(dividerDragOffset, 0, dividerDragOffset, getHeight() - 1); } else { g.drawLine(0, dividerDragOffset, getWidth() - 1, dividerDragOffset); } } @Override protected void dragDividerTo(int location) { super.dragDividerTo(location + dividerDragOffset); } @Override protected void finishDraggingTo(int location) { super.finishDraggingTo(location + dividerDragOffset); } } }