2

選択したタブに基づいて JTabbedPane の境界線の色を変更しようとしています。ここウェブでの回答を使用して、私はこれを管理しました:

import java.awt.*;

import javax.swing.*;
import javax.swing.event.ChangeEvent;
import javax.swing.event.ChangeListener;
import javax.swing.plaf.basic.BasicTabbedPaneUI;

public class TabbedPaneTest implements Runnable {
    JTabbedPane pane = new JTabbedPane();;

    public void run() {
        // magenta border first so any changes will be obvious
        setTabbedPaneBorderColor(new Color(255, 0, 255));

        JPanel container = new JPanel();
        container.setSize(new Dimension(500, 200));
        pane.setPreferredSize(new Dimension(400, 200));
        pane.addTab("A", createTab(Color.RED));
        pane.addTab("B", createTab(Color.YELLOW));
        pane.addTab("C", createTab(Color.BLUE));
        pane.addChangeListener(new TabSelected());
        container.add(pane);

        final JFrame frame = new JFrame();
        frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        frame.add(container);
        frame.setSize(500, 300);
        frame.setLocationRelativeTo(null);
        frame.setVisible(true);
    }

    private JPanel createTab(Color color) {
        JPanel p = new JPanel();
        p.setBorder(BorderFactory.createLineBorder(color, 2));
        return p;
    }

    private class TabSelected implements ChangeListener {

        @Override
        public void stateChanged(ChangeEvent e) {
            int index = pane.getSelectedIndex();

            switch (index) {
            case 0:
                setTabbedPaneBorderColor(Color.RED);
                break;
            case 1:
                setTabbedPaneBorderColor(Color.YELLOW);
                break;
            case 2:
                setTabbedPaneBorderColor(Color.BLUE);
                break;
            }

        }

    }

    public void setTabbedPaneBorderColor(Color tabBorderColor) {

        UIManager.put("TabbedPane.borderHightlightColor", tabBorderColor);
        UIManager.put("TabbedPane.darkShadow", tabBorderColor);
        UIManager.put("TabbedPane.shadow", tabBorderColor);
        UIManager.put("TabbedPane.light", tabBorderColor);
        UIManager.put("TabbedPane.highlight", tabBorderColor);
        UIManager.put("TabbedPane.focus", tabBorderColor);
        UIManager.put("TabbedPane.selectHighlight", tabBorderColor);


        pane.setUI(new BasicTabbedPaneUI() {
               @Override
               protected void installDefaults() {
                   super.installDefaults();
                   highlight = UIManager.getColor("TabbedPane.light");
                   lightHighlight = UIManager.getColor("TabbedPane.highlight");
                   shadow = UIManager.getColor("TabbedPane.shadow");
                   darkShadow =UIManager.getColor("TabbedPane.darkShadow");
                   focus = UIManager.getColor("TabbedPane.focus");
               }
            });
    }

    public static void main(String[] args) throws Exception {
        SwingUtilities.invokeLater(new TabbedPaneTest());
    }
}

特に、setTabbedPaneBorderColor() メソッドはまさに私が望んでいたことを行います (つまり、タブに含まれるパネルの境界線や、JTabbedPane が占有するスペース全体の単純な長方形の境界線ではなく、タブの周りの派手な境界線を変更します)。何らかの理由で、この例では、実際のプログラムには表示されないエラーがスローされます (SwingWorker と EDT に関連していると思います)。現在、選択したタブの背景を変更する方法を見つけようとしています。

該当物件は

UIManager.put("TabbedPane.selected",Color.MAGENTA);

ただし、tabUI でそれを使用する方法がないようです (不可解ですが、BasicTabbedPaneUI には背景の Color 変数はありません)。

編集:もっと知識のある人が良い答えを出してくれることを願っていますが、これをグーグルで検索した場合、私の現在の解決策は、選択したタブの背景色を更新する簡単な方法がないように見えるため、ニュートラルカラーを使用することです. また、ニュートラルなタブの境界線に切り替え (例に示すように更新することはできますが)、含まれる JPanels 内に色付きの境界線を作成しました。理想的ではありませんが、見た目はかなり良いので、今のところ、よりクリーンなソリューションを探し続ける時間はありません。

4

2 に答える 2

2

これは私のために働いています

            UIManager.getLookAndFeelDefaults().put("TabbedPane:TabbedPaneTab[Enabled].backgroundPainter", new BackgroundPainter(Color.white));
            UIManager.getLookAndFeelDefaults().put("TabbedPane:TabbedPaneTab[Enabled+MouseOver].backgroundPainter", new BackgroundPainter(Color.white));
            UIManager.getLookAndFeelDefaults().put("TabbedPane:TabbedPaneTab[Enabled+Pressed].backgroundPainter", new BackgroundPainter(Color.white));
            UIManager.getLookAndFeelDefaults().put("TabbedPane:TabbedPaneTab[Focused+MouseOver+Selected].backgroundPainter", new BackgroundPainter(Color.white));
            UIManager.getLookAndFeelDefaults().put("TabbedPane:TabbedPaneTab[Focused+Pressed+Selected].backgroundPainter", new BackgroundPainter(Color.white));
            UIManager.getLookAndFeelDefaults().put("TabbedPane:TabbedPaneTab[Focused+Selected].backgroundPainter", new BackgroundPainter(Color.GRAY));
            UIManager.getLookAndFeelDefaults().put("TabbedPane:TabbedPaneTab[MouseOver+Selected].backgroundPainter", new BackgroundPainter(Color.white));
            UIManager.getLookAndFeelDefaults().put("TabbedPane:TabbedPaneTab[Pressed+Selected].backgroundPainter", new BackgroundPainter(Color.white));
            UIManager.getLookAndFeelDefaults().put("TabbedPane:TabbedPaneTab[Selected].backgroundPainter", new BackgroundPainter(Color.white));

BackgroundPainter クラス

public class BackgroundPainter implements Painter<JComponent> {

  private Color color = null;

  BackgroundPainter(Color c) {
    color = c;
  }

  @Override
  public void paint(Graphics2D g, JComponent object, int width, int height) {
    if (color != null) {
        g.setColor(color);
        g.fillRect(0, 0, width - 1, height - 1);
    }
  }
}
于 2014-06-03T02:38:41.800 に答える