Java Swing循环进度条无法正常工作

我从Oracle站点发现了这个测试项目 ,因为我想在我的项目中添加一个循环进度条。

我正在使用Netbeans开发应用程序,当我启动应用程序时,应该是圆圈的JPanel ….令人失望。

我删除了所有无法解决此问题的代码,我已经得到了这段代码:

import java.awt.*; import java.awt.event.ActionEvent; import java.awt.event.ActionListener; import java.beans.PropertyChangeEvent; import javax.swing.*; import javax.swing.plaf.LayerUI; public class Loading_Test extends javax.swing.JFrame { static final WaitLayerUI layerUI = new WaitLayerUI(); public Loading_Test() { JPanel panel = new JPanel(); JLayer jlayer = new JLayer(panel, layerUI); add(jlayer); initComponents(); } @SuppressWarnings("unchecked") private void initComponents() { setDefaultCloseOperation(javax.swing.WindowConstants.EXIT_ON_CLOSE); javax.swing.GroupLayout layout = new javax.swing.GroupLayout(getContentPane()); getContentPane().setLayout(layout); layout.setHorizontalGroup( layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING) .addGap(0, 400, Short.MAX_VALUE) ); layout.setVerticalGroup( layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING) .addGap(0, 300, Short.MAX_VALUE) ); pack(); } public static void main(String args[]) { java.awt.EventQueue.invokeLater(new Runnable() { @Override public void run() { JFrame frame = new Loading_Test(); frame.setVisible(true); layerUI.start(); } }); } } class WaitLayerUI extends LayerUI implements ActionListener { private boolean mIsRunning; private boolean mIsFadingOut; private Timer mTimer; private int mAngle; private int mFadeCount; private int mFadeLimit = 15; @Override public void paint(Graphics g, JComponent c) { int w = c.getWidth(); int h = c.getHeight(); // Paint the view. super.paint(g, c); if (!mIsRunning) { return; } Graphics2D g2 = (Graphics2D) g.create(); float fade = (float) mFadeCount / (float) mFadeLimit; // Gray it out. Composite urComposite = g2.getComposite(); g2.setComposite(AlphaComposite.getInstance(AlphaComposite.SRC_OVER, .5f * fade)); g2.fillRect(0, 0, w, h); g2.setComposite(urComposite); // Paint the wait indicator. int s = Math.min(w, h) / 5; int cx = w / 2; int cy = h / 2; g2.setRenderingHint(RenderingHints.KEY_ANTIALIASING, RenderingHints.VALUE_ANTIALIAS_ON); g2.setStroke(new BasicStroke(s / 4, BasicStroke.CAP_ROUND, BasicStroke.JOIN_ROUND)); g2.setPaint(Color.white); g2.rotate(Math.PI * mAngle / 180, cx, cy); for (int i = 0; i = 360) { mAngle = 0; } if (mIsFadingOut) { if (--mFadeCount == 0) { mIsRunning = false; mTimer.stop(); } } else if (mFadeCount < mFadeLimit) { mFadeCount++; } } } public void start() { if (mIsRunning) { return; } // Run a thread for animation. mIsRunning = true; mIsFadingOut = false; mFadeCount = 0; int fps = 24; int tick = 1000 / fps; mTimer = new Timer(tick, this); mTimer.start(); } public void stop() { mIsFadingOut = true; } @Override public void applyPropertyChange(PropertyChangeEvent pce, JLayer l) { if ("tick".equals(pce.getPropertyName())) { l.repaint(); } } } 

如果你“按原样”运行这个代码,你应该有同样的问题,JPanel没有显示。

但我发现如果我删除与布局相关的行(27~36),进度条就会开始工作。

您还必须手动设置窗口大小添加

 setSize(300, 300); 

 pack(); 

因为布局线是由Netbeans自动生成的,所以我试图了解如何解决这个问题,因为这些特定的代码行被Netbeans编辑器阻止编辑。

我有一天失去了它仍然没有工作….我将在JLabel上使用动画GIF ….故事结束!

@Robin有重要的信息,看起来像你受限于使用GuiBulder ……,那么我不想发表评论,结果是

在此处输入图像描述

从一点点修改代码

 import java.awt.*; import java.awt.event.ActionEvent; import java.awt.event.ActionListener; import java.beans.PropertyChangeEvent; import javax.swing.*; import javax.swing.plaf.LayerUI; public class Loading_Test { static final WaitLayerUI layerUI = new WaitLayerUI(); JFrame frame = new JFrame("JLayer With Animated Gif"); public Loading_Test() { JPanel panel = new JPanel() { @Override public Dimension getPreferredSize() { return new Dimension(400, 300); } }; JLayer jlayer = new JLayer<>(panel, layerUI); frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); frame.add(jlayer); frame.pack(); frame.setVisible(true); layerUI.start(); } public static void main(String args[]) { java.awt.EventQueue.invokeLater(new Runnable() { @Override public void run() { Loading_Test loading_Test = new Loading_Test(); } }); } } class WaitLayerUI extends LayerUI implements ActionListener { private boolean mIsRunning; private boolean mIsFadingOut; private Timer mTimer; private int mAngle; private int mFadeCount; private int mFadeLimit = 15; @Override public void paint(Graphics g, JComponent c) { int w = c.getWidth(); int h = c.getHeight(); super.paint(g, c); // Paint the view. if (!mIsRunning) { return; } Graphics2D g2 = (Graphics2D) g.create(); float fade = (float) mFadeCount / (float) mFadeLimit; Composite urComposite = g2.getComposite(); // Gray it out. g2.setComposite(AlphaComposite.getInstance(AlphaComposite.SRC_OVER, .5f * fade)); g2.fillRect(0, 0, w, h); g2.setComposite(urComposite); int s = Math.min(w, h) / 5;// Paint the wait indicator. int cx = w / 2; int cy = h / 2; g2.setRenderingHint(RenderingHints.KEY_ANTIALIASING, RenderingHints.VALUE_ANTIALIAS_ON); g2.setStroke(new BasicStroke(s / 4, BasicStroke.CAP_ROUND, BasicStroke.JOIN_ROUND)); g2.setPaint(Color.white); g2.rotate(Math.PI * mAngle / 180, cx, cy); for (int i = 0; i < 12; i++) { float scale = (11.0f - (float) i) / 11.0f; g2.drawLine(cx + s, cy, cx + s * 2, cy); g2.rotate(-Math.PI / 6, cx, cy); g2.setComposite(AlphaComposite.getInstance( AlphaComposite.SRC_OVER, scale * fade)); } g2.dispose(); } @Override public void actionPerformed(ActionEvent e) { if (mIsRunning) { firePropertyChange("tick", 0, 1); mAngle += 3; if (mAngle >= 360) { mAngle = 0; } if (mIsFadingOut) { if (--mFadeCount == 0) { mIsRunning = false; mTimer.stop(); } } else if (mFadeCount < mFadeLimit) { mFadeCount++; } } } public void start() { if (mIsRunning) { return; } mIsRunning = true;// Run a thread for animation. mIsFadingOut = false; mFadeCount = 0; int fps = 24; int tick = 1000 / fps; mTimer = new Timer(tick, this); mTimer.start(); } public void stop() { mIsFadingOut = true; } @Override public void applyPropertyChange(PropertyChangeEvent pce, JLayer l) { if ("tick".equals(pce.getPropertyName())) { l.repaint(); } } } 
  • 必须添加两个JButtons ,一个用于开始,第二个用于停止(显示和隐藏动画Gig)

  • 不要伪造JPanel已经实现了FlowLayout ,非常接受PreferredSize来自它的孩子,

通过SwingLabs的 Swing Components Extension找到了一个更好的简单(和工作)解决方案

JXBusyLabel

有一个完全集成的插件与NetBeans的编辑器,所以使用起来非常简单

从你的问题和评论JLayer ,你在Netbeans中实现JLayer遇到了问题,我建议然后去寻找一个CardLayout ,它允许你在正常的JPanel和带有微调器的 JPanel之间切换。

这是一个简单的教程: CardLayout With Netbeans