Java swing Loader 图片显示不正确?
Java swing Loader image not displaying properly?
我试过下面的代码。
功能-
- 单击按钮
- 它将调用一个需要一些时间来处理的方法。
- 需要显示加载程序图像,以便用户可以看到正在进行的处理。
我在下面尝试过,但是如果方法调用之前的 loaderLabel1.setVisible(true);
不显示图像,如果我们评论 loaderLabel1.setVisible(false);
那么它会在方法完成后显示加载器图像。
actionPerformed
方法是否会在 Label 完成之前不将可见性应用于 Label?如果是的话,这个问题还有其他选择吗?
import java.awt.EventQueue;
import java.awt.GridLayout;
import java.awt.event.ActionEvent;
import javax.swing.AbstractAction;
import javax.swing.ImageIcon;
import javax.swing.JButton;
import javax.swing.JFrame;
import javax.swing.JLabel;
import javax.swing.JPanel;
public class TestLoader extends JPanel{
static ImageIcon loading1 = new ImageIcon("D:\WORKSPACE\STUDY\images\ajax-loader.gif");
static JLabel loaderLabel1 = new JLabel(loading1, JLabel.CENTER);
public TestLoader(){
super(new GridLayout(0, 1));
System.out.println("---------TEST ------");
JPanel submitPanel = new JPanel();
submitPanel.add(clearMessageButton);
this.add(submitPanel);
JPanel LOADER_PANEL = new JPanel();
loaderLabel1.setVisible(false);
LOADER_PANEL.add(loaderLabel1);
this.add(LOADER_PANEL);
}
JButton clearMessageButton = new JButton(new AbstractAction("Test Result") {
@Override
public void actionPerformed(ActionEvent arg0) {
loaderLabel1.setVisible(true);
TestMethod();
loaderLabel1.setVisible(false);
}});
public void TestMethod(){
System.out.println(" =========START TestMethod =========");
try {
Thread.currentThread().sleep(10000);
} catch (InterruptedException e) {
e.printStackTrace();
}
System.out.println(" =========complete TestMethod =========");
}
/**
* @param args
*/
public static void main(final String[] args) {
EventQueue.invokeLater(new Runnable() {
@Override
public void run() {
TestLoader pf = new TestLoader();
pf.display();
}
});
}
private void display() {
JFrame frame = new JFrame("TEST LOADER");
frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
frame.add(this);
frame.pack();
frame.setResizable(true);
frame.setLocationRelativeTo(null);
frame.setVisible(true);
}
}
有 class SwingWorker 允许您在不同的线程中执行任务;下面是如何更改代码以使用 SwingWorker 的示例:
JButton clearMessageButton = new JButton(new AbstractAction("Test Result") {
@Override
public void actionPerformed(ActionEvent arg0) {
SwingWorker worker = new SwingWorker() {
@Override
protected Object doInBackground() throws Exception {
loaderLabel1.setVisible(true);
TestMethod();
return true;
}
public void TestMethod() {
System.out.println(" =========START TestMethod =========");
try {
Thread.currentThread().sleep(10000);
} catch (InterruptedException e) {
e.printStackTrace();
}
System.out.println(" =========complete TestMethod =========");
}
protected void done() {
loaderLabel1.setVisible(false);
};
};
worker.execute();
}
});
注意在另一个线程中执行工作的方法 doInBackground() 和在 doInBackground() 完成后调用的 done()。
我试过下面的代码。 功能-
- 单击按钮
- 它将调用一个需要一些时间来处理的方法。
- 需要显示加载程序图像,以便用户可以看到正在进行的处理。
我在下面尝试过,但是如果方法调用之前的 loaderLabel1.setVisible(true);
不显示图像,如果我们评论 loaderLabel1.setVisible(false);
那么它会在方法完成后显示加载器图像。
actionPerformed
方法是否会在 Label 完成之前不将可见性应用于 Label?如果是的话,这个问题还有其他选择吗?
import java.awt.EventQueue;
import java.awt.GridLayout;
import java.awt.event.ActionEvent;
import javax.swing.AbstractAction;
import javax.swing.ImageIcon;
import javax.swing.JButton;
import javax.swing.JFrame;
import javax.swing.JLabel;
import javax.swing.JPanel;
public class TestLoader extends JPanel{
static ImageIcon loading1 = new ImageIcon("D:\WORKSPACE\STUDY\images\ajax-loader.gif");
static JLabel loaderLabel1 = new JLabel(loading1, JLabel.CENTER);
public TestLoader(){
super(new GridLayout(0, 1));
System.out.println("---------TEST ------");
JPanel submitPanel = new JPanel();
submitPanel.add(clearMessageButton);
this.add(submitPanel);
JPanel LOADER_PANEL = new JPanel();
loaderLabel1.setVisible(false);
LOADER_PANEL.add(loaderLabel1);
this.add(LOADER_PANEL);
}
JButton clearMessageButton = new JButton(new AbstractAction("Test Result") {
@Override
public void actionPerformed(ActionEvent arg0) {
loaderLabel1.setVisible(true);
TestMethod();
loaderLabel1.setVisible(false);
}});
public void TestMethod(){
System.out.println(" =========START TestMethod =========");
try {
Thread.currentThread().sleep(10000);
} catch (InterruptedException e) {
e.printStackTrace();
}
System.out.println(" =========complete TestMethod =========");
}
/**
* @param args
*/
public static void main(final String[] args) {
EventQueue.invokeLater(new Runnable() {
@Override
public void run() {
TestLoader pf = new TestLoader();
pf.display();
}
});
}
private void display() {
JFrame frame = new JFrame("TEST LOADER");
frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
frame.add(this);
frame.pack();
frame.setResizable(true);
frame.setLocationRelativeTo(null);
frame.setVisible(true);
}
}
有 class SwingWorker 允许您在不同的线程中执行任务;下面是如何更改代码以使用 SwingWorker 的示例:
JButton clearMessageButton = new JButton(new AbstractAction("Test Result") {
@Override
public void actionPerformed(ActionEvent arg0) {
SwingWorker worker = new SwingWorker() {
@Override
protected Object doInBackground() throws Exception {
loaderLabel1.setVisible(true);
TestMethod();
return true;
}
public void TestMethod() {
System.out.println(" =========START TestMethod =========");
try {
Thread.currentThread().sleep(10000);
} catch (InterruptedException e) {
e.printStackTrace();
}
System.out.println(" =========complete TestMethod =========");
}
protected void done() {
loaderLabel1.setVisible(false);
};
};
worker.execute();
}
});
注意在另一个线程中执行工作的方法 doInBackground() 和在 doInBackground() 完成后调用的 done()。