2013-06-20 7 views
9

Je travaille depuis un certain temps avec JProgressBar en utilisant WindowsLookAndFeel, mais je l'ai trouvé quelques différences majeures de la barre de progression natif:JProgressBar de Windows LAF


Voici la barre native, dans son état normal:

enter image description here

Bien que ce soit de Java:

enter image description here

Un œil aiguisé peut voir les java, la couleur blanche du dessus beaucoup plus claire, et le vert un peu plus clair aussi. Le natif est également "rempli" tandis que Java a une bordure vide.


Maintenant, l'indéterminé native:

enter image description here

Et de Java:

enter image description here

Le scintillement est beaucoup plus court, et beaucoup plus rapide (non représenté). De même que l'indigène pourrait ressembler à une lueur, Java ressemble beaucoup à une "comète" (avec une queue, seulement d'un côté ...).


Et ma dernière question, la barre bloquée:

enter image description here

cela peut-il être fait en Java?

+0

barre bloquée avec la couleur rouge ont été résolus ici quelques fois, y compris les couleurs de Rainbow dans JProgressBar, s'il vous plaît quel objectif ???, seulement pour créer des couleurs similaires à Win7, notez la plupart des utilisateurs pour changer le thème Color in Win (inc. moi == Orange), sur le point de créer indéterminé, n'est pas un problème en quelque sorte, la recherche dans @trashgod – mKorbel

+0

meilleur de l'article sur JProgressBar sont dans les messages par @aterai, doivent utiliser GradientPaint au lieu de couleurs solides – mKorbel

Répondre

5
  • Ceci est juste un exemple pour la dernière question:
    • Windows 7 (barre de progression verte)
    • 1.7.0_25 JDK (WindowsLookAndFeel)

TurnProgressBarRedTest

import java.awt.*; 
import java.awt.event.*; 
import java.awt.image.*; 
import java.beans.*; 
import javax.swing.*; 
import javax.swing.plaf.LayerUI; 

public class TurnProgressBarRedTest { 
    public JComponent makeUI() { 
    final BoundedRangeModel model = new DefaultBoundedRangeModel(); 
    final BlockedColorLayerUI layerUI = new BlockedColorLayerUI(); 
    final JPanel p = new JPanel(new GridLayout(4, 1, 12, 12)); 
    p.setBorder(BorderFactory.createEmptyBorder(24,24,24,24)); 

    final JProgressBar pb1 = new JProgressBar(model); 
    pb1.setStringPainted(true); 
    p.add(pb1); 
    final JProgressBar pb2 = new JProgressBar(model); 
    pb2.setStringPainted(true); 
    p.add(pb2); 

    p.add(new JProgressBar(model)); 
    p.add(new JLayer<JProgressBar>(new JProgressBar(model), layerUI)); 

    JPanel box = new JPanel(); 
    box.add(new JButton(new AbstractAction("+10") { 
     private int i = 0; 
     @Override public void actionPerformed(ActionEvent e) { 
     model.setValue(i = (i>=100) ? 0 : i + 10); 
     } 
    })); 
    //http://msdn.microsoft.com/en-us/library/windows/desktop/aa511486.aspx 
    box.add(new JCheckBox(new AbstractAction(
     "<html>Turn the progress bar red<br />"+ 
     " when there is a user recoverable condition<br />"+ 
     " that prevents making further progress.") { 
     @Override public void actionPerformed(ActionEvent e) { 
     boolean b = ((JCheckBox)e.getSource()).isSelected(); 
     pb2.setForeground(b? new Color(255,0,0,100) : pb1.getForeground()); 
     layerUI.isPreventing = b; 
     p.repaint(); 
     } 
    })); 

    JPanel panel = new JPanel(new BorderLayout()); 
    panel.add(p, BorderLayout.NORTH); 
    panel.add(box, BorderLayout.SOUTH); 
    return panel; 
    } 
    public static void main(String[] args) { 
    EventQueue.invokeLater(new Runnable() { 
     @Override public void run() { 
     createAndShowGUI(); 
     } 
    }); 
    } 
    public static void createAndShowGUI() { 
    try { 
     UIManager.setLookAndFeel(UIManager.getSystemLookAndFeelClassName()); 
    } catch(Exception e) { 
     e.printStackTrace(); 
    } 
    JFrame f = new JFrame(); 
    f.setDefaultCloseOperation(WindowConstants.EXIT_ON_CLOSE); 
    f.getContentPane().add(new TurnProgressBarRedTest().makeUI()); 
    f.setSize(320, 240); 
    f.setLocationRelativeTo(null); 
    f.setVisible(true); 
    } 
} 
class BlockedColorLayerUI extends LayerUI<JProgressBar> { 
    public boolean isPreventing = false; 
    private BufferedImage bi; 
    private int prevw = -1; 
    private int prevh = -1; 
    @Override public void paint(Graphics g, JComponent c) { 
    if(isPreventing) { 
     JLayer jlayer = (JLayer)c; 
     JProgressBar progress = (JProgressBar)jlayer.getView(); 
     int w = progress.getSize().width; 
     int h = progress.getSize().height; 

     if(bi==null || w!=prevw || h!=prevh) { 
     bi = new BufferedImage(w, h, BufferedImage.TYPE_INT_ARGB); 
     } 
     prevw = w; 
     prevh = h; 

     Graphics2D g2 = bi.createGraphics(); 
     super.paint(g2, c); 
     g2.dispose(); 

     Image image = c.createImage(
         new FilteredImageSource(bi.getSource(), 
         new RedGreenChannelSwapFilter())); 
     g.drawImage(image, 0, 0, null); 
    } else { 
     super.paint(g, c); 
    } 
    } 
} 
class RedGreenChannelSwapFilter extends RGBImageFilter { 
    @Override public int filterRGB(int x, int y, int argb) { 
    int r = (int)((argb >> 16) & 0xff); 
    int g = (int)((argb >> 8) & 0xff); 
    int b = (int)((argb  ) & 0xff); 
    return (argb & 0xff000000) | (g<<16) | (r<<8) | (b); 
    } 
} 
+0

C'est ce que ressemble à Windows 8.1: http://i.imgur.com/nUYsSkB.png Malheureusement, cela ne fonctionne pas très bien. – RAnders00