我有一个简单的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.
我的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选项卡是当前选择的选项卡。当我尝试关闭不是选定选项卡的日记选项卡时,关闭的是当前选定的选项卡。 这就是我调用选项卡的方法: