Saturday, 4 August 2012

JXMultiSplitPane hiding node causes painting issues


  1. import java.awt.event.ActionEvent;
  2. import java.awt.event.ActionListener;
  3.  
  4. import javax.swing.JButton;
  5. import javax.swing.JFrame;
  6. import javax.swing.SwingUtilities;
  7.  
  8. import org.jdesktop.swingx.JXMultiSplitPane;
  9. import org.jdesktop.swingx.MultiSplitLayout;
  10. import org.jdesktop.swingx.MultiSplitLayout.Divider;
  11. import org.jdesktop.swingx.MultiSplitLayout.Leaf;
  12. import org.jdesktop.swingx.MultiSplitLayout.Node;
  13. import org.jdesktop.swingx.MultiSplitLayout.Split;
  14.  
  15. public class TestMultiSplitPane {
  16.  
  17.     public static final String LEFT = "left";
  18.     public static final String CENTER = "center";
  19.     public static final String RIGHT = "right";
  20.  
  21.     public static final String TOP = "top";
  22.     public static final String MIDDLE = "middle";
  23.     public static final String BOTTOM = "bottom";
  24.  
  25.     protected void initUI() {
  26.         JFrame frame = new JFrame();
  27.         frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
  28.         Split horizontal = new Split();
  29.         Split left = getVerticalSplit(LEFT, 0.5, 0.5);
  30.         left.setWeight(0.2);
  31.         Split center = getVerticalSplit(CENTER, 0.8, 0.2);
  32.         center.setWeight(0.6);
  33.         Split right = getVerticalSplit(RIGHT, 0.5, 0.5);
  34.         right.setWeight(0.2);
  35.         horizontal.setChildren(left, new Divider(), center, new Divider(), right);
  36.         MultiSplitLayout layout = new MultiSplitLayout(horizontal);
  37.         JXMultiSplitPane splitPane = new JXMultiSplitPane(layout);
  38.         addButton(LEFT + TOP, splitPane);
  39.         addButton(CENTER + TOP, splitPane);
  40.         addButton(RIGHT + TOP, splitPane);
  41.         addButton(LEFT + BOTTOM, splitPane);
  42.         addButton(CENTER + BOTTOM, splitPane);
  43.         addButton(RIGHT + BOTTOM, splitPane);
  44.         frame.add(splitPane);
  45.         frame.setBounds(50, 50, 1024, 768);
  46.         frame.setVisible(true);
  47.     }
  48.  
  49.     protected void addButton(final String buttonName, final JXMultiSplitPane splitPane) {
  50.         final JButton button = new JButton(buttonName);
  51.         splitPane.add(buttonName, button);
  52.         button.addActionListener(new ActionListener() {
  53.  
  54.             @Override
  55.             public void actionPerformed(ActionEvent e) {
  56.                 MultiSplitLayout layout = splitPane.getMultiSplitLayout();
  57.                 Node node = layout.getNodeForName(buttonName);
  58.                 Split parent = node.getParent();
  59.                 parent.hide(node);
  60.                 splitPane.invalidate();
  61.                 splitPane.revalidate();
  62.                 splitPane.repaint();
  63.             }
  64.         });
  65.     }
  66.  
  67.     public Split getVerticalSplit(String name, double topWeight, double bottomWeight) {
  68.         Split split = new Split();
  69.         split.setRowLayout(false);
  70.         Leaf top = new Leaf(name + TOP);
  71.         top.setWeight(topWeight);
  72.         Leaf bottom = new Leaf(name + BOTTOM);
  73.         bottom.setWeight(bottomWeight);
  74.         split.setChildren(top, new Divider(), bottom);
  75.         return split;
  76.     }
  77.  
  78.     public static void main(String[] args) {
  79.         SwingUtilities.invokeLater(new Runnable() {
  80.  
  81.             @Override
  82.             public void run() {
  83.                 new TestMultiSplitPane().initUI();
  84.  
  85.             }
  86.         });
  87.     }
  88.  
  89. }
  90.        
  91. <dependency>
  92.         <groupId>org.swinglabs.swingx</groupId>
  93.         <artifactId>swingx-core</artifactId>
  94.         <version>1.6.3</version>
  95.     </dependency>

No comments:

Post a Comment

LinkWithin

Related Posts Plugin for WordPress, Blogger...

Popular Posts