当前位置: 首页 > 面试题库 >

JTabbedPane:在选项卡中显示任务进度

邬宜然
2023-03-14
问题内容

我有一个简单的Swing Java应用程序来执行搜索,结果显示在新选项卡中。搜索正在运行时,我想在选项卡的标题中显示进度图标或动画。我尝试添加gif图标,但它没有动画。有什么原因不起作用吗?


问题答案:

关于进度
条的Swing教程
(通常显示进度)是一个很好的起点。它显示了
如何使用来对工作线程执行持久操作
SwingWorker,并以一定的间隔更新UI以向用户显示
持久操作的进度。还有另一个教程可
获取有关 Swing中的and并发的更多信息。SwingWorker


与往常一样,该站点充满了示例。例如 ,我的先前
答案使用SwingWorker该类向用户显示进度

编辑

由于我错过了您问题的标签部分的标题。您可以创建一个“进度图标”,然后在标签上进行设置。该SwingWorker则可以用来更新图标。

此类图标的示例是示例进度图标,基本上是您每次取得一定进展时都会旋转的图像。带选项卡的窗格
教程向您展示了如何向选项卡添加图标(甚至使用自定义组件)

编辑2

好像我的Mac与JDK1.7结合使用,比在其他系统上显示动画gif 更加容易,所以我也创建了一个小的SSCCE,与Andrew相似,但带有一个旋转图标,看起来并不像Andrew是由“痴呆的黑猩猩”创造的,我引用了它。旋转的图标代码来自此站点(我使用了精简版本并添加了计时器)。我唯一
不满意的是需要将选项卡式窗格传递到旋转图标以进行触发。可能的解决方案是将计时器拉到
RotatingIcon课堂之外,但是,这只是一个SSCCE。图片不包括在内,但可以通过Google找到。

    import javax.swing.Icon;
    import javax.swing.ImageIcon;
    import javax.swing.JComponent;
    import javax.swing.JFrame;
    import javax.swing.JLabel;
    import javax.swing.JTabbedPane;
    import javax.swing.Timer;
    import java.awt.Component;
    import java.awt.EventQueue;
    import java.awt.Graphics;
    import java.awt.Graphics2D;
    import java.awt.Rectangle;
    import java.awt.event.ActionEvent;
    import java.awt.event.ActionListener;
    import java.awt.geom.AffineTransform;

    public class ProgressTabbedPane {

      public static void main( String[] args ) {
        EventQueue.invokeLater( new Runnable() {
          @Override
          public void run() {
            JFrame frame = new JFrame( "RotatingIcon" );
            JTabbedPane tabbedPane = new JTabbedPane(  );
            tabbedPane.addTab( "Searching", new RotatingIcon( new ImageIcon( "resources/images/progress-indeterminate.png" ), tabbedPane ),
                               new JLabel( new ImageIcon( "resources/images/rotatingIcon.gif" ) ) );
            frame.getContentPane().add( tabbedPane );
            frame.setDefaultCloseOperation( JFrame.EXIT_ON_CLOSE );
            frame.pack();
            frame.setVisible( true );
          }
        } );
      }

      private static class RotatingIcon implements Icon{
        private final Icon delegateIcon;
        private double angleInDegrees = 90;
        private final Timer rotatingTimer;
        private RotatingIcon( Icon icon, final JComponent component ) {
          delegateIcon = icon;
          rotatingTimer = new Timer( 100, new ActionListener() {
            @Override
            public void actionPerformed( ActionEvent e ) {
              angleInDegrees = angleInDegrees + 10;
              if ( angleInDegrees == 360 ){
                angleInDegrees = 0;
              }
              component.repaint();
            }
          } );
          rotatingTimer.setRepeats( false );
          rotatingTimer.start();
        }

        @Override
        public void paintIcon( Component c, Graphics g, int x, int y ) {
          rotatingTimer.stop();
          Graphics2D g2 = (Graphics2D )g.create();
          int cWidth = delegateIcon.getIconWidth() / 2;
          int cHeight = delegateIcon.getIconHeight() / 2;
          Rectangle r = new Rectangle(x, y, delegateIcon.getIconWidth(), delegateIcon.getIconHeight());
          g2.setClip(r);
          AffineTransform original = g2.getTransform();
          AffineTransform at = new AffineTransform();
          at.concatenate(original);
          at.rotate(Math.toRadians( angleInDegrees ), x + cWidth, y + cHeight);
          g2.setTransform(at);
          delegateIcon.paintIcon(c, g2, x, y);
          g2.setTransform(original);
          rotatingTimer.start();
        }

        @Override
        public int getIconWidth() {
          return delegateIcon.getIconWidth();
        }

        @Override
        public int getIconHeight() {
          return delegateIcon.getIconHeight();
        }
      } 
    }

A screenshot for reference. A shame the icons do not rotate in the screenshot.
SSCCE screenshot



 类似资料:
  • 我的web客户端应用程序正在通过FetchAPI设置HTTP POST请求。 我看到选项飞行前请求是通过调试代理(Charles proxy)发送的,但它们不会显示在Google Chrome Developer Tools\Network选项卡中。 我没有在“网络”选项卡上设置任何过滤器。我记得选项请求在那里是可见的,但不再是了。我怎么把它们带回来?

  • 我试图修改JavaFX8中的TabPage控件,使其向视口显示当前选定选项卡前面(右边)的一些选项卡,或者如果选定选项卡位于标题的最左边,它会显示当前选项卡前面附近的选项卡。 现在怎么样了: 我想让它表现得像: 当用户选择索引X的选项卡时,选项卡窗格标题显示附近的另外2或3个选项卡。 谢谢你的阅读。

  • 我在Ubuntu12.10上运行NetBeans7.3。我正在学习一门Java Web开发课程,所以我有一个名为jsage8的项目,其中包含了我为该课程所做的工作。以前,这个项目在Projects选项卡中显示得很好,但现在打开这个项目什么也做不到。当我在打开项目菜单中单击打开它时,它只是说“没有项目打开”。然而,它将打开一个不是基于web的项目的普通Java项目文件夹。目前项目中只有一个index

  • 我有一个带有5个标签的JTabbedPane。我在每个选项卡上添加了一个JPanel,比如说5个JPanel,每个选项卡上有几个组件。如果我想根据一个标志变量动态更新选项卡内容,比如替换选项卡4上的内容,我需要用新的Jpanel替换现有的面板,如何在特定的选项卡上实现这种动态更新?

  • 我在主类中有这个类,用来在我的JTabbedPane上放置一个关闭按钮。问题是,例如,我打开了三个选项卡:journal、contact和upload,而contact选项卡是当前选择的选项卡。当我尝试关闭不是选定选项卡的日记选项卡时,关闭的是当前选定的选项卡。 这就是我调用选项卡的方法: