首页 > 解决方案 > 如何自定义 java tabpane 的选项卡?

问题描述

我试图将标签形状更改为我拥有的图像,但它只是添加了一个图像。

我想在这张图片中写信,但我不知道该怎么做..

这是当你执行我的代码时出现的屏幕。

在此处输入图像描述

这就是我想要的代码屏幕。

在此处输入图像描述

这是我的核心代码。谢谢你。

import java.awt.*;
import java.util.ArrayList;
import javax.swing.*;
import img.imageSetSize;

public class tabPane extends JFrame {
    Container c = getContentPane();
    public tabPane() {
        imageSetSize s = new imageSetSize();
        setTitle("Kiosk");
        setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        c.setLayout(new BorderLayout()); 
        
        JPanel panelW = new JPanel();
        panelW.setLayout(new GridLayout(1, 5, 5, 5));
        panelW.setBackground(Color.WHITE);
        ImageIcon normalMenuIcon = new ImageIcon("images/UI/normalMenu.png");
        normalMenuIcon = s.setSize(normalMenuIcon, 80, 80);
        JTabbedPane menuTab = new JTabbedPane(JTabbedPane.LEFT);
        menuTab.addTab("", normalMenuIcon, new ItemPanel1()); 
        menuTab.addTab("", normalMenuIcon, new ItemPanel1()); 
        menuTab.addTab("", normalMenuIcon, new ItemPanel1());
        menuTab.addTab("", normalMenuIcon, new ItemPanel1()); 
        menuTab.addTab("", normalMenuIcon, new ItemPanel1()); 
        menuTab.setBackground(null);
        panelW.add(menuTab);

        c.add(panelW, BorderLayout.WEST);
        c.setBackground(Color.WHITE);
        setSize(450, 740);
        setVisible(true);
        setResizable(true);
    }
    
    public class imageSetSize {
        public ImageIcon setSize(ImageIcon icon, int x, int y) {
            Image img = icon.getImage(); 
            Image imgScale = img.getScaledInstance(x, y, java.awt.Image.SCALE_SMOOTH);
            ImageIcon imgScaled = new ImageIcon(imgScale);
            return imgScaled;
        }
    }
    
    class ItemPanel1 extends JPanel {   //implement later
        public ItemPanel1() {
            this.setBackground(Color.white);
            this.setLayout(new GridLayout(3, 3, 0, 0));

        }
    }
    public static void main(String[] args) {
        tabPane tp = new tabPane();
    }
}

标签: javaeclipseswing

解决方案


如果您想在图像的中心显示文本,则需要将图标和文本组合成一个图标。

做这件事有很多种方法:

1)创建自定义图标

扩展 ImageIcon 使其具有两个参数:parameters:

  1. 图片
  2. 文本

然后在该paintIcon(...)方法中,您的代码可能类似于:

class TextImageIcon extends ImageIcon
{
    String text;

    public TextImageIcon(String text, Image image)
    {
        super(image);
        this.text = text;
    }

    public void paintIcon(Component c, Graphics g, int x, int y)
    {
        super.paintIcon(c, g, x, y); // paint the image

        // add text centered on the image
    
        FontMetrics fm = g.getFontMetrics();
        int stringWidth = fm.stringWidth( text );
        int textX = (getIconWidth() - stringWidth) / 2;
        int textY = getIconHeight() / 2;
        g.drawString(text, textX, textY)
    }

)

2) 创建一个 JLabel 的图像

JLabel 允许您以图标为中心显示文本。因此,您可以让 JLabel 来工作,而不是自己进行自定义绘制。创建标签后,您可以创建标签的图像以用作图标。

基本代码将类似于:

JLabel label = new JLabel("your text");
label.setIcon( yourIcon );
label.setHorizontalTextPosition(JLabel.CENTER);
label.setVerticalTextPosition(JLabel.CENTER);

BufferedImage image = ScreenImage.createImage( label );
ImageIcon iconWithText = new ImageIcon( image ); 

使用Screen Image类是创建图像的最简单方法,尽管类似的类确实向您展示了创建标签图像的基本代码。


推荐阅读