[Javaのスイング] JTabbedPaneのカスタマイズ
前回の記事で紹介 JTabbenPane いくつかの基本的なポイント, この記事では、我々はにもう少し学ぶ カスタム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

ここでタブをカスタマイズするためのコードである
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 知られ、メソッド呼び出しを実装 はremoveTab の DemoCustomJTabbedPane タブを閉じるには.



ああ、私は彼の内部クラスは、必ずしも何をしませcustombuttonました
いいえNHEないあなた.
パッケージのTabbedPane;
輸入java.awt.event.MouseListener;
輸入java.awt.event.MouseEvent;
輸入javax.swing.JLabel;
輸入javax.swing.JButtonの;
@SuppressWarnings(“シリアル”)
パブリッククラスCustomPanelはjavax.swing.JPanelを拡張します{
民間のTabbedPaneタブ区画;
プライベートJLabelのlabelTitle;
プライベートJButtonのbuttonClose;
公共CustomPanel(のTabbedPane OBJ) {
タブ区画= OBJ;
SetOpaque(真);
のsetSize(75, 25);
setLayoutの(新しいjava.awt.GridLayout());
加えます(createLabelTitle());
加えます(createButtonClose());
リスト待ち();
}
プライベートJLabelのcreateLabelTitle() {
labelTitle =新しいJLabelの() {
パブリック文字列のgetText() {
int型のインデックス= tabbedPane.tabbedPane.indexOfComponent(CustomPanel.this);
もし(インデックス != -1)
tabbedPane.tabbedPane.getTitleAtを返します(インデックス);
ほかに
リターンヌル;
}
};
labelTitleを返します;
}
プライベートJButtonのcreateButtonClose() {
buttonClose =新しいJButtonの(“X”);
buttonClose.setToolTipText(“このタブを閉じます”);
buttonClose.setPreferredSize(新しいjava.awt.Dimension(15, 15));
buttonClose.setBorderPainted(偽);
buttonClose.setContentAreaFilled(偽);
buttonClose.setBorder(新しいjavax.swing.border.EtchedBorder());
buttonClose.setFocusable(偽);
buttonCloseを返します;
}
プライベートボイドlistenEvent() {
のために(のjava.awt.Componentカンプ: のgetComponents())
もし(JButtonのinstanceofのコンプ) {
JButtonのボタン= (JButtonの)コンプ;
button.addMouseListener
(
新しいのMouseListener() {
公共ボイドのmouseClicked(MouseEventのイベント) {
int型のインデックス= tabbedPane.tabbedPane.indexOfComponent(CustomPanel.this);
もし(インデックス != -1)
tabbedPane.removeTabClick(インデックス);
他のリターン;
}
公共ボイドのmouseEntered(MouseEventのイベント) {
buttonClose.setBorderPainted(真);
buttonClose.setBackground(java.awt.Color.red);
}
公共ボイドのmouseExited(MouseEventのイベント) {
buttonClose.setBorderPainted(偽);
buttonClose.setBackground(java.awt.Color.black);
}
公共ボイドのmousePressed(MouseEventのイベント) {
}
公共ボイドのmouseReleased(MouseEventのイベント) {
}
}
);
}
ほかに;
}
}
無KO KOの飛燕のlabeltitleとbuttoncloseの弓のバットイベント
いいえあなたが編集することができ、または落下片が行きます? OnDemandがこれまでのように外にまだあります
彼のコードは、あったcustomButtom 1 クラス. マイボタンが長いです 1 オブジェクトCUAクラスのJButton. それはまたのJButtonを拡張しているがため、 1 ボタンのみ. 上記の私のスタイルのコードであるように子供がいるため、コードの彼を好きではありません. ちょうどそのようなコードを改訂するが、何も削除しません. 彼のコードは、[OK]を実行しました. ので、あなたのコードでは、ここまでOK以上のTabbedPaneを投稿してはいけません, それが現在はremoveTabないタイトルのTabbedPaneなくなるん。(コードはremoveTabはOKcũng). もしそうであればCutomButtonです 1 クラス(KOインナー) よく実行. しかし、なぜ現在のタイトルのように、このパネルに追加して、KO KOキャプチャボタンをクリックしてイベントを再しかし、基底状態を設定するイベントがマウスオーバーまだあります.
彼sory. コピー&ペーストするコードではなく、そのように小さな欠陥による. ワードタブのないindexOfTabComponent. おかげで彼の担当者.