Управление цветом в панели вкладок Java
Я схожу с ума, пытаясь понять это.
Я пытаюсь выделить светло-синий фон, который появляется в JTabbedPane. Я перепробовал все, и, кажется, ничего не работает.
Ниже мой код. Если вы запустите его, он покажет вкладку, когда она выбрана, с голубым фоном и синей рамкой сверху. Я хочу контролировать этот цвет. Но как?
import java.awt.*;
import java.awt.event.*;
import javax.swing.*;
import javax.swing.event.*;
import javax.swing.plaf.ColorUIResource;
public class Main extends JFrame {
JTabbedPane tab=new JTabbedPane();
public Main() {
setSize(300,300);
setTitle("Test Tab pane");
tab.add("First",new myPanel("First"));
tab.add("Second",new myPanel("Second"));
tab.add("Third",new myPanel("Third"));
tab.add("Fourth",new myPanel("Fourth"));
tab.addChangeListener(new ChangeTab());
getContentPane().add(tab,BorderLayout.CENTER);
setVisible(true);
for(int i=0;i<tab.getTabCount();i++){
if(i != tab.getSelectedIndex())
tab.setBackgroundAt(i,Color.orange);
tab.setForeground(Color.BLACK);
}
tab.setOpaque(true);
UIManager.put("TabbedPane.contentAreaColor ",ColorUIResource.GREEN);
UIManager.put("TabbedPane.selected",ColorUIResource.GREEN);
UIManager.put("TabbedPane.background",ColorUIResource.GREEN);
UIManager.put("TabbedPane.shadow",ColorUIResource.GREEN);
}
public static void main(String[] args) {
Main main = new Main();
}
class ChangeTab implements ChangeListener{
public void stateChanged(ChangeEvent e){
tab.validate();
System.out.println(tab.getSelectedIndex());
for(int i=0;i<tab.getTabCount();i++){
if(i != tab.getSelectedIndex())
tab.setBackgroundAt(i,Color.orange);
}
}
}
class myPanel extends JPanel{
public myPanel(String str){
add(new JLabel(str));
}
}
}
3 ответа
Я использовал ваш пример кода, и то, что мне помогло, это переместить вызовы в UIManager.put()
до точки, где они будут выполнены до выполнения конструктора JTabbedPane.
public class Main extends JFrame {
JTabbedPane tab;
public Main() {
// ... other stuff
UIManager.put("TabbedPane.contentAreaColor ",ColorUIResource.GREEN);
UIManager.put("TabbedPane.selected",ColorUIResource.GREEN);
UIManager.put("TabbedPane.background",ColorUIResource.GREEN);
UIManager.put("TabbedPane.shadow",ColorUIResource.GREEN);
// now construct the tabbed pane
tab=new JTabbedPane();
// ... other stuff
}
Также доступны некоторые другие свойства (по крайней мере для Metal L&F):
UIManager.put("TabbedPane.borderColor", Color.RED);
UIManager.put("TabbedPane.darkShadow", ColorUIResource.RED);
UIManager.put("TabbedPane.light", ColorUIResource.RED);
UIManager.put("TabbedPane.highlight", ColorUIResource.RED);
UIManager.put("TabbedPane.focus", ColorUIResource.RED);
UIManager.put("TabbedPane.unselectedBackground", ColorUIResource.RED);
UIManager.put("TabbedPane.selectHighlight", ColorUIResource.RED);
UIManager.put("TabbedPane.tabAreaBackground", ColorUIResource.RED);
UIManager.put("TabbedPane.borderHightlightColor", ColorUIResource.RED);
Они позволяют вам контролировать большинство цветов в области вкладок.
Я обнаружил, что с этими настройками все еще была очень маленькая сине-серая рамка вокруг содержимого. Я искал, как установить этот цвет безрезультатно. Единственное решение, которое я мог найти, чтобы избавиться от этого, было:
UIManager.put("TabbedPane.contentBorderInsets", new Insets(0, 0, 0, 0));
Что является неоптимальным решением.
Проверьте результаты с этими значениями.
UIManager.put("TabbedPane.contentAreaColor", Color.GREEN);
UIManager.put("TabbedPane.light", ColorUIResource.GREEN);
UIManager.put("TabbedPane.highlight", ColorUIResource.GREEN);
UIManager.put("TabbedPane.shadow", ColorUIResource.GREEN);
UIManager.put("TabbedPane.darkShadow", ColorUIResource.GREEN);
UIManager.put("TabbedPane.selected", ColorUIResource.GREEN);
UIManager.put("TabbedPane.borderHightlightColor", ColorUIResource.GREEN);
Как вы можете видеть, единственный способ получить темную рамку на верху панели нужного цвета - это установить для borderHightlightColor желаемый цвет. К сожалению, это имеет побочные эффекты, которые можно увидеть (зеленая рамка вокруг всех вкладок). И все же, между зелеными линиями на заднем плане есть серая линия.
Я думаю, что единственным реальным решением этого является переопределение вашего MetalTabbedPaneUI. Если вы устанавливаете только contentAreaColor и делаете пустые переопределения для методов
paintContentBorderTopEdge(g, tabPlacement, selectedIndex, x, y, w, h);
paintContentBorderLeftEdge(g, tabPlacement, selectedIndex, x, y, w, h);
paintContentBorderBottomEdge(g, tabPlacement, selectedIndex, x, y, w, h);
paintContentBorderRightEdge(g, tabPlacement, selectedIndex, x, y, w, h);
результат должен быть близок к тому, который, я подозреваю, вы хотите получить.
Попытка 2: я исправил проблему с границами и изменил внешний вид менеджера. Это все еще не совсем то, что вы ищете, хотя..
import java.awt.*;
import java.awt.event.*;
import javax.swing.*;
import javax.swing.event.*;
import javax.swing.plaf.ColorUIResource;
public class Main extends JFrame {
JTabbedPane tab=new JTabbedPane();
public Main() {
setBackground(Color.white);
setSize(300,300);
setTitle("Test Tab pane");
tab.add("First",new myPanel("First"));
tab.add("Second",new myPanel("Second"));
tab.add("Third",new myPanel("Third"));
tab.add("Fourth",new myPanel("Fourth"));
tab.addChangeListener(new ChangeTab());
tab.setBackground(Color.white);
tab.setForeground(Color.black);
tab.setBorder(BorderFactory.createEmptyBorder());
getContentPane().add(tab,BorderLayout.CENTER);
setVisible(true);
}
public static void main (String[] args) throws Exception {
UIManager.setLookAndFeel(
UIManager.getSystemLookAndFeelClassName());
Main main = new Main();
}
class ChangeTab implements ChangeListener{
public void stateChanged(ChangeEvent e){
tab.validate();
System.out.println(tab.getSelectedIndex());
}
}
class myPanel extends JPanel{
public myPanel(String str){
setBackground(Color.white);
setBorder(BorderFactory.createEmptyBorder());
add(new JLabel(str));
}
}
}