2011-08-14 30 views
12

我正在尝试更改JTabbedPane中选项卡的形状。使用setTabComponentAt(0, someComponent);不会更改选项卡的外观,该选项卡是具有对角左上角的矩形。可以做些什么来改变形状?如何更改JTabbedPane选项卡的形状?

+1

我使用的解决方案是放弃JTabbedPane,而是创建一行JPanels,然后重写其paintComponent方法来创建任何我想要的外观。然后,我添加了鼠标监听器,并编写了一些基本逻辑,使其像JTabbedPane一样起作用,添加翻转等等。它不需要很长时间,并且可以进行完整的创意控制。 –

回答

25

正确的做法是只改变Look and Feel,很好的例子,从Old.Java.Forums.Sun

enter image description here

import java.awt.BorderLayout; 
import javax.swing.JFrame; 
import javax.swing.JPanel; 
import javax.swing.JTabbedPane; 
import javax.swing.JTextArea; 

public class TabbedPane extends JPanel { 

    private static final long serialVersionUID = 1L; 

    public TabbedPane() { 
     setLayout(new BorderLayout()); 
     JPanel jp = new JPanel(); 
     jp.setLayout(new BorderLayout()); 
     JTabbedPane tb = new JTabbedPane(); 
     tb.setUI(new CustomTabbedPaneUI()); 
     tb.add("Tab1", new JTextArea("")); 
     tb.add("Tab2", new JTextArea("")); 
     tb.add("Tab3", new JTextArea("")); 
     tb.add("Tab4", new JTextArea("")); 
     tb.add("Tab5", new JTextArea("")); 
     jp.add(tb, BorderLayout.CENTER); 
     add(jp, BorderLayout.CENTER); 
     tb.setEnabledAt(1, false); 
     tb.setEnabledAt(3, false); 
    } 

    public static void main(String[] args) { 
     JFrame frame = new JFrame(); 
     frame.getContentPane().add(new TabbedPane()); 
     frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); 
     frame.setSize(500, 200); 
     frame.setVisible(true); 
    } 
} 

import java.util.*; 
import java.awt.*; 
import javax.swing.*; 
import javax.swing.plaf.*; 
import javax.swing.plaf.basic.*; 
import javax.swing.text.View; 

public class CustomTabbedPaneUI extends BasicTabbedPaneUI { 

    private Color selectColor; 
    private Color deSelectColor; 
    private int inclTab = 4; 
    private int anchoFocoV = inclTab; 
    private int anchoFocoH = 4; 
    private int anchoCarpetas = 18; 
    private Polygon shape; 

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

    @Override 
    protected void installDefaults() { 
     super.installDefaults(); 
     selectColor = new Color(250, 192, 192); 
     deSelectColor = new Color(197, 193, 168); 
     tabAreaInsets.right = anchoCarpetas; 
    } 

    @Override 
    protected void paintTabArea(Graphics g, int tabPlacement, int selectedIndex) { 
     if (runCount > 1) { 
      int lines[] = new int[runCount]; 
      for (int i = 0; i < runCount; i++) { 
       lines[i] = rects[tabRuns[i]].y + (tabPlacement == TOP ? maxTabHeight : 0); 
      } 
      Arrays.sort(lines); 
      if (tabPlacement == TOP) { 
       int fila = runCount; 
       for (int i = 0; i < lines.length - 1; i++, fila--) { 
        Polygon carp = new Polygon(); 
        carp.addPoint(0, lines[i]); 
        carp.addPoint(tabPane.getWidth() - 2 * fila - 2, lines[i]); 
        carp.addPoint(tabPane.getWidth() - 2 * fila, lines[i] + 3); 
        if (i < lines.length - 2) { 
         carp.addPoint(tabPane.getWidth() - 2 * fila, lines[i + 1]); 
         carp.addPoint(0, lines[i + 1]); 
        } else { 
         carp.addPoint(tabPane.getWidth() - 2 * fila, lines[i] + rects[selectedIndex].height); 
         carp.addPoint(0, lines[i] + rects[selectedIndex].height); 
        } 
        carp.addPoint(0, lines[i]); 
        g.setColor(hazAlfa(fila)); 
        g.fillPolygon(carp); 
        g.setColor(darkShadow.darker()); 
        g.drawPolygon(carp); 
       } 
      } else { 
       int fila = 0; 
       for (int i = 0; i < lines.length - 1; i++, fila++) { 
        Polygon carp = new Polygon(); 
        carp.addPoint(0, lines[i]); 
        carp.addPoint(tabPane.getWidth() - 2 * fila - 1, lines[i]); 
        carp.addPoint(tabPane.getWidth() - 2 * fila - 1, lines[i + 1] - 3); 
        carp.addPoint(tabPane.getWidth() - 2 * fila - 3, lines[i + 1]); 
        carp.addPoint(0, lines[i + 1]); 
        carp.addPoint(0, lines[i]); 
        g.setColor(hazAlfa(fila + 2)); 
        g.fillPolygon(carp); 
        g.setColor(darkShadow.darker()); 
        g.drawPolygon(carp); 
       } 
      } 
     } 
     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; 
     GradientPaint gradientShadow; 
     int xp[] = null; // Para la forma 
     int yp[] = null; 
     switch (tabPlacement) { 
      case LEFT: 
       xp = new int[]{x, x, x + w, x + w, x}; 
       yp = new int[]{y, y + h - 3, y + h - 3, y, y}; 
       gradientShadow = new GradientPaint(x, y, new Color(100, 100, 255), x, y + h, Color.ORANGE); 
       break; 
      case RIGHT: 
       xp = new int[]{x, x, x + w - 2, x + w - 2, x}; 
       yp = new int[]{y, y + h - 3, y + h - 3, y, y}; 
       gradientShadow = new GradientPaint(x, y, new Color(100, 100, 255), x, y + h, new Color(153, 186, 243)); 
       break; 
      case BOTTOM: 
       xp = new int[]{x, x, x + 3, x + w - inclTab - 6, x + w - inclTab - 2, x + w - inclTab, x + w - 3, x}; 
       yp = new int[]{y, y + h - 3, y + h, y + h, y + h - 1, y + h - 3, y, y}; 
       gradientShadow = new GradientPaint(x, y, new Color(100, 100, 255), x, y + h, Color.BLUE); 
       break; 
      case TOP: 
      default: 
       xp = new int[]{x, x, x + 3, x + w - inclTab - 6, x + w - inclTab - 2, x + w - inclTab, x + w - inclTab, x}; 
       yp = new int[]{y + h, y + 3, y, y, y + 1, y + 3, y + h, y + h}; 
       gradientShadow = new GradientPaint(0, 0, Color.ORANGE, 0, y + h/2, new Color(240, 255, 210)); 
       break; 
     } 
     // ; 
     shape = new Polygon(xp, yp, xp.length); 
     if (isSelected) { 
      g2D.setColor(selectColor); 
      g2D.setPaint(gradientShadow); 
     } else { 
      if (tabPane.isEnabled() && tabPane.isEnabledAt(tabIndex)) { 
       g2D.setColor(deSelectColor); 
       GradientPaint gradientShadowTmp = new GradientPaint(0, 0, new Color(255, 255, 200), 0, y + h/2, new Color(240, 255, 210)); 
       g2D.setPaint(gradientShadowTmp); 
      } else { 
       GradientPaint gradientShadowTmp = new GradientPaint(0, 0, new Color(240, 255, 210), 0, y + 15 + h/2, new Color(204, 204, 204)); 
       g2D.setPaint(gradientShadowTmp); 
      } 
     } 
     //selectColor = new Color(255, 255, 200); 
     //deSelectColor = new Color(240, 255, 210); 
     g2D.fill(shape); 
     if (runCount > 1) { 
      g2D.setColor(hazAlfa(getRunForTab(tabPane.getTabCount(), tabIndex) - 1)); 
      g2D.fill(shape); 
     } 
     g2D.fill(shape); 
    } 

    @Override 
    protected void paintText(Graphics g, int tabPlacement, Font font, FontMetrics metrics, int tabIndex, String title, Rectangle textRect, boolean isSelected) { 
     super.paintText(g, tabPlacement, font, metrics, tabIndex, title, textRect, isSelected); 
     g.setFont(font); 
     View v = getTextViewForTab(tabIndex); 
     if (v != null) { 
      // html 
      v.paint(g, textRect); 
     } else { 
      // plain text 
      int mnemIndex = tabPane.getDisplayedMnemonicIndexAt(tabIndex); 
      if (tabPane.isEnabled() && tabPane.isEnabledAt(tabIndex)) { 
       g.setColor(tabPane.getForegroundAt(tabIndex)); 
       BasicGraphicsUtils.drawStringUnderlineCharAt(g, title, mnemIndex, textRect.x, textRect.y + metrics.getAscent()); 
      } else { // tab disabled 
       g.setColor(Color.BLACK); 
       BasicGraphicsUtils.drawStringUnderlineCharAt(g, title, mnemIndex, textRect.x, textRect.y + metrics.getAscent()); 
       g.setColor(tabPane.getBackgroundAt(tabIndex).darker()); 
       BasicGraphicsUtils.drawStringUnderlineCharAt(g, title, mnemIndex, textRect.x - 1, textRect.y + metrics.getAscent() - 1); 
      } 
     } 
    } 
    /*protected void paintText(Graphics g, int tabPlacement, Font font, FontMetrics metrics, int tabIndex, String title, Rectangle textRect, boolean isSelected) { 
    g.setFont(font); 
    View v = getTextViewForTab(tabIndex); 
    if (v != null) { 
    // html 
    v.paint(g, textRect); 
    } else { 
    // plain text 
    int mnemIndex = tabPane.getDisplayedMnemonicIndexAt(tabIndex); 

    if (tabPane.isEnabled() && tabPane.isEnabledAt(tabIndex)) { 
    Color fg = tabPane.getForegroundAt(tabIndex); 
    if (isSelected && (fg instanceof UIResource)) { 
    Color selectedFG = UIManager.getColor("TabbedPane.selectedForeground"); 
    if (selectedFG != null) { 
    fg = selectedFG; 
    } 
    } 
    g.setColor(fg); 
    SwingUtilities2.drawStringUnderlineCharAt(tabPane, g, title, mnemIndex, textRect.x, textRect.y + metrics.getAscent()); 

    } else { // tab disabled 
    //PAY ATTENTION TO HERE 
    g.setColor(tabPane.getBackgroundAt(tabIndex).brighter()); 
    SwingUtilities2.drawStringUnderlineCharAt(tabPane, g, title, mnemIndex, textRect.x, textRect.y + metrics.getAscent()); 
    g.setColor(tabPane.getBackgroundAt(tabIndex).darker()); 
    SwingUtilities2.drawStringUnderlineCharAt(tabPane, g, title, mnemIndex, 
    textRect.x - 1, textRect.y + metrics.getAscent() - 1); 
    } 
    } 
    }*/ 

    @Override 
    protected int calculateTabWidth(int tabPlacement, int tabIndex, FontMetrics metrics) { 
     return 20 + inclTab + super.calculateTabWidth(tabPlacement, tabIndex, metrics); 
    } 

    @Override 
    protected int calculateTabHeight(int tabPlacement, int tabIndex, int fontHeight) { 
     if (tabPlacement == LEFT || tabPlacement == RIGHT) { 
      return super.calculateTabHeight(tabPlacement, tabIndex, fontHeight); 
     } else { 
      return anchoFocoH + super.calculateTabHeight(tabPlacement, tabIndex, fontHeight); 
     } 
    } 

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

    @Override 
    protected void paintFocusIndicator(Graphics g, int tabPlacement, Rectangle[] rects, int tabIndex, Rectangle iconRect, Rectangle textRect, boolean isSelected) { 
     if (tabPane.hasFocus() && isSelected) { 
      g.setColor(UIManager.getColor("ScrollBar.thumbShadow")); 
      g.drawPolygon(shape); 
     } 
    } 

    protected Color hazAlfa(int fila) { 
     int alfa = 0; 
     if (fila >= 0) { 
      alfa = 50 + (fila > 7 ? 70 : 10 * fila); 
     } 
     return new Color(0, 0, 0, alfa); 
    } 
} 
+0

摇滚明星程序员 –

+2

@farm鸵鸟说实话这不完全是真实的,我们周围是超过12人,我只是靠着阅读他们的帖子 – mKorbel

+1

@mKorbel - 我不同意。 +1 – MByD

6

该形状由选项卡窗格的UI代表支持,该代表从TabbedPaneUI下降。 MetalTabbedPaneUI子类是example,它可以帮助您确定要替换代理的程度。

+1

对我来说正确的答案,请看我的帖子一切皆有可能,但易碎和我认为L&F敏感+1 – mKorbel

1

你可以把HTML标记addTab方法的第一个参数如下:

MyJTabbedPane.addTab("<html><h1 style='padding:20px;'>TEST</h1></html>", new JPanel());

相关问题