2016-12-03 75 views
0

有在DefaultTreeCellRenderer一种称为setBackgroundSelectionColor(),让你当你选择一个JTree一个项目更改选择的颜色。当我进入DefaultTreeCellRenderer的源代码时,选择颜色在paint()之前设置为getBackgroundSelectionColor()覆盖选择颜色 - JTree的

下面的代码中,我试图通过简单覆盖paint方法来更改选择颜色。问题是,即使在paint方法中手动设置,颜色保持不变。即使在paint中不再使用getBackgroundSelectionColor(),方法setBackgroundSelectionColor()仍然有效。

这是为什么,以及如何正确覆盖颜色?
不使用setBackgroundSelectionColor()

import java.awt.*; 

import javax.swing.*; 
import javax.swing.tree.*; 

@SuppressWarnings("serial") 
public class DirectoryExplorer extends JFrame { 
    private DirectoryExplorer() { 
     super("Directory Explorer"); 
     setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); 
     setLayout(new GridLayout(1, 1)); 
     createPanel(); 
     setSize(800,600); 
     setVisible(true); 
    } 

    private void createPanel() { 
     JPanel panel = new JPanel(new GridLayout(1, 1)); 
     JTree tree = new JTree(); 

     paintRenderer pR = new paintRenderer(); 
     tree.setCellRenderer(pR); 

     //pR.setBackgroundSelectionColor(Color.RED); //Why does this work when changing value in paint doesn't 

     panel.add(new JScrollPane(tree)); 
     getContentPane().add(panel); 
    } 

    public static void main(String[] args) { 
     new DirectoryExplorer(); 
    } 

    private class paintRenderer extends DefaultTreeCellRenderer { 
     @Override 
     public void paint(Graphics g) { 
      Color bColor; 

      if (selected) { 
       bColor = Color.RED;//= getBackgroundSelectionColor(); 
      } else { 
       bColor = getBackgroundNonSelectionColor(); 
       if (bColor == null) { 
        bColor = getBackground(); 
       } 
      } 

      //super.paint(g); //Paints the correct colors but no text 

      int imageOffset = -1; 
      if (bColor != null) { 
       imageOffset = getLabelStart(); 
       g.setColor(bColor); 
       if(getComponentOrientation().isLeftToRight()) { 
        g.fillRect(imageOffset, 0, getWidth() - imageOffset, getHeight()); 
       } else { 
        g.fillRect(0, 0, getWidth() - imageOffset, getHeight()); 
       } 
      } 

      if (hasFocus) { 
       if (imageOffset == -1) { 
        imageOffset = getLabelStart(); 
       } 

       if(getComponentOrientation().isLeftToRight()) { 
        paintFocus(g, imageOffset, 0, getWidth() - imageOffset, getHeight(), bColor); 
       } else { 
        paintFocus(g, 0, 0, getWidth() - imageOffset, getHeight(), bColor); 
       } 
      } 
      super.paint(g); //Paints text but wrong colors 
     } 

     private void paintFocus(Graphics g, int x, int y, int w, int h, Color notColor) { 
      Color bsColor = Color.RED;//= getBorderSelectionColor(); 

      if (bsColor != null && selected) { 
       g.setColor(bsColor); 
       g.drawRect(x, y, w - 1, h - 1); 
      } 
     } 

     private int getLabelStart() { 
      Icon currentI = getIcon(); 
      if(currentI != null && getText() != null) { 
       return currentI.getIconWidth() + Math.max(0, getIconTextGap() - 1); 
      } 
      return 0; 
     } 
    } 
} 

编辑
什么它目前看起来像

enter image description here

+0

这是工作的罚款我猜 - > https://i.stack.imgur.com/Inh6K.png,张贴Screensh。的GUI –

+0

@ΦXocę웃Пepeúpaツ不幸的是,它看起来像我编辑中的照片 – Dan

+0

@ΦXocę웃Пepeúpaツ如果它在JDK 8上使用Windows 10有所作为u112 – Dan

回答

0

的问题是,你要重写的paint(...)代替paintComponent(...)

如在此answer中所述,您不应将paint替换为不是顶层容器的东西,而应该覆盖paintComponent

更改代码看起来像这样。

@Override 
public void paintComponent(Graphics g) { 
... 
super.paintComponent(g); 
} 

例如

import java.awt.*; 

import javax.swing.*; 
import javax.swing.tree.*; 

@SuppressWarnings("serial") 
public class DirectoryExplorer extends JFrame { 
    private DirectoryExplorer() { 
     super("Directory Explorer"); 
     setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); 
     setLayout(new GridLayout(1, 1)); 
     createPanel(); 
     setSize(800,600); 
     setVisible(true); 
    } 

    private void createPanel() { 
     JPanel panel = new JPanel(new GridLayout(1, 1)); 
     JTree tree = new JTree(); 

     paintRenderer pR = new paintRenderer(); 
     tree.setCellRenderer(pR); 

     panel.add(new JScrollPane(tree)); 
     getContentPane().add(panel); 
    } 

    public static void main(String[] args) { 
     EventQueue.invokeLater(() -> new DirectoryExplorer()); 
    } 

    private class paintRenderer extends DefaultTreeCellRenderer { 
     @Override 
     public void paintComponent(Graphics g) { 
      Color bColor; 

      if (selected) { 
       bColor = Color.RED; 
      } else { 
       bColor = getBackgroundNonSelectionColor(); 
       if (bColor == null) { 
        bColor = getBackground(); 
       } 
      } 

      int imageOffset = -1; 
      if (bColor != null) { 
       imageOffset = getLabelStart(); 
       g.setColor(bColor); 
       if(getComponentOrientation().isLeftToRight()) { 
        g.fillRect(imageOffset, 0, getWidth() - imageOffset, getHeight()); 
       } else { 
        g.fillRect(0, 0, getWidth() - imageOffset, getHeight()); 
       } 
      } 

      if (hasFocus) { 
       if (imageOffset == -1) { 
        imageOffset = getLabelStart(); 
       } 

       if(getComponentOrientation().isLeftToRight()) { 
        paintFocus(g, imageOffset, 0, getWidth() - imageOffset, getHeight()); 
       } else { 
        paintFocus(g, 0, 0, getWidth() - imageOffset, getHeight()); 
       } 
      } 
      super.paintComponent(g); 
     } 

     private void paintFocus(Graphics g, int x, int y, int w, int h) { 
      Color bsColor = Color.RED; 

      if (bsColor != null && selected) { 
       g.setColor(bsColor); 
       g.drawRect(x, y, w - 1, h - 1); 
      } 
     } 

     private int getLabelStart() { 
      Icon currentI = getIcon(); 
      if(currentI != null && getText() != null) { 
       return currentI.getIconWidth() + Math.max(0, getIconTextGap() - 1); 
      } 
      return 0; 
     } 
    } 
}