【Swing入门教程】一步一步做Netbeans(2):定制可关闭的JTabbedPane标签

    技术2022-05-20  52

         上次我们希望右边的NetbeansUI.java和Netbeans.java两个标签能关闭,这教程我们就来探讨这个问题。实现这种效果有两个方法:一是自定义一套JTabbedPane的L&F;二是通过自定义组件采用JTabbedPane的setTabComponentAt(int index,Component componet)方法来修改。

         第一种方法对于初学者可能稍微有点麻烦,我们主要采用第二种方法。先看看做出来的效果:

          和教程一的效果区别就在于多了两个小关闭按钮,并且是可关闭的。既然我们知道是用setTabComponentAt(int index,Component componet)方法,下面我们就来定制组件吧,看代码:

    package com.monitor1394.netbeans.ui; import java.awt.BasicStroke; import java.awt.Color; import java.awt.Component; import java.awt.Dimension; import java.awt.FlowLayout; import java.awt.Graphics; import java.awt.Graphics2D; import java.awt.event.ActionEvent; import java.awt.event.ActionListener; import java.awt.event.MouseAdapter; import java.awt.event.MouseEvent; import javax.swing.AbstractButton; import javax.swing.BorderFactory; import javax.swing.JButton; import javax.swing.JLabel; import javax.swing.JPanel; import javax.swing.JTabbedPane; import javax.swing.plaf.basic.BasicButtonUI; /** * 可关闭的JTabbedPane标签 * * @author monitor * Created on 2011-2-25, 23:52:41 */ public class TabbedPanel extends JPanel { private final JTabbedPane pane; public TabbedPanel(final JTabbedPane pane){ super(new FlowLayout(FlowLayout.LEFT, 0, 0)); if(pane==null) throw new NullPointerException("TabbedPane is null"); this.pane=pane; setOpaque(false); //tab标题 JLabel label = new JLabel() { @Override public String getText() { int i = pane.indexOfTabComponent(TabbedPanel.this); if (i != -1)return pane.getTitleAt(i); return null; } }; add(label); label.setBorder(BorderFactory.createEmptyBorder(0, 0, 0, 2)); add(new TabButton()); setBorder(BorderFactory.createEmptyBorder(1, 0, 0, 0)); } /** tab上的关闭按钮 */ private class TabButton extends JButton { public TabButton() { int size = 17; setPreferredSize(new Dimension(size, size)); setToolTipText("关闭"); setUI(new BasicButtonUI()); setContentAreaFilled(false); setFocusable(false); setBorder(BorderFactory.createEtchedBorder()); setBorderPainted(false); //翻转效果 setRolloverEnabled(true); //鼠标事件,进入时画边框,移出时取消边框 addMouseListener(new MouseAdapter() { @Override public void mouseEntered(MouseEvent e) { Component component = e.getComponent(); if (component instanceof AbstractButton) { AbstractButton button = (AbstractButton) component; button.setBorderPainted(true); } } @Override public void mouseExited(MouseEvent e) { Component component = e.getComponent(); if (component instanceof AbstractButton) { AbstractButton button = (AbstractButton) component; button.setBorderPainted(false); } } }); //单击关闭按钮事件 addActionListener(new ActionListener() { public void actionPerformed(ActionEvent evt) { int i = pane.indexOfTabComponent(TabbedPanel.this); if (i != -1) pane.remove(i); } }); } @Override public void updateUI() { } @Override protected void paintComponent(Graphics g) { super.paintComponent(g); Graphics2D g2 = (Graphics2D) g.create(); //鼠标按下时偏移一个坐标点 if (getModel().isPressed()) { g2.translate(1, 1); } g2.setStroke(new BasicStroke(2)); g2.setColor(Color.BLACK); //鼠标在按钮上时为红色 if (getModel().isRollover()) { g2.setColor(Color.RED); } int delta = 6; g2.drawLine(delta, delta, getWidth() - delta - 1, getHeight() - delta - 1); g2.drawLine(getWidth() - delta - 1, delta, delta, getHeight() - delta - 1); g2.dispose(); } } }

     

    只需将原来initMainPanel()方法中的:

    workTabbedPane.add("NetbeansUI.java", new JPanel()); workTabbedPane.add("Netbeans.java", new JPanel());

    改为:

    workTabbedPane.add("NetbeansUI.java", new JPanel()); workTabbedPane.setTabComponentAt(0,new TabbedPanel(workTabbedPane)); workTabbedPane.add("Netbeans.java", new JPanel()); workTabbedPane.setTabComponentAt(1,new TabbedPanel(workTabbedPane));

    即可。


    最新回复(0)