2010-04-14 53 views
4

我想重写java外观。我只是想按不同的方式显示按钮。
我希望Windows外观和感觉的所有功能,但只有不同的按钮。我希望你明白我的观点。忽略默认外观和感觉Java

Color color = new Color(220, 220, 220, 200); 
     UIManager.put("OptionPane.background", color); 
     UIManager.put("Panel.background", color); 
     UIManager.put("Button.foreground", new Color(255, 255, 255, 255));  
     List<Object> gradients = new ArrayList<Object>(5); 
     gradients.add(0.00f); 
     gradients.add(0.00f); 
     gradients.add(new Color(0xC1C1C1)); 
     gradients.add(new Color(0xFFFFFF)); 
     gradients.add(new Color(0x5C5D5C)); 
     UIManager.put("Button.gradient", gradients); 
     UIManager.put("Button.highlight",Color.RED);    

     UIManager.setLookAndFeel(com.sun.java.swing.plaf.windows.WindowsLookAndFeel); 

还告诉ME 如何使JTabbedPane中呈圆形???

回答

2

自定义GUI类把

package com.ibm.gui; 
/** 
*Auhor az 
**/ 

import javax.swing.*; 
import javax.swing.plaf.ComponentUI; 
import javax.swing.plaf.basic.BasicTabbedPaneUI; 
import java.awt.*; 
import java.awt.event.MouseEvent; 
import java.awt.event.MouseListener; 
import java.awt.event.MouseMotionListener; 

public class AizCustomGUI extends BasicTabbedPaneUI { 

    private static final Insets NO_INSETS = new Insets(0, 0, 0, 0); 
    private ColorSet selectedColorSet; 
    private ColorSet defaultColorSet; 
    private ColorSet hoverColorSet; 
    private boolean contentTopBorderDrawn = true; 
    private Color lineColor = new Color(158, 158, 158); 
    private Color dividerColor = new Color(200, 200, 200); 
    private Insets contentInsets = new Insets(10, 10, 10, 10); 
    private int lastRollOverTab = -1; 

    public static ComponentUI createUI(JComponent c) { 
     return new AizCustomGUI(); 
    } 

    public AizCustomGUI() { 

     selectedColorSet = new ColorSet(); 


     selectedColorSet.topGradColor1 = new Color(198, 198, 197); 
     selectedColorSet.topGradColor2 = Color.WHITE; 




     selectedColorSet.bottomGradColor1 = Color.WHITE; 
     selectedColorSet.bottomGradColor2 = Color.WHITE; 

     defaultColorSet = new ColorSet(); 


     defaultColorSet.topGradColor1 = Color.WHITE; 
     defaultColorSet.topGradColor2 = Color.WHITE; 

     defaultColorSet.bottomGradColor1 = Color.WHITE; 
     defaultColorSet.bottomGradColor2 = new Color(198, 198, 197); 


     hoverColorSet = new ColorSet(); 
     hoverColorSet.topGradColor1 = new Color(244, 244, 244); 
     hoverColorSet.topGradColor2 = new Color(223, 223, 223); 

     hoverColorSet.bottomGradColor1 = new Color(211, 211, 211); 
     hoverColorSet.bottomGradColor2 = new Color(235, 235, 235); 

     maxTabHeight = 20; 

     setContentInsets(0); 
    } 

    public void setContentTopBorderDrawn(boolean b) { 
     contentTopBorderDrawn = b; 
    } 

    public void setContentInsets(Insets i) { 
     contentInsets = i; 
    } 

    public void setContentInsets(int i) { 
     contentInsets = new Insets(i, i, i, i); 
    } 

    public int getTabRunCount(JTabbedPane pane) { 
     return 1; 
    } 

    @Override 
    protected void installDefaults() { 
     super.installDefaults(); 

     RollOverListener l = new RollOverListener(); 
     tabPane.addMouseListener(l); 
     tabPane.addMouseMotionListener(l); 

     tabAreaInsets = NO_INSETS; 
     tabInsets = new Insets(0, 0, 0, 0); 
    } 

    protected boolean scrollableTabLayoutEnabled() { 
     return false; 
    } 

    @Override 
    protected Insets getContentBorderInsets(int tabPlacement) { 
     return contentInsets; 
    } 

    @Override 
    protected int calculateTabHeight(int tabPlacement, int tabIndex, 
      int fontHeight) { 
     return super.calculateTabHeight(tabPlacement, tabIndex, fontHeight); 
     // return 21; 
    } 

    @Override 
    protected int calculateTabWidth(int tabPlacement, int tabIndex, 
      FontMetrics metrics) { 
     int w = super.calculateTabWidth(tabPlacement, tabIndex, metrics); 
     int wid = metrics.charWidth('M'); 
     w += wid * 2; 
     return w; 
    } 

    @Override 
    protected int calculateMaxTabHeight(int tabPlacement) { 
     return super.calculateMaxTabHeight(tabPlacement); 
     //return 21; 
    } 

    @Override 
    protected void paintTabArea(Graphics g, int tabPlacement, int selectedIndex) { 

     g.setColor(Color.WHITE); 

     g.fillRoundRect(0, 0, tabPane.getWidth(), tabPane.getHeight(), 10, 10); 
     super.paintTabArea(g, tabPlacement, selectedIndex); 
    } 

    @Override 
    protected void paintTabBackground(Graphics g, int tabPlacement, 
      int tabIndex, int x, int y, int w, int h, boolean isSelected) { 
     Graphics2D g2d = (Graphics2D) g; 
     ColorSet colorSet; 

     Rectangle rect = rects[tabIndex];  

     if (isSelected) { 
      colorSet = selectedColorSet; 
     } else if (getRolloverTab() == tabIndex) { 
      //colorSet = hoverColorSet; 
      colorSet = selectedColorSet; 
     } else { 
      colorSet = defaultColorSet; 
     } 

     g2d.setRenderingHint(RenderingHints.KEY_ANTIALIASING, 
       RenderingHints.VALUE_ANTIALIAS_ON); 

     int width = rect.width; 
     int xpos = rect.x; 
     if (tabIndex > 0) { 
      width--; 
      xpos++; 
     } 

     g2d.setPaint(new GradientPaint(xpos, 0, colorSet.topGradColor1, xpos, 
       10, colorSet.topGradColor2)); 

     g2d.fillRoundRect(xpos, 0, width, 10, 10, 10); 

     g2d.setPaint(new GradientPaint(0, 10, colorSet.bottomGradColor1, 0, 21, 
       colorSet.bottomGradColor2)); 

     g2d.fillRoundRect(xpos, 10, width, 11, 10, 10); 

     if (contentTopBorderDrawn) { 
      g2d.setColor(lineColor); 
      g2d.drawLine(rect.x, 20, rect.x + rect.width - 1, 20); 
     } 
    } 

    @Override 
    protected void paintTabBorder(Graphics g, int tabPlacement, int tabIndex, 
      int x, int y, int w, int h, boolean isSelected) { 

     g.setColor(dividerColor); 


     g.drawRoundRect(x, y, w, tabPane.getHeight(), 10, 10); 



    } 

    @Override 
    protected void paintContentBorderTopEdge(Graphics g, int tabPlacement, 
      int selectedIndex, int x, int y, int w, int h) { 
    } 

    @Override 
    protected void paintContentBorderRightEdge(Graphics g, int tabPlacement, 
      int selectedIndex, int x, int y, int w, int h) { 
     // Do nothing 
    } 

    @Override 
    protected void paintContentBorderLeftEdge(Graphics g, int tabPlacement, 
      int selectedIndex, int x, int y, int w, int h) { 
     // Do nothing 
    } 

    @Override 
    protected void paintContentBorderBottomEdge(Graphics g, int tabPlacement, 
      int selectedIndex, int x, int y, int w, int h) { 
     // Do nothing 
    } 

    @Override 
    protected void paintFocusIndicator(Graphics g, int tabPlacement, 
      Rectangle[] rects, int tabIndex, Rectangle iconRect, 
      Rectangle textRect, boolean isSelected) { 
     // Do nothing 
    } 

    @Override 
    protected int getTabLabelShiftY(int tabPlacement, int tabIndex, 
      boolean isSelected) { 
     return 0; 
    } 

    private class ColorSet { 

     Color topGradColor1; 
     Color topGradColor2; 
     Color bottomGradColor1; 
     Color bottomGradColor2; 
    } 

    private class RollOverListener implements MouseMotionListener, 
      MouseListener { 

     public void mouseDragged(MouseEvent e) { 
     } 

     public void mouseMoved(MouseEvent e) { 
      checkRollOver(); 
     } 

     public void mouseClicked(MouseEvent e) { 
     } 

     public void mousePressed(MouseEvent e) { 
     } 

     public void mouseReleased(MouseEvent e) { 
     } 

     public void mouseEntered(MouseEvent e) { 
      checkRollOver(); 
     } 

     public void mouseExited(MouseEvent e) { 
      tabPane.repaint(); 
     } 

     private void checkRollOver() { 
      int currentRollOver = getRolloverTab(); 
      if (currentRollOver != lastRollOverTab) { 
       lastRollOverTab = currentRollOver; 

       Rectangle tabsRect = new Rectangle(0, 0, tabPane.getWidth(), tabPane.getHeight()); 
       tabPane.repaint(tabsRect); 

      } 
     } 
    } 
} 

打电话给你的自定义GUI类

import java.awt.Color; 
import javax.swing.BorderFactory; 
import javax.swing.JButton; 
import javax.swing.JFrame; 
import javax.swing.JPanel; 
import javax.swing.JTabbedPane; 
import javax.swing.UIManager; 

public class TestPSTabbedPaneUI 
{ 
    public static void main(String[] args) 
    { 
     try 
     { 
      UIManager.setLookAndFeel("com.sun.java.swing.plaf.windows.WindowsLookAndFeel"); 
     } 
     catch (Exception exc) 
     { 
      exc.printStackTrace(); 
     } 

     JFrame vFrame = new JFrame(); 
     vFrame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); 
     vFrame.setSize(200, 200); 
     JTabbedPane vTab = new JTabbedPane(); 
       vTab.setUI(new AizCustomGUI()); 

     vTab.add("One", new JPanel()); 

     JPanel vPanel2 = new JPanel(); 
     vPanel2.setBorder(BorderFactory.createLineBorder(Color.BLACK,2)); 
     vTab.add("Two", vPanel2); 

     vTab.add("Three", new JButton("three")); 

     vFrame.getContentPane().add(vTab); 
     vFrame.setTitle("Tabs Example"); 
     vFrame.show(); 
    } 
} 
4

好吧,如果你更新LNF的信息之前,应用Windows LNF,你有没有机会让他们在考虑采取:-)

我建议你通过反向首先加载Windows LNF你的代码,然后只更新按钮看。 但要小心,通过这样做,你将改变所有按钮的外观,而不仅仅是你的。

+0

它没有任何效果先生,但如果我删除加载LnF,那么它工作正常 – 2010-04-14 12:34:46

+0

也许是由于Windows LnF可能不会使用这些属性... – Riduidel 2010-04-14 12:45:16

+1

它肯定使用这些属性,因为当您应用LnF那么这些组件显示不同 – 2010-04-14 12:50:23

1

你总是能继承WindowsLookAndFeel,并覆盖初始化(),initClassDefaults(),initComponentDefaults( )和initSystemColorDefaults()来做你认为合适的事情。