mop*_*opr 1 java swing multithreading jlabel
我尝试每秒将它移动到右边(x ++)
我尝试用线程移动它..
继续我试试..
public class help {
JFrame frame = new JFrame();
JLabel label = new JLabel("target");
public help() {
frame.setDefaultCloseOperation(JFrame.DISPOSE_ON_CLOSE);
frame.setSize(800,600);
frame.setLayout(new GridLayout());
frame.add(label);
label.setPreferredSize(new Dimension(100,100));
label.setLocation(400, 300);
frame.getContentPane().validate();
frame.repaint();
frame.setVisible(true);
mysterious();
}
void mysterious(){
////////////////////////////////
// part of edit responding David kroukamp
Thread t = new Thread(new Runnable() {
@Override
public void run() {
try{
for (int z=0; z<10; z++){
label.setLocation((label.getLocationOnScreen().x+10), label.getLocationOnScreen().y);
Thread.sleep(1000);
}
}catch(Exception ae){
}
}
});
t.start();
//////////////////////////////
}
public static void main(String[]args){
new help();
}
}
Run Code Online (Sandbox Code Playgroud)
非常感谢任何帮助
HelpEvent Dispatch ThreadThread像这样创建一个new :
Thread t = new Thread(new Runnable() {
@Override
public void run() {
//work here
}
});
t.start();//start thread
Run Code Online (Sandbox Code Playgroud)但是我建议一个Swing Timer,因为它运行在EDT:
编辑:
根据你的问题,我建议使用Timer创建线程点是为了一般知识.
问题是线程不在您的swing GUI的EDT线程上运行,其中Timer:
int delay = 1000; //milliseconds
ActionListener taskPerformer = new ActionListener() {
int count=0;
public void actionPerformed(ActionEvent evt) {
if(count==10) {//we did the task 10 times
((Timer)evt.getSource()).stop();
}
label.setLocation((label.getLocationOnScreen().x+10), label.getLocationOnScreen().y);
System.out.println(SwingUtilities.isEventDispatchThread());
count++;
}
};
new Timer(delay, taskPerformer).start();
Run Code Online (Sandbox Code Playgroud)
参考: