非IT企業に勤める中年サラリーマンのIT日記

非IT企業でしかもITとは全く関係ない部署にいる中年エンジニア。唯一の趣味がプログラミングという”自称”プログラマー。

Javaでタブコントロールに閉じるボタンを設置する方法

   

JavaにしろC#にしろVBにしろ、GUIコントロールにタブがあります。Javaだとこんな↓感じですね。

 

でも、ソフトウェアでよく見るタブはクローズボタンが付いています。代表的なのはブラウザです。みんな各タブに「×」ボタンがあり、それを押すとクローズします。

 

これをJavaでどうやって作るか?というのが今回のテーマです。

[ad#top-1]

まずはボタンなしのソースコード

まずはボタンなしの標準のプログラムです。以下が実行した例です。2つのタブがあり、それぞれにJTextAreaが設置されています。

 

ソースコードはこちらです。

import java.awt.*;
import javax.swing.*;
import java.awt.event.*;

public class TabTest extends JFrame{
  protected Container pane;

  public static void main(String[] args){
    TabTest f = new TabTest("タブテスト");
    f.setLocationRelativeTo(null);
    f.setVisible(true);
  }

  TabTest(String t){
    super(t);
    this.setSize(600, 400);
    pane = getContentPane();

    JTabbedPane tabpane = new JTabbedPane();
    pane.add(tabpane);

    tabpane.add(new TextArea());
    tabpane.add(new TextArea());
  }
}
 

 

タブにボタンを設置する

上のプログラムにどうやってボタンを設置するかというと、イメージとしては以下のようになります。JTabbedPaneにJPanelを貼って、その上にJLabelとJButtonを配置するというやり方です。

 

 

プログラムは以下のように、まずはJPanelをGridLayoutで宣言して、JLabelとJButtonを貼った上で、JTabbedPane(tabpane)に貼り付けるというやり方です。

JPanel p1 = new JPanel( new GridLayout(1,1,5,5) );
p1.add(new JLabel("#1"), BorderLayout.WEST);
p1.add(new JButton("X"), BorderLayout.EAST);
tabpane.setTabComponentAt(0, p1);
 

 

全体のソースコードはこちらになります。タブを2つ用意したので上のプログラムを2回繰り返しています。

import java.awt.*;
import javax.swing.*;
import java.awt.event.*;

public class TabTest extends JFrame{
  protected Container pane;

  public static void main(String[] args){
    TabTest f = new TabTest("タブテスト");
    f.setLocationRelativeTo(null);
    f.setVisible(true);
  }

  TabTest(String t){
    super(t);
    this.setSize(600, 400);
    pane = getContentPane();

    JTabbedPane tabpane = new JTabbedPane();
    pane.add(tabpane);

    tabpane.add(new TextArea());
    tabpane.add(new TextArea());

    //ここから追加
    JPanel p1 = new JPanel( new GridLayout(1,1,5,5) );
    p1.add(new JLabel("#1"), BorderLayout.WEST);
    p1.add(new JButton("X"), BorderLayout.EAST);
    tabpane.setTabComponentAt(0, p1);

    JPanel p2 = new JPanel( new GridLayout(1,1,5,5) );
    p2.add(new JLabel("#2"), BorderLayout.WEST);
    p2.add(new JButton("X"), BorderLayout.EAST);
    tabpane.setTabComponentAt(1, p2);
  }
}
 

 

なんか不格好ですが、なんとかタブにボタンを設置できました。

 

JPanelを透明にする

ボタンを設置できたのはできたのですが、ちょっと不格好でしたね。まず、タブに貼り付けたJPanelの色がタブと違うので透明にして色違いを解消します。

 

JPanelを透明にするのは標準でsetOpaqueというメソッドがあります。

JPanel p1 = new JPanel( new GridLayout(1,1,5,5) );
p1.setOpaque(false); //ココ
p1.add(new JLabel("#1"), BorderLayout.WEST);
p1.add(new JButton("X"), BorderLayout.EAST);
tabpane.setTabComponentAt(0, p1);
 

 

とやれば透明になります。(全体のソースコードは後述)

 

UIをWindowsにしておく

Java SwingのデフォルトのUIのMetalは、やっぱちょっとカッコ悪いので、UIをWindows風にしました。その方法は前回紹介した通りです。

全体のソースコードは後述するので、とりあえず以下を参考にしてください。

 

Windows風にするとこんな感じです。若干よくなりましたね。

 

ボタンを小さくする

ボタンが若干大きいので、余白サイズを変えて整えます。

今までは以下のように、無名クラスをJPanelに突っ込んでいましたが・・・、

p1.add(new JButton("X"), BorderLayout.EAST);
 

 

これだと、JButtonをカスタマイズできないので、まずはインスタンス化した上でsetMarginメソッドで余白を設定します。※どうせイベント処理したりするのでどっちみちインスタンス化しますよね。

JButton b1 = new JButton("X");
b1.setMargin(new Insets(0, 5, 0, 5));
p1.add(b1, BorderLayout.EAST);
 

 

で、実行したのがこちら。それっぽくなりました。

 

拡大するとこんな感じです。

 

全体のソースコードはこちら

全体のソースはこちらです。コピペしてコンパイルすれば最後の例のような外観で実行されます。

あとは、イベント処理など適宜実装すれば良いかと思います。ボタンを×(バツ)文字じゃなく画像にするとかも。

import java.awt.*;
import javax.swing.*;
import java.awt.event.*;

public class TabTest extends JFrame{
  protected Container pane;

  public static void main(String[] args){
    TabTest f = new TabTest("タブテスト");
    f.setLocationRelativeTo(null);
    f.setVisible(true);
  }

  TabTest(String t){
    super(t);
    this.setSize(600, 400);
    pane = getContentPane();
    LookAndFeelChange("windows");

    JTabbedPane tabpane = new JTabbedPane();
    pane.add(tabpane);

    tabpane.add(new TextArea());
    tabpane.add(new TextArea());

    JPanel p1 = new JPanel( new GridLayout(1,1,5,5) );
    p1.setOpaque(false);
    p1.add(new JLabel("#1"), BorderLayout.WEST);
    JButton b1 = new JButton("X");
    b1.setMargin(new Insets(0, 5, 0, 5));
    p1.add(b1, BorderLayout.EAST);
    tabpane.setTabComponentAt(0, p1);

    JPanel p2 = new JPanel( new GridLayout(1,1,5,5) );
    p2.setOpaque(false);
    p2.add(new JLabel("#2"), BorderLayout.WEST);
    JButton b2 = new JButton("X");
    b2.setMargin(new Insets(0, 5, 0, 5));
    p2.add(b2, BorderLayout.EAST);
    tabpane.setTabComponentAt(1, p2);
  }
  void LookAndFeelChange(String look){
    try{
      if(look.equals("windows")){
        UIManager.setLookAndFeel(
            "com.sun.java.swing.plaf.windows.WindowsLookAndFeel");
      }else if(look.equals("motif")){
        UIManager.setLookAndFeel(
            "com.sun.java.swing.plaf.motif.MotifLookAndFeel");
      }else{
        UIManager.setLookAndFeel(
            "com.sun.java.swing.plaf.metal.MetalLookAndFeel");
      }
    }catch(UnsupportedLookAndFeelException e){
    }catch(ClassNotFoundException e){
    }catch(InstantiationException e){
    }catch(IllegalAccessException e){
    }
  }
}
 

.

[ad#ad-1]

スポンサーリンク

 - Java