为什么Java Swing JProgressBar在Nimbu Look and Feel中无法正常工作? [英] Why Java Swing JProgressBar is not working properly in Nimbu Look and Feel?

查看:126
本文介绍了为什么Java Swing JProgressBar在Nimbu Look and Feel中无法正常工作?的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

我正在开发一个简单的java项目,它遍历指定的目录并找到冗余文件。除了一件事以外的一切都工作正常,我使用JProgressBar来显示目录跨越的状态。它与其他外观和感觉一起工作得很好但是,当我设置我最喜欢的Nimbus Look& Feel时,进度条没有显示进度的填充颜色。我设置进度条来绘制字符串。字符串显示(3%,5%......)。我是java的新手。

I am working on one simple java project which traverses through the specified directory and finds the redundant files. Everything except one thing is working fine, I am using JProgressBar to show the status of directory spanning. It is working just fine with other look and feels but, when I set my favourite "Nimbus Look & Feel", the progress bar is not showing the fill color of progress. I set the progress bar to paint the string along. The string is showing up(3%, 5%...). I am new to look and feels in java.

代码我用来更新进度条...

Code I used to update the progress bar...

private synchronized void updateProgress(long length)
{
        prog = prog + (length/onePart);

        if(prog>100)
            prog = 100;

        addLog((int)prog + " % completed.");

        SwingUtilities.invokeLater(new Runnable() 
        {
            @Override
            public void run() {
                progress.setValue((int)prog);
                progress.setString((int)prog+" %");
                progress.update(progress.getGraphics());
            }
        });
}

推荐答案

我再次建议你创建一个最小示例程序,如下面的代码。事实上,请随意修改此代码,以便它能够重现您的问题:

I again suggest you create a minimal example program like the code below. In fact, please feel free to modify this code so that it reproduces your problem:

import java.awt.event.KeyEvent;
import java.beans.PropertyChangeEvent;
import java.beans.PropertyChangeListener;
import java.util.Random;

import javax.swing.*;
import javax.swing.UIManager.LookAndFeelInfo;

@SuppressWarnings("serial")
public class NimbusFoo extends JPanel {
   private JProgressBar progressBar = new JProgressBar();

   public NimbusFoo() {
      progressBar.setStringPainted(true);
      add(progressBar);
      add(new JButton(new StartAction("Start", KeyEvent.VK_S)));
   }

   private class StartAction extends AbstractAction {
      public StartAction(String name, int mnemonic) {
         super(name);
         putValue(MNEMONIC_KEY, mnemonic);
      }

      public void actionPerformed(java.awt.event.ActionEvent evt) {
         final JButton btn = (JButton) evt.getSource();
         btn.setEnabled(false);

         final SwingWorker<Void, Void> mySwingWorker = new SwingWorker<Void, Void>() {
            Random random = new Random();
            private long sleepTime = 200;
            protected Void doInBackground() throws Exception {
               int progress = 0;
               setProgress(progress);

               while (progress < 100) {
                  progress += random.nextInt(5);
                  progress = Math.min(100, progress);
                  setProgress(progress);
                  Thread.sleep(sleepTime);
               }
               return null;
            };
         };
         mySwingWorker.addPropertyChangeListener(new PropertyChangeListener() {
            @Override
            public void propertyChange(PropertyChangeEvent pcEvt) {
               if ("progress".equals(pcEvt.getPropertyName())) {
                  progressBar.setValue(mySwingWorker.getProgress());
                  progressBar.setString(mySwingWorker.getProgress() + "%");
               }
               if ("state".equals(pcEvt.getPropertyName())) {
                  if (pcEvt.getNewValue() == SwingWorker.StateValue.DONE) {
                     btn.setEnabled(true);
                  }
               }
            }
         });
         mySwingWorker.execute();
      };
   }

   private static void createAndShowGui() {

      try {
         for (LookAndFeelInfo info : UIManager.getInstalledLookAndFeels()) {
            if ("Nimbus".equals(info.getName())) {
               UIManager.setLookAndFeel(info.getClassName());
               break;
            }
         }
      } catch (ClassNotFoundException e) {
         e.printStackTrace();
      } catch (InstantiationException e) {
         e.printStackTrace();
      } catch (IllegalAccessException e) {
         e.printStackTrace();
      } catch (UnsupportedLookAndFeelException e) {
         e.printStackTrace();
      }

      NimbusFoo mainPanel = new NimbusFoo();

      JFrame frame = new JFrame("Nimbus Fun");
      frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
      frame.getContentPane().add(mainPanel);
      frame.pack();
      frame.setLocationByPlatform(true);
      frame.setVisible(true);
   }

   public static void main(String[] args) {
      SwingUtilities.invokeLater(new Runnable() {
         public void run() {
            createAndShowGui();
         }
      });
   }
}

这篇关于为什么Java Swing JProgressBar在Nimbu Look and Feel中无法正常工作?的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆