In a JSplitPane
, you have the setOneTouchExpandable
method which provides you with 2 buttons to quickly fully hide or full show the JSplitPane
.
My question is how can you programmatically "click" the hide button on the JSplitPane
?
I may have wrongly explained myself. I want the splitpane to show only one of the 2 components at start (this is what i mean by clicking).
This works:
import javax.swing.*;
class SplitPaneDefault {
public static void main(String[] args) {
SwingUtilities.invokeLater(new Runnable() {
public void run() {
JSplitPane sp = new JSplitPane(
JSplitPane.HORIZONTAL_SPLIT,
new JTree(),
new JTree());
sp.setOneTouchExpandable(true);
sp.setDividerLocation(0.0);
JOptionPane.showMessageDialog(null, sp);
}
});
}
}
but replacing 0.0
with 1.0
doesn't hide the right component. This is my problem!
import javax.swing.*;
class SplitPaneDefault {
public static void main(String[] args) {
SwingUtilities.invokeLater(new Runnable() {
public void run() {
JSplitPane sp = new JSplitPane(
JSplitPane.HORIZONTAL_SPLIT,
new JTree(),
new JTree());
sp.setOneTouchExpandable(true);
sp.setDividerLocation(0.0);
JOptionPane.showMessageDialog(null, sp);
}
});
}
}
replace 0.0 with 1.0 and you get my problem
Read the fine manual and solve the problem.
This method immediately changes the size of the split pane based on its current size. If the split pane is not correctly realized and on screen, this method will have no effect ...
import javax.swing.*;
class SplitPaneDefault {
public static void main(String[] args) {
SwingUtilities.invokeLater(new Runnable() {
public void run() {
JSplitPane sp = new JSplitPane(
JSplitPane.HORIZONTAL_SPLIT,
new JTree(),
new JTree());
sp.setOneTouchExpandable(true);
JFrame f = new JFrame("Split Pane To Right");
f.add(sp);
f.pack();
// sp now has a non-zero size!
sp.setDividerLocation(1.0);
f.setLocationByPlatform(true);
f.setDefaultCloseOperation(JFrame.DISPOSE_ON_CLOSE);
f.setVisible(true);
}
});
}
}
Here is another solution, maybe a little bit dirty, but it works ;) I hope the code speaks for itself.
public class ExtOneTouchJSplitPane extends JSplitPane {
private static final long serialVersionUID = -2320161961382260438L;
JButton jBLeftUp;
JButton jBRightDown;
public ExtOneTouchJSplitPane() {
super();
setOneTouchExpandable(true);
extractDividerButtons();
}
public ExtOneTouchJSplitPane(int newOrientation) {
super(newOrientation);
setOneTouchExpandable(true);
extractDividerButtons();
}
public ExtOneTouchJSplitPane(int newOrientation, boolean newContinuousLayout) {
super(newOrientation, newContinuousLayout);
setOneTouchExpandable(true);
extractDividerButtons();
}
public ExtOneTouchJSplitPane(int newOrientation, boolean newContinuousLayout, Component newLeftComponent, Component newRightComponent) {
super(newOrientation, newContinuousLayout, newLeftComponent, newRightComponent);
setOneTouchExpandable(true);
extractDividerButtons();
}
public ExtOneTouchJSplitPane(int newOrientation, Component newLeftComponent, Component newRightComponent) {
super(newOrientation, newLeftComponent, newRightComponent);
setOneTouchExpandable(true);
extractDividerButtons();
}
private void extractDividerButtons() {
BasicSplitPaneUI ui = (BasicSplitPaneUI) getUI();
jBLeftUp = (JButton) ui.getDivider().getComponent(0);
jBRightDown = (JButton) ui.getDivider().getComponent(1);
}
public void oneTouchClickLeft() {
jBLeftUp.doClick();
}
public void oneTouchClickRight() {
jBRightDown.doClick();
}
public void oneTouchClickUp() {
jBLeftUp.doClick();
}
public void oneTouchClickDown() {
jBRightDown.doClick();
}
}
And an example how to use it:
public class SplitPaneDemo extends JFrame implements Runnable {
public static void main(String[] args) {
SwingUtilities.invokeLater(new SplitPaneDemo());
}
ExtOneTouchJSplitPane hSplitPane;
ExtOneTouchJSplitPane vSplitPane;
public SplitPaneDemo() {
createView();
}
public void createView() {
setTitle("SplitPane-Demo");
setLayout(new BorderLayout(0, 0));
hSplitPane = new ExtOneTouchJSplitPane();
JButton jBLeft = new JButton("<html><body> <br>Left Component<br> </body></html>");
JButton jBRight = new JButton("<html><body> <br>Right Component<br> </body></html>");
jBLeft.addActionListener(new ActionListener() {
@Override
public void actionPerformed(ActionEvent e) {
hSplitPane.oneTouchClickLeft();
}
});
jBRight.addActionListener(new ActionListener() {
@Override
public void actionPerformed(ActionEvent e) {
hSplitPane.oneTouchClickRight();
}
});
hSplitPane.setLeftComponent(jBLeft);
hSplitPane.setRightComponent(jBRight);
add(hSplitPane, BorderLayout.CENTER);
vSplitPane = new ExtOneTouchJSplitPane(JSplitPane.VERTICAL_SPLIT);
JButton jBUp = new JButton("<html><body> <br>Up Component<br> </body></html>");
JButton jBDown = new JButton("<html><body> <br>Down Component<br> </body></html>");
jBUp.addActionListener(new ActionListener() {
@Override
public void actionPerformed(ActionEvent e) {
vSplitPane.oneTouchClickUp();
}
});
jBDown.addActionListener(new ActionListener() {
@Override
public void actionPerformed(ActionEvent e) {
vSplitPane.oneTouchClickDown();
}
});
vSplitPane.setTopComponent(jBUp);
vSplitPane.setBottomComponent(jBDown);
add(vSplitPane, BorderLayout.SOUTH);
}
@Override
public void run() {
setDefaultCloseOperation(WindowConstants.EXIT_ON_CLOSE);
setSize(400, 400);
setVisible(true);
hSplitPane.oneTouchClickLeft();
}
}
If you love us? You can donate to us via Paypal or buy me a coffee so we can maintain and grow! Thank you!
Donate Us With