Forum Stats

  • 3,732,979 Users
  • 2,246,664 Discussions


Hide horizontal and vertical lines in a JTree

843806 Member Posts: 49,998
edited October 2007 in Swing

suppose we have three JTrees in a Windows L&F where the second one shall not show any vertical or horizontal lines for a node. If this restriction would be true for all three JTrees one could invoke
UIManager.put("Tree.paintLines", Boolean.FALSE)

However only the second one must not show any lines. I tried something like
tree.putClientProperty("Tree.paintLines", Boolean.FALSE);
But unfortunately this does not work as the lines are still shown. Furthermore we need to set "on/off" the lines dynamically dependend on the user data.

Does anyone have a clue to solve this problem?



  • camickr
    camickr Member Posts: 24,931
    -> Does anyone have a clue to solve this problem?

    Take a look at the source code to see what that particular property does. Then maybe you will be able to override the UI to provide an on/off switch at a table level somehow.
  • 794342
    794342 Member Posts: 6,422
    set your own UI, overriding these (to do nothing)
  • 795537
    795537 Member Posts: 194
    Try with
    tree.putClientProperty("JTree.lineStyle", "None");
  • 843806
    843806 Member Posts: 49,998
    only works on metal l&f.

    To override the UI should work but it is very ugly to set the ui each time the user changed the data. Beside this imagine your code will be excuted on a windows, linux and mac os.

    Do I really have to create my own UI for each l&f just to hide the lines for a node? Is there no other way?
  • 794342
    794342 Member Posts: 6,422
    only tested on windows, but this seems simple enough
    import java.awt.*;
    import java.awt.event.*;
    import javax.swing.*;
    import javax.swing.tree.*;
    class Testing
      boolean showLines = false;
      public void buildGUI()
        JButton btn = new JButton("Show/Hide Lines");
        final JTree tree = new JTree();
        tree.setUI(new javax.swing.plaf.basic.BasicTreeUI(){
          protected void paintHorizontalLine(Graphics g,JComponent c,int y,int left,int right){
            if(showLines) super.paintHorizontalLine(g,c,y,left,right);
          protected void paintVerticalLine(Graphics g,JComponent c,int x,int top,int bottom){
            if(showLines) super.paintVerticalLine(g,c,x,top,bottom);
        JFrame f = new JFrame();
        f.getContentPane().add(new JScrollPane(tree),BorderLayout.CENTER);
        btn.addActionListener(new ActionListener(){
          public void actionPerformed(ActionEvent ae){
            showLines = !showLines;
      public static void main(String[] args)
        SwingUtilities.invokeLater(new Runnable(){
          public void run(){
            try{UIManager.setLookAndFeel("");}catch(Exception e){}
            new Testing().buildGUI();
This discussion has been closed.