2012-01-16 3 views
9

Мне интересно, знаете ли вы, кто из вас знает, как отображать на Java хороший индикатор выполнения, в основном используя Swing, хотя я не против использовать сторонние библиотеки.Ницца, выглядящий индикатор выполнения в java

Я изучал учебники JProgressBar, но ни один из них не относится к стилизации панели. Чтение API Я нашел метод getUI, который возвращает объект ProgressBarUI, но я не вижу много способов настроить его.

Я хочу добавить закругленные углы, изменить фон и цвет переднего плана, ширину, длину, обычную.

Спасибо!

ответ

21

Если вы не хотите заменять выбранный пользователем Look & Почувствуйте, вы можете просто заменить делегат UI на один, полученный от BasicProgressBarUI.

enter image description here

import java.awt.Color; 
import java.awt.EventQueue; 
import java.awt.Graphics; 
import java.awt.Graphics2D; 
import java.awt.Rectangle; 
import java.awt.RenderingHints; 
import javax.swing.JComponent; 
import javax.swing.JFrame; 
import javax.swing.JPanel; 
import javax.swing.JProgressBar; 
import javax.swing.plaf.basic.BasicProgressBarUI; 

/** @see http://stackoverflow.com/questions/8884297 */ 
public class ProgressBarUITest extends JPanel { 

    public ProgressBarUITest() { 
     JProgressBar jpb = new JProgressBar(); 
     jpb.setUI(new MyProgressUI()); 
     jpb.setForeground(Color.blue); 
     jpb.setIndeterminate(true); 
     this.add(jpb); 
    } 

    private static class MyProgressUI extends BasicProgressBarUI { 

     private Rectangle r = new Rectangle(); 

     @Override 
     protected void paintIndeterminate(Graphics g, JComponent c) { 
      Graphics2D g2d = (Graphics2D) g; 
      g2d.setRenderingHint(
       RenderingHints.KEY_ANTIALIASING, 
       RenderingHints.VALUE_ANTIALIAS_ON); 
      r = getBox(r); 
      g.setColor(progressBar.getForeground()); 
      g.fillOval(r.x, r.y, r.width, r.height); 
     } 
    } 

    private void display() { 
     JFrame f = new JFrame("ProgressBarUITest"); 
     f.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); 
     f.add(this); 
     f.pack(); 
     f.setLocationRelativeTo(null); 
     f.setVisible(true); 
    } 

    public static void main(String[] args) { 
     EventQueue.invokeLater(new Runnable() { 

      @Override 
      public void run() { 
       new ProgressBarUITest().display(); 
      } 
     }); 
    } 
} 
+0

Спасибо за очень подробный ответ! +1 и правильный ответ: D. В любом случае, в конце я сделал это, используя JPanel с закругленными границами, перекрывая один поверх другого, так как мои «индикаторы выполнения» являются статичными, трюк делает это. Спасибо в любом случае за хороший совет, trashgod, запишут его для дальнейших ссылок. – AlejandroVK

+1

@Trashgod +1 для фрагмента. Я нашел это, глядя на то, как настроить «JProgressBar» на Google :). 1 вещь с фрагментом: в 'paintIndeterminate (..)' вы бросаете 'объект Graphic' g' в 'Graphics2D', однако u краска через 'g.fillOval (..)', поэтому отсутствует 'g2d.fillOval (. .) 'call, который создаст прямоугольную границу' JProgressBar'. –

+0

@DavidKroukamp: Хорошая добыча; хотя «унаследованные методы выполняются одинаково ... при настройках атрибутов по умолчанию», 'g2d.fill (shape)' гораздо более универсален. – trashgod

6

Самый простой способ сделать это было бы change the LookAndFeel или, возможно, даже создать свой собственный класс, расширяющий от одного из умолчанию L & Fs в и просто изменяет пользовательский интерфейс для индикатора выполнения ...

+0

Любые идеи о том, как сделать это специально для JProgressBar? – AlejandroVK

+0

@AlejandroVK сложно сказать, что вам нужно попробовать http://stackoverflow.com/questions/3954616/look-and-feel-in-java, я бы предпочел вещество, но слишком много EDT чувствительно, – mKorbel

+0

все эти кажутся излишними для моих потребностей ... спасибо в любом случае – AlejandroVK

 Смежные вопросы

  • Нет связанных вопросов^_^