Forum Stats

  • 3,733,742 Users
  • 2,246,813 Discussions
  • 7,856,862 Comments

Discussions

Hide horizontal and vertical lines in a JTree

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

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);
tree.updateUI();
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?

Thx.

Comments

  • 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)
    paintHorizontalLine(..)
    paintVerticalLine(..)
  • 795537
    795537 Member Posts: 194
    Try with
    tree.putClientProperty("JTree.lineStyle", "None");
    Bye.
  • 843806
    843806 Member Posts: 49,998
    JTree.lineStyle
    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);
        f.getContentPane().add(btn,BorderLayout.SOUTH);
        f.setSize(200,200);
        f.setLocationRelativeTo(null);
        f.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        f.setVisible(true);
        btn.addActionListener(new ActionListener(){
          public void actionPerformed(ActionEvent ae){
            showLines = !showLines;
            tree.repaint();
          }
        });
      }
      public static void main(String[] args)
      {
        SwingUtilities.invokeLater(new Runnable(){
          public void run(){
            try{UIManager.setLookAndFeel("com.sun.java.swing.plaf.windows.WindowsLookAndFeel");}catch(Exception e){}
            new Testing().buildGUI();
          }
        });
      }
    }
This discussion has been closed.