Javaに関する様々な情報をご紹介します。

Javaに関する様々な情報をご紹介します。
評価

0

JTabbedPaneのタブに画像を表示するには?

JTabbedPaneのタブに「チーム」という文字を赤色で表示
しているのですが、それに続いて画像を表示したいので
す。
以下のようにコードを記述してみたのですが用意したgif
は表示されません。
どうかご指導お願いします。

private JTabbedPane getJTabbedPane0() {
if (jTabbedPane0 == null) {
jTabbedPane0 = new JTabbedPane();
jTabbedPane0.setBorder(null);
jTabbedPane0.setFont(new Font("Dialog", Font.PLAIN, 
28));            //アイコン画像を用意
ImageIcon icon = new 
ImageIcon("ico_tshirt3c_3.gif");
jTabbedPane0.addTab("チーム", iconA, getJPanel0());
//タブの「チーム」の文字色を赤く
JLabel title = new 
JLabel(jTabbedPane0.getTitleAt(0));
title.setForeground(getTabTitleRed());
title.setFont(new Font("Dialog", Font.PLAIN, 28));
jTabbedPane0.setTabComponentAt(0, title);
}
return jTabbedPane0;
}

14

回答

8862

閲覧

14件の回答

評価

0

> jTabbedPane0.addTab("チーム", iconA, getJPanel0());
gifが表示されないのは、このiconAが初期化されていないのでは?
タブの文字の色はJTabbedPane#setForegroundAtメソッドが使えるのでは?

評価

0

大変遅くなって申し訳ありませんが回答ありがとうござい
ます。
その後何とか各タブに画像を配置することが出来ました
が、タブの文字色を変更することが出来ない状態です。
また、ご指摘いただいた「setForegroundAt」を使用して
タブ0は赤色、タブ1は青色とコード書いてみたのですが変
化なしです。
以下がコードとなりますのでご指導お願いします。

private JTabbedPane getJTabbedPane0() {
    if (jTabbedPane0 == null) {
        //タブに配置する画像
        ImageIcon icona = new 
ImageIcon(getClass().getResource("conference-32-
red.png"));
        ImageIcon iconb = new 
ImageIcon(getClass().getResource("conference-32-
blue.png"));
        
        jTabbedPane0 = new JTabbedPane();
        jTabbedPane0.setBorder(null);
        jTabbedPane0.setFont(new 
Font("Dialog", Font.PLAIN, 28));
        jTabbedPane0.addTab("Aチーム" + " ", 
icona, getJPanel0());
        jTabbedPane0.addTab("Bチーム" + " ", 
iconb, getJPanel1());
        //タブ「0」の文字色を赤色に
        jTabbedPane0.setForegroundAt(0, 
getTabTitleRed());
            //タブ「1」の文字色を青色に
        jTabbedPane0.setForegroundAt(1, 
getTabTitleBlue());
        //「Aチーム」タブを表示する
        jTabbedPane0.setSelectedIndex(0);
        //タブ切り替え
        TabbedPane0.addChangeListener(this);
    }
    return jTabbedPane0;
}

評価

0

丸投げせずに少しは調べて実験してみなよ。

評価

0

丸投げではありません。
当初は以下(最下部)のようにコードを書いていて

private JTabbedPane getJTabbedPane0() {
から
//「Aチーム」タブを表示する
jTabbedPane0.setSelectedIndex(0);
までのコードだと画像を表示することは出来たものの文字
色は黒で

//タブの「Aチーム」の文字色を赤く
JLabel titleA = new 
JLabel(jTabbedPane0.getTitleAt(0));
titleA.setForeground(getTabTitleRed());
titleA.setFont(new Font("Dialog", Font.PLAIN, 28));
jTabbedPane0.setTabComponentAt(0, titleA);

//タブの「Bチーム」の文字色を青く
JLabel titleB = new 
JLabel(jTabbedPane0.getTitleAt(1));
titleB.setForeground(getTabTitleBlue());
titleB.setFont(new Font("Dialog", Font.PLAIN, 28));
jTabbedPane0.setTabComponentAt(1, titleB);

を書き加えるとタブの文字色を変えることは出来たものの
タブ内に文字のあとに画像が表示されずにいる状態で
す・・・というかsetTabComponentAtにはiconを引数に加
える事が出来ないので困っている状態です。

どうかご指導お願いします。

private JTabbedPane getJTabbedPane0() {
    if (jTabbedPane0 == null) {
        //タブに配置する画像
        ImageIcon icona = new 
ImageIcon(getClass().getResource("conference-32-
red.png"));
        ImageIcon iconb = new 
ImageIcon(getClass().getResource("conference-32-
blue.png"));
        jTabbedPane0 = new JTabbedPane();
        jTabbedPane0.setBorder(null);
        jTabbedPane0.setFont(new 
Font("Dialog", Font.PLAIN, 28));
        jTabbedPane0.addTab("Aチーム" + " ", 
icona, getJPanel0());
        jTabbedPane0.addTab("Bチーム" + " ", 
iconb, getJPanel1());
        //タブ「0」の文字色を赤色に
        jTabbedPane0.setForegroundAt(0, 
getTabTitleRed());
        //タブ「1」の文字色を青色に
        jTabbedPane0.setForegroundAt(1, 
getTabTitleBlue());
        //「Aチーム」タブを表示する
        jTabbedPane0.setSelectedIndex(0);
        
        //タブの「Aチーム」の文字色を赤く
        JLabel titleA = new 
JLabel(jTabbedPane0.getTitleAt(0));
                
titleA.setForeground(getTabTitleRed());
            titleA.setFont(new Font("Dialog", 
Font.PLAIN, 28));
            jTabbedPane0.setTabComponentAt(0, 
titleA);
            
            //タブの「Bチーム」の文字色を青く
        JLabel titleB = new 
JLabel(jTabbedPane0.getTitleAt(1));
            
titleB.setForeground(getTabTitleBlue());
            titleB.setFont(new Font("Dialog", 
Font.PLAIN, 28));
            jTabbedPane0.setTabComponentAt(1, 
titleB);
        
            //タブ切り替え
        
jTabbedPane0.addChangeListener(this);
    }
    return jTabbedPane0;
}

評価

0

jTabbedPane0.addTab("Aチーム" + " ", icona, getJPanel0());

このコードは"Aチーム "というテキストとアイコンを並べたJLabelを
作成してタブの部分に貼り付けているのだと思います。

jTabbedPane0.setTabComponentAt(0, titleA);

このコードは前のコードでタブに貼り付けたJLabelを剥がして
新たにtitleAというJLabelを貼り付けています。
titleAにはイメージは設定されていないので当然テキストのみになります。

以下のコードを実行したところタブの文字の色は赤くなりました。

import java.awt.Color;
import java.awt.Dimension;
import javax.swing.ImageIcon;
import javax.swing.JFrame;
import javax.swing.JTabbedPane;
import javax.swing.SwingUtilities;

public class TestFrame extends JFrame{
    TestFrame() {
        setTitle("Test Frame");
        JTabbedPane tabbedPane = new JTabbedPane();
        Dimension size = new Dimension(500, 500);
        tabbedPane.setPreferredSize(size);
        tabbedPane.setMinimumSize(size);
        ImageIcon icon = new ImageIcon(getClass().getResource("duke.gif"));
        tabbedPane.addTab("test", icon, null);
        tabbedPane.setForegroundAt(0, Color.RED);
        add(tabbedPane);
        pack();
    }

    public static void main(String[] args) {
        SwingUtilities.invokeLater(
            new Runnable() {
                @Override
                public void run() {
                    JFrame frame = new TestFrame();
                    frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
                    frame.setVisible(true);
                }
            }
        );
    }
}

評価

0

>丸投げではありません。
「分からない」と質問との間の、ステップのことだよ。
何を調べてどう実験した、という部分が重要だということ
だ。

評価

0

質問の仕方が悪くて大変申し訳ありませんでした。
今後は試行錯誤の経過も記載します。

ご提示していただいたコードを実行してみましたが、確か
に画像も表示され文字色の色も赤色となり希望通りの結果
なのですが、タブにアイコンが表示され、次に文字が表示
されていて当方とは順序が異なります。

当方のコードではタブにまず「文字」が表示され、その次
に「画像」が標示されています。
そこでまず画像表示の「icona」を削除して文字色の変更
を試みるべく以下のように実行してみましたが、文字色は
黒のままで当然ですがアイコンは表示されません。

//タブ「0」に文字とアイコン
jTabbedPane0.addTab( "Aチーム", getJPanel0());
//タブ「0」の文字色を赤色に
jTabbedPane0.setForegroundAt(0, getTabTitleRed());

次に文字色が変わらないのなら背景色はどうなのか?と考


//タブ「0」に文字とアイコン
jTabbedPane0.addTab( "Aチーム" +" " , icona, 
getJPanel0());
//タブ「0」の背景色を赤色に
jTabbedPane0.setBackgroundAt(0, getTabTitleRed());

としてみましたが背景色にも何ら変化はありませんでし
た。

大変申し訳ありませんが、ご指導お願いします。

以下が全てのコードです。

package gameShootChart;

import java.applet.Applet;
import java.applet.AudioClip;
import java.awt.Color;
import java.awt.Font;

import javax.swing.BorderFactory;
import javax.swing.ImageIcon;
import javax.swing.JPanel;
import javax.swing.JTabbedPane;
import javax.swing.border.LineBorder;
import javax.swing.border.TitledBorder;
import javax.swing.event.ChangeEvent;
import javax.swing.event.ChangeListener;

import org.dyno.visual.swing.layouts.Bilateral;
import org.dyno.visual.swing.layouts.Constraints;
import org.dyno.visual.swing.layouts.GroupLayout;
import org.dyno.visual.swing.layouts.Leading;

public class ShootSelectP extends JPanel implements 
ChangeListener {

    private static final long serialVersionUID = 
1L;
    //フラグ
    public static int index;
    
    private JTabbedPane jTabbedPane0;
    private JPanel jPanel0;
    private JPanel jPanel1;
    private AItemSelectionP AItemSelectionP0 = 
new AItemSelectionP();
    private BItemSelectionP BItemSelectionP0 = 
new BItemSelectionP();
    
    //タブ切り替えサウンド
    private AudioClip tabpneSound = 
Applet.newAudioClip(getClass().getResource("swit007.
wav"));

    public ShootSelectP() {
        initComponents();
    }
    
    //タブ文字カラー赤
      Color getTabTitleRed() {
          //文字色を赤色に
          return new Color(255,51,51);
      }
    
      //タブ文字カラー青
      Color getTabTitleBlue() {
          //文字色を青色に
          return new Color( 51,102,255 );
      }
      
    //ボーダーライングリーン
    Color getBorderLineGreen() {
        return new Color( 0,128,0 );
    }
    
    private void initComponents() {
        setLayout(new GroupLayout());
        
setBorder(BorderFactory.createTitledBorder(new 
LineBorder(getBorderLineGreen(), 3, true), "項目を選
択してください",
                TitledBorder.LEFT, 
TitledBorder.TOP, new Font("Dialog", Font.BOLD, 28), 
getBorderLineGreen()));
        add(getJTabbedPane0(), new 
Constraints(new Leading (-2, 614, 10, 10), new 
Leading(-4, 520, 10, 10)));//544
        setSize(624, 520);
    }

    private JTabbedPane getJTabbedPane0() {
        if (jTabbedPane0 == null) {
            jTabbedPane0 = new 
JTabbedPane();
            
jTabbedPane0.setBorder(null);
            jTabbedPane0.setFont(new 
Font("Dialog", Font.PLAIN, 28));
            //タブ「0」に配置する画像
            ImageIcon icona = new 
ImageIcon(getClass().getResource("conference-32-
red.png"));
            //タブ「0」に文字とアイコン
            jTabbedPane0.addTab( "Aチー
ム" +" " , icona, getJPanel0());
            //タブ「0」の文字色を赤色に
            
jTabbedPane0.setForegroundAt(0, getTabTitleRed());
            //タブ「1」に配置する画像
            ImageIcon iconb = new 
ImageIcon(getClass().getResource("conference-32-
blue.png"));
            //タブ「1」に文字とアイコン
            jTabbedPane0.addTab("Bチー
ム" + " ", iconb, getJPanel1());
            //タブ「1」の文字色を青色に
            
jTabbedPane0.setForegroundAt(1, getTabTitleBlue());
            //初めは「Aチーム」タブを表
示する
            
jTabbedPane0.setSelectedIndex(0);
            //タブ切り替え
            
jTabbedPane0.addChangeListener(this);
            
        }
        return jTabbedPane0;
    }
    
    //Aチームの選択パネル
    private JPanel getJPanel0() {
        if (jPanel0 == null) {
            jPanel0 = new JPanel();
            jPanel0.setLayout(new 
GroupLayout());
            
jPanel0.add(AItemSelectionP0, new Constraints(new 
Bilateral(2, 0, 615), new Bilateral(0, 0, 
501)));//501
        }
        return jPanel0;
    }
    
    //Bチームの選択パネル
    private JPanel getJPanel1() {
        if (jPanel1 == null) {
            jPanel1 = new JPanel();
            jPanel1.setLayout(new 
GroupLayout());
            
jPanel1.add(BItemSelectionP0, new Constraints(new 
Bilateral(2, 0, 613), new Leading(0, 494, 10, 10)));
        }
        return jPanel1;
    }
    
    @Override
    public void stateChanged(ChangeEvent e) {
        // TODO Auto-generated method stub
        //タブ切り替え時にサウンドを鳴らす
        tabpneSound.play();
        //コンソール表示
        JTabbedPane sourceTabbedPane = 
(JTabbedPane) e.getSource();
        index = 
sourceTabbedPane.getSelectedIndex();
        System.out.println("Tab changed to: " + 
sourceTabbedPane.getTitleAt(index));
    }
}

評価

0

思いつくことをやってみるのはもちろん大事だが、同じよう
に悩んだ人がいないか、ネットで調べてみる気はないのか、
ということなんだ。
自分じゃなかなか思い付かなくても、他人の様々な事例を見
れば新たな発見がある。
昔は書籍がそれだったが、今はネットに莫大な情報が転がっ
ている。
自分で目的のものを探して活用しようとせず、ピンポイント
な情報を直接得ることだけを考えてないか?
人との会話は、情報を得るためではなく得た情報がどうにも
読み解けないときの助けだと考える方がいい。

評価

0

回答ありがとうございます。
ネット検索で以下のサイトにたどり着きましたが
http://ateraimemo.com/Swing/ColorTab.html
上記サイトの解説の最下部に

「文字色もSynth(Nimbus)LookAndFeelなどでは、
JTabbedPane#setForegroundAt(...)で変更することができ
ないようです。」

とありました。
当方はNimbus LookAndFeelを使用及び表示しています。

また、英語のページも検索しましたが上記と同様変更不可
とあり、画像(アイコン)無しなら当方が以前に投稿した
ようにJLabelに文字と色設定をしたものをタブに貼り付け
る方法は散見されました。

実現は無理なのでしょうか?

評価

0

まー、普通タブのアイコンといったら、左にあるしな…。
固定で実装されててもおかしくはないと思うが。
表示したい文字列を埋め込んだ画像を動的に生成してアイコ
ンにしてはだめなのか?

評価

0

JLabelにアイコンとテキストをセットして
label.setHorizontalTextPosition(SwingConstants.LEFT);
とすればテキストが左にきます。
文字の色はsetForegroundメソッドです。
それをsetTabComponentAtで設定すればいいのでは

背景色を変える場合はNimbusでsetBackgroundAtが使えないのなら
少し面倒になります。
JLabelを貼り付けるタブ部分のコンポーネントはマージンを取っているようなのでラベルの背景色を変えてもマージンの部分はデフォルトのタブの色になってしまいます。
そのマージン(もしかするとボーダー)をゼロにするメソッドを探す必要があります。
UIManagerを使っても色の変更可能かもしれませんがNimbusがどのようにJTabbedPaneのUIを実装しているかによるのではっきりした事は分かりません。

評価

0

回答ありがとうございます。

ご提示いただいたコードを元に以下のように書いてみたと
ころ希望通りの表示となりました。
本当にありがとうございました。

private JTabbedPane getJTabbedPane0() {
    if (jTabbedPane0 == null) {
        jTabbedPane0 = new JTabbedPane();
        jTabbedPane0.setBorder(null);
        jTabbedPane0.setFont(new 
Font("Dialog", Font.PLAIN, 28));
        //タブ「0」に配置する画像
        ImageIcon icona = new 
ImageIcon(getClass().getResource("conference-32-
red.png"));
        //タブ「1」に配置する画像
        ImageIcon iconb = new 
ImageIcon(getClass().getResource("conference-32-
blue.png"));
        //タブに文字
        jTabbedPane0.addTab("Aチーム", 
getJPanel0());
        jTabbedPane0.addTab("Bチーム", 
getJPanel1());
        
        //タブの「Aチーム」の文字色と画像を
セットで配置
        JLabel label0 = new JLabel("Aチー
ム", icona, JLabel.CENTER);
        label0.setPreferredSize(new 
Dimension(150,38));
            label0.setFont(new Font("Dialog", 
Font.PLAIN, 28));
        
label0.setHorizontalTextPosition(JLabel.LEFT);
        
label0.setVerticalTextPosition(JLabel.CENTER);
        
label0.setForeground(getTabTitleRed());
        jTabbedPane0.setTabComponentAt(0, 
label0);
        
        //タブの「Bチーム」の文字色と画像を
セットで配置
        JLabel label1 = new JLabel("Bチー
ム", iconb, JLabel.CENTER);
        label1.setPreferredSize(new 
Dimension(150,38));
        label1.setFont(new Font("Dialog", 
Font.PLAIN, 28));
        
label1.setHorizontalTextPosition(JLabel.LEFT);
        
label1.setVerticalTextPosition(JLabel.CENTER);
        
label1.setForeground(getTabTitleBlue());
        jTabbedPane0.setTabComponentAt(1, 
label1);
        
        //初めは「Aチーム」タブを表示する
        jTabbedPane0.setSelectedIndex(0);
        //タブ切り替え
        
jTabbedPane0.addChangeListener(this);
    }
    return jTabbedPane0;
}

評価

0

訂正箇所がありますので記載しておきます。

label0.setHorizontalTextPosition(JLabel.LEFT);
label1.setHorizontalTextPosition(JLabel.LEFT);

ではなく

label0.setHorizontalTextPosition(JLabel.RIGHT);
label1.setHorizontalTextPosition(JLabel.RIGHT);

です。

評価

0

おお。これは知らなかった。質問者じゃないけどありがと
う。

質問から6ヶ月以上経過しているので、回答を書き込むことはできません。