2015-02-04 2 views
2

У меня есть JProgressBar, называемый игровым званием. Я цвет панели до зеленого. Это затрудняет просмотр текста, поэтому я хочу, чтобы цвет текста внутри JProgressBar был черным.Set JProgressBar TEXT цвет

Я читал, что вы можете использовать UIManager для установки глобального цвета JProgressBars, но я хочу сделать это только для этого (и другого, но это не имеет значения).

Я также читал HERE, что мой единственный другой вариант - изменить класс JProgressBar. Как я могу это сделать?

+0

Вы должны соблюдать осторожность и внешний вид, который вы используете! (Разные взгляды и ощущения означают разные реакции .. После того, как вы установили бар StringPainted() .. и .setForeground (цвет. (Ваш выбор), если вы не видите реакции use barname.setOpaque (true); – crAlexander

ответ

0

Вы можете установить setStringPainted свойство верно:

progressBar.setStringPainted(true); 
progressBar.setForeground(Color.blue); 
progressBar.setString("10%"); 
+0

Свойство setStringPainted определяет, будет ли строка отображаться на индикаторе выполнения, а не нарисована ли строка другим цветом. – Whims

4

Глядя на исходный код, то это не будет легко.

Цвет хранится в BasicProgressBarUI класса:

  • В конструкторе цвет извлекается из UIManager с использованием статического метода. Статический метод означает, что вы не можете перезаписать вызов.
  • Цвета хранятся как частные поля, а класс раскрывает только защищенные геттеры, нет сеттеров. Никакие сеттеры не означает, что вы не можете называть это извне.

ProgressBarUI экземпляр, который используется для JProgressBar является производным от UIManager (UIManager#getUI), что опять-таки статический метод.

Это оставляет нам не так много вариантов. То, что я думаю, что это жизнеспособный один заключается в использовании JProgressBar#setUI метод:

  • Это позволяет Вам создать свой собственный экземпляр пользовательского интерфейса
  • Это позволяет переопределить защищенные добытчиками

Главный недостаток этого подхода заключается в том, что он требует, чтобы вы знали фронт, который будет выглядеть и чувствовать ваше приложение. Например, если приложение использует металл, это станет

JProgressBar progressBar = ... ; 
ProgressBarUI ui = new MetalProgressBarUI(){ 
    /** 
    * The "selectionForeground" is the color of the text when it is painted 
    * over a filled area of the progress bar. 
    */ 
    @Override 
    protected Color getSelectionForeground() { 
    //return your custom color here 
    } 
    /** 
    * The "selectionBackground" is the color of the text when it is painted 
    * over an unfilled area of the progress bar. 
    */ 
    @Override 
    protected Color getSelectionBackground() 
    //return your custom color here 
    } 
} 
progressBar.setUI(ui); 

Не 100% довольны этим решением в связи с главным недостатком того, чтобы знать вид и ощущение вверх-вперед.

+0

Я не уверен, что такое внешний вид. Если я действительно не использую это, измените ли это что-нибудь? –

+0

У вас есть/использовать LookAndFeel, хотите ли вы этого или нет. Это внешний вид, который определяет, как выглядят ваши компоненты – Robin