Продолжая устанавливать цвета текста JProgressBar, я хотел бы иметь возможность устанавливать цвета текста JProgressBar
в моей программе в зависимости от состояния процесса и не отходить от внешнего вида системы.
Из одного из ответов на настройку цветов текста JProgressBar выглядит так, что я могу устанавливать только цвета текста, не меняя пользовательский интерфейс на один набор значений, поэтому я мог выбирать нейтральные значения, которые выглядят прилично независимо от переднего плана и прогресса, но я хотел бы полностью настроить JProgressBar
.
Ниже приведен пример кода с тремя взглядами и ощущениями, которые пытаются переключиться с "хорошего" на "плохой". Очевидно, что BasicProgressBarUI
можно полностью переключить, но по умолчанию "Металл по умолчанию" и "Система" не могут быть назначены разные значения по умолчанию при создании, но после их создания они выглядят исправленными.
SSCCE:
import java.awt.BorderLayout;
import java.awt.Color;
import java.awt.FlowLayout;
import javax.swing.JFrame;
import javax.swing.JPanel;
import javax.swing.JProgressBar;
import javax.swing.UIManager;
import javax.swing.UnsupportedLookAndFeelException;
import javax.swing.plaf.basic.BasicProgressBarUI;
@SuppressWarnings("serial")
public class ProgressBarTester extends JFrame {
public ProgressBarTester() {
super( "Progress Bar Tester" );
setLayout( new BorderLayout() );
JPanel goodPanel = new JPanel( new FlowLayout() );
goodPanel.setLayout( new FlowLayout() );
JPanel badPanel = new JPanel( new FlowLayout() );
badPanel.setLayout( new FlowLayout() );
JProgressBar plainBarG = new JProgressBar();
plainBarG.setValue( 50 );
plainBarG.setStringPainted( true );
plainBarG.setForeground( Color.green.darker() );
plainBarG.setUI( new BasicProgressBarUI() {
protected Color getSelectionBackground() {
return Color.green.darker();
}
protected Color getSelectionForeground() {
return Color.white;
}
} );
goodPanel.add( plainBarG );
JProgressBar plainBarB = new JProgressBar();
plainBarB.setValue( 50 );
plainBarB.setStringPainted( true );
plainBarB.setForeground( Color.red.darker() );
plainBarB.setUI( new BasicProgressBarUI() {
protected Color getSelectionBackground() {
return Color.red.darker();
}
protected Color getSelectionForeground() {
return Color.black;
}
} );
badPanel.add( plainBarB );
UIManager.put( "ProgressBar.selectionForeground", Color.white );
UIManager.put( "ProgressBar.selectionBackground", Color.green.darker() );
JProgressBar javaDefaultG = new JProgressBar();
javaDefaultG.setValue( 50 );
javaDefaultG.setStringPainted( true );
javaDefaultG.setForeground( Color.green.darker() );
goodPanel.add( javaDefaultG );
UIManager.put( "ProgressBar.selectionForeground", Color.black );
UIManager.put( "ProgressBar.selectionBackground", Color.red.darker() );
JProgressBar javaDefaultB = new JProgressBar();
javaDefaultB.setValue( 50 );
javaDefaultB.setStringPainted( true );
javaDefaultB.setForeground( Color.red.darker() );
badPanel.add( javaDefaultB );
try {
UIManager.setLookAndFeel( UIManager.getSystemLookAndFeelClassName() );
} catch (ClassNotFoundException e) {
// TODO Auto-generated catch block
e.printStackTrace();
} catch (InstantiationException e) {
// TODO Auto-generated catch block
e.printStackTrace();
} catch (IllegalAccessException e) {
// TODO Auto-generated catch block
e.printStackTrace();
} catch (UnsupportedLookAndFeelException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
UIManager.put( "ProgressBar.selectionForeground", Color.white );
UIManager.put( "ProgressBar.selectionBackground", Color.green.darker() );
JProgressBar systemG = new JProgressBar();
systemG.setValue( 50 );
systemG.setStringPainted( true );
systemG.setForeground( Color.green.darker() );
goodPanel.add( systemG );
UIManager.put( "ProgressBar.selectionForeground", Color.black );
UIManager.put( "ProgressBar.selectionBackground", Color.red.darker() );
JProgressBar systemB = new JProgressBar();
systemB.setValue( 50 );
systemB.setStringPainted( true );
systemB.setForeground( Color.red.darker() );
badPanel.add( systemB );
this.add( goodPanel, BorderLayout.NORTH );
this.add( badPanel, BorderLayout.SOUTH );
pack();
setVisible( true );
try {
Thread.sleep( 2000 );
} catch (InterruptedException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
plainBarG.setForeground( Color.red.darker() );
plainBarG.setUI( new BasicProgressBarUI() {
protected Color getSelectionBackground() {
return Color.red.darker();
}
protected Color getSelectionForeground() {
return Color.black;
}
} );
plainBarB.setForeground( Color.green.darker() );
plainBarB.setUI( new BasicProgressBarUI() {
protected Color getSelectionBackground() {
return Color.green.darker();
}
protected Color getSelectionForeground() {
return Color.white;
}
} );
javaDefaultG.setForeground( Color.red.darker() );
javaDefaultB.setForeground( Color.green.darker() );
systemG.setForeground( Color.red.darker() );
systemB.setForeground( Color.green.darker() );
}
public static void main(String[] args) {
new ProgressBarTester();
}
}
Как показано в SSCCE, можно независимо устанавливать цвета текста, но не делать это динамически. Все JProgressBar
начинаются с какой-то формы "хорошего" или "нейтрального" статуса и могут в конечном итоге перейти на "плохой" статус.
Как вы заметили, делегат пользовательского интерфейса контролирует, как он использует указанные цвета. Хотя обновление цветов динамически поверхностно привлекательно, оно предлагает проблемы удобства использования в отношении оттенка и контраста. Вместо этого рассмотрите возможность добавления динамически окрашенной Border
или Icon
. Пример первого рассматриваются здесь; Пример последнего рассматриваются здесь.
PropertyChangeEvent
, например , чтобы уведомить вспомогательный индикатор.