[Java的挥杆] JTabbedPane的自定义

在我以前的文章介绍 JTabbenPane 一些基本要点, 本文中,我们发现多一点 可定制的JTabbedPane 为更好吃得, 像下面的图片, 有关闭标签, 更多标签,…

可定制的JTabbedPane

其中最重要的是我们如何要添加新的选项卡按钮, 如何在每个选项卡它关闭按钮选项卡. 我们将创造 2 文件, 1 执行自定义的文件标签 (有JLabel的当前选项卡的标题和关闭按钮选项卡) 和 1 创建基于文件的标签JTabbedPane中在其他文​​件中被定制.

添加新的选项卡和事件的JTabbedPane


关于创建新的选项卡按钮来添加我们生产的物质 1 标签标题加 (“+”) 实施开始改变事件的JTabbedPane. 只要点击切换标签, 如果您单击此选项卡上,执行更 1 新标签. 下面是创建自定义文件中的代码JTabbedPane中.

package nguyenvanquan7826.JTabbedPane;

import java.awt.Color;
import java.awt.GridLayout;

import javax.swing.JFrame;
import javax.swing.JLabel;
import javax.swing.JPanel;
import javax.swing.JScrollPane;
import javax.swing.JTabbedPane;
import javax.swing.JTextArea;
import javax.swing.event.ChangeEvent;
import javax.swing.event.ChangeListener;

/**
 * --------------------- @author nguyenvanquan7826 ---------------------
 * ------------------ website: cachhoc.net -------------------
 * ---------- date: Jul 24, 2014 - filename: DemoCustomJTabPane.java ----------
 */
public class DemoCustomJTabbedPane extends JFrame {
	JTabbedPane tabbedPane;
	int numTabs;

	public DemoCustomJTabbedPane() {
		createGUI();
		setDisplay();
	}

	/** set diplay for JFrame */
	private void setDisplay() {
		setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
		setSize(450, 300);
		setLocationRelativeTo(null);
		setVisible(true);
	}

	/** set title and add JTabbedPane into JFrame */
	private void createGUI() {
		setTitle("Demo custum JTabbedPane");
		createJTabbedPane();
		add(tabbedPane);
	}

	/** create JTabbedPane contain 2 tab */
	private void createJTabbedPane() {
		/* create JTabbedPane */
		tabbedPane = new JTabbedPane(JTabbedPane.TOP,
				JTabbedPane.SCROLL_TAB_LAYOUT);

		/* add first tab */
		tabbedPane.add(createJPanel(), "Tab " + String.valueOf(numTabs),
				numTabs++);
		tabbedPane.setTabComponentAt(0, new DemoCustomTab(this));

		/* add tab to add new tab when click */
		tabbedPane.add(new JPanel(), "+", numTabs++);

		tabbedPane.addChangeListener(changeListener);
	}

	/** create JPanel contain a JLabel */
	private JPanel createJPanel() {
		JPanel panel = new JPanel(new GridLayout(1, 1));
		panel.add(new JScrollPane(createTextArea(10, 40)));
		return panel;
	}

	private JTextArea createTextArea(int row, int col) {
		JTextArea ta = new JTextArea(row, col);
		ta.setWrapStyleWord(true);
		ta.setLineWrap(true);
		ta.setForeground(Color.BLUE);
		return ta;
	}

	ChangeListener changeListener = new ChangeListener() {
		@Override
		public void stateChanged(ChangeEvent e) {
			addNewTab();
		}
	};

	private void addNewTab() {
		int index = numTabs - 1;
		if (tabbedPane.getSelectedIndex() == index) { /* if click new tab */
			/* add new tab */
			tabbedPane.add(createJPanel(), "Tab " + String.valueOf(index),
					index);
			/* set tab is custom tab */
			tabbedPane.setTabComponentAt(index, new DemoCustomTab(this));
			tabbedPane.removeChangeListener(changeListener);
			tabbedPane.setSelectedIndex(index);
			tabbedPane.addChangeListener(changeListener);
			numTabs++;
		}
	}

	public void removeTab(int index) {
		tabbedPane.remove(index);
		numTabs--;

		if (index == numTabs - 1 && index > 0) {
			tabbedPane.setSelectedIndex(numTabs - 2);
		} else {
			tabbedPane.setSelectedIndex(index);
		}

		if (numTabs == 1) {
			addNewTab();
		}
	}

	public static void main(String[] args) {
		new DemoCustomJTabbedPane();
	}
}

你有没有在网上发现 51 我们增加了第一个选项卡像往常一样, 那么行 53 我们执行 setTabComponentAt 用自定义选项卡替换默认选项卡中,我们 (下面的代码) 关闭标签页按钮.

当前 58 实施事件侦听器JTabbedPane中的选项卡转移.

方法 addNewTab 执行更多的新标签. 请注意,行 91, 添加新选项卡之后,我们需要中断JTabbedPane中的收听因为否则的条件 tabbedPane.getSelectedIndex() ==指数 总是正确的,它需要许多标签. 中断听完之后, 我们把标签被选定为新创建的选项卡,然后听背部安装.

方法 removeTab 在位置完成后关闭的标签 指数. 注意if-else语句首先检查,如果上次关闭的标签,标签将集中于前, 其标签后否则将集中在. 第二if语句 2 要检查标签的封闭端 (只需添加标签按钮) 它会自动生成 1 新标签.

添加一个关闭按钮选项卡的JTabbedPane


在关闭标签按钮, 执行自定义组件 (零件) 该选项卡 1 的JPanel, 此JPanel包含 1 JLabel的显示标题 (称号) 标签, 1 JButton的赶上这样关闭标签页的事件

在该选项卡添加JTabbedPane的关闭按钮

下面是自定义选项卡上的代码

package nguyenvanquan7826.JTabbedPane;

import java.awt.Color;
import java.awt.Dimension;
import java.awt.FlowLayout;
import java.awt.event.MouseEvent;
import java.awt.event.MouseListener;

import javax.swing.JButton;
import javax.swing.JLabel;
import javax.swing.JPanel;
import javax.swing.border.EmptyBorder;
import javax.swing.border.EtchedBorder;

/**
 * --------------------- @author nguyenvanquan7826 ---------------------
 * ------------------ website: cachhoc.net -------------------
 * ---------- date: Jul 24, 2014 - filename: DemoButtonTab.java ----------
 */
public class DemoCustomTab extends JPanel {

	DemoCustomJTabbedPane customJTabbedPane;

	/** JPanel contain a JLabel and a JButton to close */
	public DemoCustomTab(DemoCustomJTabbedPane customJTabbedPane) {
		this.customJTabbedPane = customJTabbedPane;
		setLayout(new FlowLayout(FlowLayout.LEFT, 0, 0));
		setBorder(new EmptyBorder(5, 2, 2, 2));
		setOpaque(false);
		addLabel();
		add(new CustomButton("x"));
	}

	private void addLabel() {
		JLabel label = new JLabel() {
			/** set text for JLabel, it will title of tab */
			public String getText() {
				int index = customJTabbedPane.tabbedPane
						.indexOfTabComponent(DemoCustomTab.this);
				if (index != -1) {
					return customJTabbedPane.tabbedPane.getTitleAt(index);
				}
				return null;
			}
		};
		/** add more space between the label and the button */
		label.setBorder(new EmptyBorder(0, 0, 0, 10));
		add(label);
	}

	class CustomButton extends JButton implements MouseListener {
		public CustomButton(String text) {
			int size = 15;
			setText(text);
			/** set size for button close */
			setPreferredSize(new Dimension(size, size));

			setToolTipText("close the Tab");

			/** set transparent */
			setContentAreaFilled(false);

			/** set border for button */
			setBorder(new EtchedBorder());
			/** don't show border */
			setBorderPainted(false);

			setFocusable(false);

			/** add event with mouse */
			addMouseListener(this);

		}

		/** when click button, tab will close */
		@Override
		public void mouseClicked(MouseEvent e) {
			int index = customJTabbedPane.tabbedPane
					.indexOfTabComponent(DemoCustomTab.this);
			if (index != -1) {
				customJTabbedPane.removeTab(index);
			}
		}

		@Override
		public void mousePressed(MouseEvent e) {
		}

		@Override
		public void mouseReleased(MouseEvent e) {
		}

		/** show border button when mouse hover */
		@Override
		public void mouseEntered(MouseEvent e) {
			setBorderPainted(true);
			setForeground(Color.RED);
		}

		/** hide border when mouse not hover */
		@Override
		public void mouseExited(MouseEvent e) {
			setBorderPainted(false);
			setForeground(Color.BLACK);
		}
	}
}

在这堂课,我们有 1 对象DemoCustomJTabbedPane, 传递给我们的,你注意到我们已经提到了前面的代码创建的对象 新DemoCustomTab(此). 的目的是将其发送出去来获得JTabbedPane的持续, 我们将与它同时也再次执行关闭标签页. 具体而言,:

你看这个类继承的JPanel所以它是 1 JPanel的,因为我们希望. 我们执行在该行设定的JLabel和JButton的在里面 30 和 31.

方法 addLabel JLabel的JPanel的进入做多. 但是,我们需要采取的选项卡的标题揭示的JLabel被改写功能 的getText JLabel中执行搜索到JTabbedPane中的当前选项卡拿冠军.

添加简单的JButton创建 1 JButton对象,文本 “X” 但是如果你这样做那么这将是非常响亮的JButton坏, 所以我也通过自定义类的JButton这样做 的CustomButton.
本A类 实现的MouseListener 实现鼠标的所有事件. 当鼠标悬停在关闭按钮,该方法 的mouseEntered 将执行和颜色会变为红色, 边界和 1 文本工具提示弹出 “关闭选项卡”. 时取出,将小鼠返回到正常借助于 的mouseExited.
为了获得需要的东西把一些价值,它作为:
– 置于适当大小: 有必要对setPreferredSize(新维度(尺寸, 尺寸));
– 制作透明按钮: setContentAreaFilled(假);
– 设置边界: setBorder(新EtchedBorder()); setBorderPainted(假);
当您单击按钮来关闭标签的方法 的mouseClicked 已知的和实现的方法调用 removeTabDemoCustomJTabbedPane 收的标签.

阅读高级英语在这里