2013-06-20 19 views
9

Tôi đã làm việc trong một thời gian với JProgressBar sử dụng WindowsLookAndFeel, nhưng tôi tìm thấy một số khác biệt lớn từ thanh tiến trình tự nhiên:JProgressBar của Windows LAF


Dưới đây là thanh bản xứ, trong trạng thái bình thường của nó:

enter image description here

Trong khi đây là Java:

enter image description here

Một con mắt sắc bén có thể thấy màu của java, màu trắng sáng hơn nhiều và màu xanh lá cây sáng hơn một chút. Cũng bản địa là "đầy" trong khi Java có một đường viền rỗng.


Bây giờ, không xác định nguồn gốc:

enter image description here

Và Java:

enter image description here

Các nhấp nháy là ngắn hơn nhiều, và nhiều hơn nhanh hơn nhiều (không hiển thị). Cũng như bản địa có thể trông giống như một ánh sáng, Java trông giống như một "sao chổi" (với một cái đuôi, chỉ từ một bên ...).


Và câu hỏi cuối cùng của tôi, thanh chặn:

enter image description here

này có thể được thực hiện trong Java?

+0

thanh bị chặn với màu đỏ đã được giải quyết ở đây một vài lần, bao gồm cả màu sắc từ cầu vồng trong JProgressBar, xin vui lòng whats mục tiêu ???, chỉ để tạo ra màu sắc tương tự như trong Win7, chú ý nhất o người dùng thay đổi màu trong Win chủ đề (inc. tôi == Màu cam), sắp tạo không xác định, không phải là vấn đề bằng cách nào đó, tìm kiếm trong bài đăng bằng @trashgod – mKorbel

+0

bài đăng hay nhất về JProgressBar nằm trong bài đăng của @aterai, phải sử dụng GradientPaint thay vì Màu sắc rắn – mKorbel

Trả lời

5
  • Đây chỉ là một ví dụ cho câu hỏi cuối cùng:
    • Windows 7 (thanh tiến trình màu xanh lá cây)
    • 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

Đây là những gì nó trông giống như trong Windows 8.1: http://i.imgur.com/nUYsSkB.png Thật không may là nó không hoạt động tốt. – RAnders00