[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 JPanelの上に追加のJLabelを行う. しかし、我々は、関数をオーバーライドしてJLabelを表示するタブのタイトルを取る必要がある のgetText JLabelのタイトルを取るためにJTabbedPaneの現在のタブに見ての実装.

作成にシンプルなのJButtonを追加する 1 テキスト付きのJButton “X” あなたがそうするがあれば、それは非常に騒々しいとするJButton悪いとなります, そう、そのまたクラスのJButtonでそれをカスタマイズする CustomButton.
このクラス のMouseListenerを実装 マウスイベントを行うようになった. あなたは、ボタンの上にマウスを移動、メソッド近い のmouseEntered 実行され、色が赤に変わります, 輪郭がアップすることもあり、 1 ツールチップテキストを表示 “タブを閉じる”. あなたがによって正常に戻っを合わせると のmouseExited.
としてそれにいくつかの値を配置する必要がで物事を取得するには:
– 適切なサイズを配置: setPreferredSize(新次元(サイズ, サイズ));
– どのように透明なボタン: setContentAreaFilled(偽);
– 入れて輪郭: setBorder(新しいEtchedBorder()); setBorderPainted(偽);
あなたは、タブのメソッドを閉じるには、ボタンをクリックすると のmouseClicked 知られ、メソッド呼び出しを実装 はremoveTabDemoCustomJTabbedPane タブを閉じるには.

ここでそれを英語で読む