Я пытаюсь изменить цвет границы JTabbedPane на основе выбранной вкладки. Используя ответы here и on the web, я сумел это:JTabbedPanel изменить выбранный цвет фона вкладки
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).
Редактировать: Надеюсь, кто-то более осведомленный придет с хорошим ответом, но если вы поймете это в googled, мое текущее решение должно использовать нейтральный цвет для фона фона выбранной вкладки, поскольку, похоже, нет простого способа его обновления. Я также переключился на нейтральную границу вкладки (даже если вы МОЖЕТЕ обновить это, как показывает пример) и создал цветные границы внутри содержащихся JPanels. Это не идеальный вариант, но он выглядит неплохо, и у меня нет времени продолжать поиски более чистого решения на данный момент.