2013-06-20 12 views
9

pracuję na chwilę z JProgressBar wykorzystaniem WindowsLookAndFeel, ale znalazłem kilka istotnych różnic od natywnego pasku postępu:JProgressBar Okna LAF


Oto rodzimy bar, w zwykłym stanie:

enter image description here

Chociaż jest to Java:

enter image description here

Ostre oko może widzieć java, górny biały kolor jest znacznie jaśniejszy, a zielony trochę jaśniejszy. Również native jest "wypełniony", podczas gdy Java ma pustą granicę.


Teraz rodzimy nieokreślony:

enter image description here

A Java:

enter image description here

Migotanie jest znacznie krótsza i znacznie znacznie szybciej (nie pokazano). Również, ponieważ rdzenny może wyglądać jak blask, Java wygląda jak "kometa" (z ogonem, tylko z jednej strony ...).


I moje ostatnie pytanie, blokowany bar:

enter image description here

Można to zrobić w Java?

+0

zablokowany pasek z czerwonym kolorem zostały rozwiązane tutaj kilka razy, w tym Kolory z tęczy w JProgressBar, proszę cel whats ?, tylko w celu stworzenia podobnego schematu kolorów jak w Win7, zauważ, że większość użytkowników zmieni kolor w motywu Win (inc. me == Orange), do utworzenia nieokreślonego, nie jest jakoś problem, szukaj w poście przez @trashgod – mKorbel

+0

najlepiej posta o JProgressBar są w postach @aterai, należy użyć GradientPaint zamiast jednolitych kolorów – mKorbel

Odpowiedz

5
  • Jest to tylko przykład na ostatnie pytanie:
    • Windows 7 (zielony pasek postępu)
    • JDK 1.7.0_25 (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

To jest to, co wygląda jak w Windows 8.1: http://i.imgur.com/nUYsSkB.png Niestety nie działa tak dobrze. – RAnders00

Powiązane problemy