2016-11-21 123 views
4

我正在编写一个自定义主题,它是NimbusLookAndFeel的扩展。 我要重新设计表格的主题一样更改JTable非内容背景颜色

enter image description here

表主题代码

import java.awt.BasicStroke; 
import java.awt.Color; 
import java.awt.Dimension; 
import java.awt.Font; 
import java.awt.GradientPaint; 
import java.awt.Graphics2D; 
import java.awt.Insets; 
import java.awt.RenderingHints; 
import java.awt.geom.RoundRectangle2D; 

import javax.swing.Painter; 

import infotrax.nimbus.NimbusBaseUI; 

public class TableTheme { 

    protected int strokeSize = 2; // changed to 2 from 1 to fill the gap in corners 
    protected Color shadowColor = new Color(128, 128, 128, 140); 
    protected boolean shady = true; 
    protected boolean highQuality = false; 
    /** Double values for Horizontal and Vertical radius of corner arcs */ 
    protected Dimension arcs = new Dimension(10, 10); 
    /** Distance between shadow border and opaque panel border */ 
    protected int shadowGap = 1; 
    /** The offset of shadow. */ 
    protected int shadowOffset = 1; // width of the shadow 
    /** The transparency value of shadow. (0 - 255) */ 
    protected int shadowAlpha = 130; 

    public TableTheme(NimbusBaseUI nimbusUI) { 

     Insets ins = new Insets(2,2,2,2); 
     nimbusUI.getDefaults().put("Table.contentMargins",ins 
       ); 


     nimbusUI.getDefaults().put("Table.background", 
       new Color(255, 255, 255)); // Modified to set background color of table to be white 01/08/2016 




     nimbusUI.getDefaults().put(
       "Table.borderPainter", 
       new TableBorderPaintGradient(new Color(255, 255, 255), new Color(255, 
         255, 255))); 

     nimbusUI.getDefaults().put(
       "Table[Enabled].borderPainter", 
       new TableBorderPaintGradient(new Color(255, 255, 255), new Color(255, 
         255, 255))); 

     nimbusUI.getDefaults().put(
       "Table[Enabled+Selected].borderPainter", 
       new TableBorderPaintGradient(new Color(255, 255, 255), new Color(255, 
         255, 255))); 

     nimbusUI.getDefaults().put(
       "Table[Selected].borderPainter", 
       new TableBorderPaintGradient(new Color(255, 255, 255), new Color(255, 
         255, 255))); 

     nimbusUI.getDefaults().put(
       "Table[Focused].borderPainter", 
       new TableBorderPaintGradient(new Color(255, 255, 255), new Color(255, 
         255, 255))); 

     nimbusUI.getDefaults().put(
       "Table[Disabled].borderPainter", 
       new TableBorderPaintGradient(new Color(255, 255, 255), new Color(255, 
         255, 255))); 

     nimbusUI.getDefaults().put("TableHeader.font", 
       new Font("Myriad Pro Light", Font.BOLD, 13)); 
     // Table Header color 
     nimbusUI.getDefaults() 
       .put("TableHeader:\"TableHeader.renderer\"[MouseOver].backgroundPainter", 
         new TableheaderPainter(new Color(188,188,188), 
           new Color(188,188,188))); 
     nimbusUI.getDefaults() 
       .put("TableHeader:\"TableHeader.renderer\"[Enabled].backgroundPainter", 
         new TableheaderPainter(new Color(188,188,188), 
           new Color(188,188,188))); 

    } 

    public class TableheaderPainter implements Painter { 

     private static final long serialVersionUID = 1L; 
     private Color light, dark; 
     private GradientPaint gradPaint; 

     public TableheaderPainter(Color light, Color dark) { 
      this.light = light; 
      this.dark = dark; 
     } 

     @Override 
     public void paint(Graphics2D paramGraphics2D, Object paramT, 
       int paramInt1, int paramInt2) { 
      paramGraphics2D.setRenderingHint(RenderingHints.KEY_ANTIALIASING, 
        RenderingHints.VALUE_ANTIALIAS_ON); 
      gradPaint = new GradientPaint((paramInt1/2.0f), 0, light, 
        (paramInt1/2.0f), (paramInt2/2.0f), dark, true); 
      paramGraphics2D.setPaint(gradPaint); 
      paramGraphics2D.fillRoundRect(0, 0, (paramInt1 - 0), 
        (paramInt2 - 0), 0, 0); 

     } 
    } 



    public class Tablebackground_Painter implements Painter { 

     private Color light, dark; 
     private GradientPaint gradPaint; 
     int shadowGap = 2; 

     public Tablebackground_Painter(Color light, Color dark) { 
      this.light = light; 
      this.dark = dark; 
     } 

     @Override 
     public void paint(Graphics2D g, Object c, int w, int h) { 

      Color shadowColorA = new Color(shadowColor.getRed(), 
        shadowColor.getGreen(), shadowColor.getBlue(), shadowAlpha); 
      if (highQuality) { 
       g.setRenderingHint(RenderingHints.KEY_ANTIALIASING, 
         RenderingHints.VALUE_ANTIALIAS_ON); 
      } 
      if (shady) { 
       g.setColor(shadowColorA); 
       g.fillRoundRect(shadowOffset,// X position 
         shadowOffset,// Y position 
         w - strokeSize - shadowOffset, // width 
         h - strokeSize - shadowOffset, // height 
         arcs.width, arcs.height);// arc Dimension 
      } else { 
       shadowGap = 1; 
      } 
      gradPaint = new GradientPaint((w/2.0f), 0, new Color(255, 255, 
        255), (w/2.0f), (h/2.0f), new Color(255, 255, 255), 
        false); 
      g.setPaint(gradPaint); 

      g.fillRoundRect(0, 0, w - shadowGap, h - shadowGap, arcs.width, 
        arcs.height); 
      g.setColor(Color.GREEN); 
      g.setStroke(new BasicStroke(strokeSize)); 
      g.drawRoundRect(0, 0, w - shadowGap, h - shadowGap, arcs.width, 
        arcs.height); 
      g.setStroke(new BasicStroke()); 

     } 
    } 

    public class TableBorderPainter implements Painter { 
     private Color light, dark; 
     private GradientPaint gradPaint; 

     public TableBorderPainter(Color light, Color dark) { 
      this.light = light; 
      this.dark = dark; 
     } 

     @Override 
     public void paint(Graphics2D g, Object c, int w, int h) { 
      g.setRenderingHint(RenderingHints.KEY_ANTIALIASING, 
        RenderingHints.VALUE_ANTIALIAS_ON); 
      gradPaint = new GradientPaint((w/2.0f), 0, new Color(255, 255, 
        255), (w/2.0f), (h/2.0f), new Color(255, 255, 255), true); // making background of border paint to white to match the list background 
      g.setPaint(gradPaint); 
      g.fillRoundRect(0, 0, (w - 0), (h - 0), 10, 10); 
      RoundRectangle2D roundedRectangle = new RoundRectangle2D.Float(0, 
        0, w - 1, h - 1, 10, 10); 
      g.setColor(Color.RED); // here we are making red border color for list 
      g.draw(roundedRectangle); 
     } 

    } 


    public class TableBorderPaintGradient implements Painter { 

     private Color light, dark; 
     private GradientPaint gradPaint; 
     protected int strokeSize = 1; 
     protected Color shadowColor = new Color(128, 128, 128, 140); 
     /** Sets if it drops shadow */ 
     protected boolean shady = true; 
     /** Sets if it has an High Quality view */ 
     protected boolean highQuality = false; 
     /** Double values for Horizontal and Vertical radius of corner arcs */ 
     protected Dimension arcs = new Dimension(10, 10); 
     /** Distance between shadow border and opaque panel border */ 
     protected int shadowGap = 1; 
     /** The offset of shadow. */ 
     protected int shadowOffset = 1; // width of the shadow 
     /** The transparency value of shadow. (0 - 255) */ 
     protected int shadowAlpha = 130; 

     public TableBorderPaintGradient(Color light, Color dark) { 
      this.light = light; 
      this.dark = dark; 
     } 

     @Override 
     public void paint(Graphics2D g, Object object, int w, int h) { 

      Color shadowColorA = new Color(shadowColor.getRed(), 
        shadowColor.getGreen(), shadowColor.getBlue(), shadowAlpha); 
      if (highQuality) { 
       g.setRenderingHint(RenderingHints.KEY_ANTIALIASING, 
         RenderingHints.VALUE_ANTIALIAS_ON); 
      } 
      if (shady) { 
       g.setColor(shadowColorA); 
       g.drawRoundRect(0, 0, w - shadowGap, h - shadowGap, arcs.width, 
         arcs.height); 
      } else { 
       shadowGap = 1; 
      } 
      gradPaint = new GradientPaint(0, 0, light, 0, h * .5f, dark, false); 
      g.setPaint(gradPaint); 
      g.drawRoundRect(shadowOffset,// X position 
        shadowOffset,// Y position 
        w - strokeSize - shadowOffset, // width 
        h - strokeSize - shadowOffset, // height 
        arcs.width, arcs.height);// arc Dimension 
      g.setColor(new Color(166,166,166)); 
      g.setStroke(new BasicStroke(strokeSize)); 
      g.drawRoundRect(shadowOffset,// X position 
        shadowOffset,// Y position 
        w - strokeSize - shadowOffset, // width 
        h - strokeSize - shadowOffset, // height 
        arcs.width, arcs.height);// arc Dimension 
      /* Changed to fillRoundedRect to drawRoundRect as per veryant suggestion */ 
      g.setStroke(new BasicStroke()); 

     } 

    } 


} 

,并延长NimbusLookAndFeel并设置为默认为我的所有组件适用于Java的NimbusBaseUI

import javax.swing.UIManager; 
import javax.swing.plaf.nimbus.NimbusLookAndFeel; 
public class NimbusBaseUI extends NimbusLookAndFeel { 
    public NimbusBaseUI() { 
     super(); // Initialisation and installating 
     try { 
      new TableTheme(this); 
      UIManager.setLookAndFeel(this); 
     } catch (Exception e) { 
      e.printStackTrace(); 
     } 
    } 

    @Override 
    public void initialize() { 
     // TODO Auto-generated method stub 
     super.initialize(); 
    } 

} 

Mainclass看起来像这样

import java.awt.FlowLayout; 

import javax.swing.JFrame; 
import javax.swing.JScrollPane; 
import javax.swing.JTable; 
import javax.swing.JTextField; 
import javax.swing.UIManager; 

class NimbusBaseDemo extends JFrame { 
    /** 
    * 
    */ 
    private static final long serialVersionUID = 1L; 
    JTextField jtxt, txtDisEnabled; 
    int i; 

    private UIManager.LookAndFeelInfo[] lafs; 

    public NimbusBaseDemo() { 
     try { 

      // Set nimbus look and feel. nimbusBase works only for it. 
      new NimbusBaseUI(); 

     } catch (Exception e) { 
      e.printStackTrace(); 
     } 

     setTitle("Nimbus Base Demo"); 
     setSize(400, 400); 
     setLayout(new FlowLayout()); 
     setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); 
     setVisible(true); 
     String columnNames[] = { "Column 1", "Column 2", "Column 3" ,"Column 4"}; 
      String dataValues[][] = { { "12", "234", "67", " " }, 
      { "-123", "43", "853", "" }, { "93", "89.2", "109",""}, 
      { "279", "9033", "3092",""} }; 

     JTable table1 = new JTable(dataValues, columnNames); 
     JScrollPane scrollPane = new JScrollPane(table1); 
     add(scrollPane); 



    } 

    public static void main(String args[]) { 

     new NimbusBaseDemo(); 
    } 
} 

最后我得到结果作为

enter image description here

但我不能变化的JTable的研究背景(非内容区域)至白色...

请建议。

+0

这是因为有一个参数使用“内容区”的全部空间。这应该是'table.setFillsViewportHeight(true);' – AxelH

+0

由于我正在开发唯一的自定义我没有访问表的主题。这是一个完全不同的项目。可以从主题 – Kathi

+0

改变它你能告诉使用你如何使用这个主题,这可能有助于看到的可能性,因为你告诉我们在评论(见我的答案),这是一个Cobol GUI。 – AxelH

回答

4

处理行使用JTable组件的全空间,你需要设置setFillsViewportHeight参数:

table.setFillsViewportHeight(true); 

这个白色区域将延伸到表的底部。

这里是doc说:

设置此表是否始终大到足以填充封闭视口的高度。如果表格的首选高度小于视口,则表格将被拉伸以填充视口。换句话说,这可以确保表格永远不会小于视口。此属性的默认值为false。

没有这个,它只是JScrollPane是可见的(或JTable插入的组件),所以它是需要更新的背景。

PS:这里不是一个真正的主题问题,因为这是JTable仅使用所需空间的预期行为,除非您告诉它使用整个空间。

+0

@AxeIH是的,我同意,它是Java中的最佳解决方案。但在我的情况下事情很复杂。我正在为内部加载我的主题的Cobol应用程序编写此主题。不幸的是,我没有在Cobol中找到与setFillsViewportHeight()方法等价的方法。 – Kathi

+0

有没有办法将这个从主题中应用?因为我的主题类没有表格对象 – Kathi

+0

@Kathi这个问题明确地讲述了Java,你没有提到关于Cobol的任何信息,以及它与你的问题之间的关系。 –