我在程序中使用JLabel来显示讯息。比如:JLabel msg = new JLabel("Do?");
此时显示的是“Do?”,之后我想在程序运算时让它显示“procesing...”,所以我把msg.setText("processing...");这一句加入运算开始程序的前面,然后在运算结束后,显示结果的同时,显示说“done!” 我就把msg.setText("done!");这一句加在运算程序结束后。应该是这样吧?可是为什么运行后,当运算的时候不显示procesing...,直接跳到done!就不变了。这是怎么回事?啥问题呢?会有时间差的问题吗?谢谢各位帮助!!
此时显示的是“Do?”,之后我想在程序运算时让它显示“procesing...”,所以我把msg.setText("processing...");这一句加入运算开始程序的前面,然后在运算结束后,显示结果的同时,显示说“done!” 我就把msg.setText("done!");这一句加在运算程序结束后。应该是这样吧?可是为什么运行后,当运算的时候不显示procesing...,直接跳到done!就不变了。这是怎么回事?啥问题呢?会有时间差的问题吗?谢谢各位帮助!!
时间太短 所以你看 不到processing而直接跳到DONE
你可以在显示processing后加一局
Thread.sleep(1000);
让程序睡眠一秒
就可以看到效果了
就直接Thread.sleep(300)吧..在processing之后.
你没能看到啊
加个sleep()就可以了啊
for(int i = 0; i<10000000; i++)
{
i + = 1;
}
你就可以看到效果了或者把运算放入一个线程里,执行之后让线程sleep一下
msg所在面板Jpanel.repaint()看看效果
msg = new JLabel("Do?");
msg.setHorizontalAlignment(JLabel.LEFT);
msgPanel.add(msg);
cont.add(msgPanel, BorderLayout.SOUTH);利用一个JButton来开始运算:
class ActionListener implements ActionListener {
public void actionPerformed(ActionEvent e) {
msg.setText("processing..."); //我就是加在这里,从开始运算想显示processing...//以下是大家建议的都试过了,不管用,按下按钮后界面好像失去响应,button变色,直到运算完成后恢复正常。但从头到尾显示done.
// progressPanel.repaint();
// for(int i = 0; i<10000000; i++)
// {
// i += 1;
// }
angle = ((Number) spinnerA.getValue()).intValue();
N = ((Number) spinnerN.getValue()).doubleValue();
K = Math.exp(((Number) spinnerK.getValue()).doubleValue());
processImage();
}
}
public void processImage()
{
imgSel.setEnabled(false);
spinnerA.setEnabled(false);
spinnerN.setEnabled(false);
spinnerK.setEnabled(false);
imgRestaured = new ImagePlus("",img[imgNumber].getProcessor().duplicate());
FiltradoWiener.transformImage(imgRestaured, angle, (int)N, N, K);
restaurationLabel.setIcon(new ImageIcon(imgRestaured.getImage()));
spinnerA.setEnabled(true);
spinnerN.setEnabled(true);
spinnerK.setEnabled(true);
imgSel.setEnabled(true);
msg.setText("Done"); //按说应该在所有计算完成后这里显示Done.
}
还哪里有可能不对吗?谢谢
下面是我写的一个小例子,你看看你要的是不是这种效果package demo;import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.awt.event.FocusEvent;
import java.awt.event.FocusListener;import javax.swing.JButton;
import javax.swing.JFrame;
import javax.swing.JLabel;
import javax.swing.JPanel;
import javax.swing.SwingConstants;public class DemoForAngle extends JFrame implements Runnable{ JLabel doLabel;
JButton button;
Thread thread=new Thread(this);
/**
* Launch the application
* @param args
*/
public static void main(String args[]) {
try {
DemoForAngle frame = new DemoForAngle();
frame.setVisible(true);
} catch (Exception e) {
e.printStackTrace();
}
} /**
* Create the frame
*/
public DemoForAngle() {
super();
getContentPane().setLayout(null);
setBounds(100, 100, 353, 278);
setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); final JPanel panel = new JPanel();
panel.setLayout(null);
panel.setBounds(0, 0, 343, 240);
getContentPane().add(panel);
doLabel = new JLabel();
doLabel.setHorizontalAlignment(SwingConstants.CENTER);
doLabel.setText("Do?");
doLabel.setBounds(96, 61, 145, 43);
doLabel.addFocusListener(new doLabelFocusListener());
panel.add(doLabel);
button = new JButton();
button.addActionListener(new ActionListener() {
public void actionPerformed(ActionEvent e) {
doLabel.setText("processing...");
doLabel.requestFocusInWindow();
}
});
button.setText("运算");
button.setBounds(115, 151, 99, 23);
panel.add(button); }
private void doSomeThing()
{
//这里写你要进行数据处理代码
}
class doLabelFocusListener implements FocusListener
{
public void focusGained(FocusEvent e) {
doSomeThing();
try {
//该时间可根据实际进行修改
thread.sleep(3000);
} catch (InterruptedException e1) {
e1.printStackTrace();
}
button.requestFocusInWindow();
}
public void focusLost(FocusEvent e) {
doLabel.setText("Done");
} }
public void run()
{
}
}
import javax.swing.JFrame;
import javax.swing.JLabel;public class LabelDisplayTest extends JFrame { private JLabel label = new JLabel(); public LabelDisplayTest() {
this.getContentPane().add(this.label);
this.label.setText("Do?");
} @SuppressWarnings("static-access")
public void test() {
Thread t = new Thread(new Runnable() {
public void run() {
label.setText("Processing...");
}
});
try {
t.sleep(3000);
} catch (InterruptedException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
t.start();
try {
t.sleep(3000);
} catch (InterruptedException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
t.stop();
label.setText("Done.");
} /**
* @param args
*/
public static void main(String[] args) {
LabelDisplayTest ldt = new LabelDisplayTest();
ldt.setVisible(true);
ldt.setSize(200, 200);
ldt.setDefaultCloseOperation(EXIT_ON_CLOSE);
ldt.test();
}}
而且在button.requestFocusInWindow(); 开始出现error。
天哪!没那么复杂啊,这次怎么总出问题。会是什么问题呢?不胜感激!
thread.sleep(3000); 改为thread.sleep(1000);或更小,这样可能很快就看到效果了,
如果button.requestFocusInWindow(); 出错可以试试
button.requestFocus(true);
或者你把error贴出来我看看啊
public class Applet3Botton extends JApplet {
JPanel progressPanel;
JButton button;
public void init() {
progressPanel = new JPanel();
progressPanel.setBackground(new Color(192,204,226));
progressPanel.setLayout(new GridLayout(2,1)); JButton button = new JButton("DO?");
button_restaurar.addActionListener(new ActionListener()
{
public void actionPerformed(ActionEvent e) {
msg.setText("processing...");
msg.requestFocus();
}
}
);
controlPanel.add(button); msg = new JLabel("Hello!");
msg.setHorizontalAlignment(JLabel.LEFT);
msg.addFocusListener(new msgLabelFocusListener());
progressPanel.add(msg); cont.add(progressPanel, BorderLayout.SOUTH);
} class msgLabelFocusListener implements FocusListener
{
public void focusGained(FocusEvent e)
{
processImage();//这个sleep是必须要吗?我的计算时间够显示processing,是不是就不需要了?
// try {
//
// thread.sleep(3000);
// } catch (InterruptedException e1)
// {
// e1.printStackTrace();
// }
button.requestFocus(true);
}
public void focusLost(FocusEvent e)
{
msg.setText("Done");
}
} public void processImage()
{
}
}现在情况是这样的:
运行applet后,显示Hi
点击button后,显示processing...并开始计算
计算完成后,界面上会显示结果,但是仍然是processing...,不显示done. 但是如果点击界面上其它组件,比如我的界面上还有JSpinner和JComboBox,点击它们,才会显示done.另外,还有一个问题,在计算完成后,不是继续显示processing吗,但是如果这个时候把窗口缩小化,再打开,会显示done,但是同时会自动重新进行一遍计算。这是怎么回事啊?这里是运行出现的错误:Exception in thread "AWT-EventQueue-1" java.lang.NullPointerException
at applets.Applet3Botton$msgLabelFocusListener.focusGained(Applet3Botton.java:189)
at java.awt.Component.processFocusEvent(Component.java:5390)
at java.awt.Component.processEvent(Component.java:5257)
at java.awt.Container.processEvent(Container.java:1966)
at java.awt.Component.dispatchEventImpl(Component.java:3968)
at java.awt.Container.dispatchEventImpl(Container.java:2024)
at java.awt.Component.dispatchEvent(Component.java:3803)
at java.awt.KeyboardFocusManager.redispatchEvent(KeyboardFocusManager.java:1826)
at java.awt.DefaultKeyboardFocusManager.typeAheadAssertions(DefaultKeyboardFocusManager.java:845)
at java.awt.DefaultKeyboardFocusManager.dispatchEvent(DefaultKeyboardFocusManager.java:485)
at java.awt.Component.dispatchEventImpl(Component.java:3841)
at java.awt.Container.dispatchEventImpl(Container.java:2024)
at java.awt.Component.dispatchEvent(Component.java:3803)
at java.awt.EventQueue.dispatchEvent(EventQueue.java:463)
at java.awt.EventDispatchThread.pumpOneEventForHierarchy(EventDispatchThread.java:242)
at java.awt.EventDispatchThread.pumpEventsForHierarchy(EventDispatchThread.java:163)
at java.awt.EventDispatchThread.pumpEvents(EventDispatchThread.java:157)
at java.awt.EventDispatchThread.pumpEvents(EventDispatchThread.java:149)
at java.awt.EventDispatchThread.run(EventDispatchThread.java:110)不胜感激!!!!!
”这是因为我是利用的是控件的焦点事件来控制程序的,因此当你将焦点再次给JLabel的时候, focusGained(FocusEvent e)中的程序自动执行, “如果点击界面上其它组件,比如我的界面上还有JSpinner和JComboBox,点击它们,才会显示done.
”的原因也是一样,那你可以改用别的事件监听来实现,有时间我再给你写个例子
at applets.Applet3Botton$msgLabelFocusListener.focusGained(Applet3Botton.java:189)”吗?
应该是在自动执行 focusGained();时有对象未赋值吧!如果你是用了下面语句的话可能是thread为null,
// try {
//
// thread.sleep(3000);
// } catch (InterruptedException e1)
// {
// e1.printStackTrace();
// }
这句话的意思就是让当前线程休眠3秒。如果你计算函数的运行时间大于2秒即可以让用户看到由processing...到Done的变化,可以不写这个,但要写的话,你的类要实现Runnable接口才行
其实Swing中有很多控件的监听器可以用在这里实现你的目的,你可以考虑用别的监听器来实现,我这里就是利用了一个焦点时间来实现的,即焦点在JLabel是进行计算,计算完成后将焦点赋给别的控件这样可以使
public void focusLost(FocusEvent e)
{
msg.setText("Done");
}
自动执行,也就是相当与加了一个监听器,当你计算完成后执行计算完成后的处理代码,你可以试试别的方法实现这一功能!
JAVA资料太多?选中想收藏的文字(图片),右键选“收录到易载”,搞定!
控件监听器接口有
Action, ActionListener, AdjustmentListener, AncestorListener, AWTEventListener, BeanContextMembershipListener, BeanContextServiceRevokedListener, BeanContextServices, BeanContextServicesListener, CaretListener, CellEditorListener, ChangeListener, ComponentListener, ConnectionEventListener, ContainerListener, ControllerEventListener, DocumentListener, DragGestureListener, DragSourceListener, DragSourceMotionListener, DropTargetListener, FlavorListener, FocusListener, HandshakeCompletedListener, HierarchyBoundsListener, HierarchyListener, HyperlinkListener, IIOReadProgressListener, IIOReadUpdateListener, IIOReadWarningListener, IIOWriteProgressListener, IIOWriteWarningListener, InputMethodListener, InternalFrameListener, ItemListener, KeyListener, LineListener, ListDataListener, ListSelectionListener, MenuDragMouseListener, MenuKeyListener, MenuListener, MetaEventListener, MouseInputListener, MouseListener, MouseMotionListener, MouseWheelListener, NamespaceChangeListener, NamingListener, NodeChangeListener, NotificationListener, ObjectChangeListener, PopupMenuListener, PreferenceChangeListener, PropertyChangeListener, RowSetListener, SSLSessionBindingListener, TableColumnModelListener, TableModelListener, TextListener, TreeExpansionListener, TreeModelListener, TreeSelectionListener, TreeWillExpandListener, UndoableEditListener, UnsolicitedNotificationListener, VetoableChangeListener, WindowFocusListener, WindowListener, WindowStateListener
楼主可以通过查询JDK文档看看
MouseListener, MouseMotionListener, MouseWheelListener(鼠标), WindowFocusListener, WindowListener, WindowStateListener(窗口),ItemListener, KeyListener(键盘)
楼主的"SetText()"问题是否已解决?