SwingWorker
5315 단어 Java
App.java:
import javax.swing.SwingUtilities;
public class App {
/**
* @param args
*/
public static void main(String[] args) {
SwingUtilities.invokeLater(new Runnable() {
@Override
public void run() {
new MainFrame("SwingWorker Demo");
}
});
}
}
MainFrame.java:
import java.awt.GridBagConstraints;
import java.awt.GridBagLayout;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.util.List;
import java.util.concurrent.ExecutionException;
import javax.swing.JButton;
import javax.swing.JFrame;
import javax.swing.JLabel;
import javax.swing.SwingWorker;
public class MainFrame extends JFrame {
private JLabel countLabel1 = new JLabel("0");
private JLabel statusLabel = new JLabel("Task not completed.");
private JButton startButton = new JButton("Start");
public MainFrame(String title) {
super(title);
setLayout(new GridBagLayout());
GridBagConstraints gc = new GridBagConstraints();
gc.fill = GridBagConstraints.NONE;
gc.gridx = 0;
gc.gridy = 0;
gc.weightx = 1;
gc.weighty = 1;
add(countLabel1, gc);
gc.gridx = 0;
gc.gridy = 1;
gc.weightx = 1;
gc.weighty = 1;
add(statusLabel, gc);
gc.gridx = 0;
gc.gridy = 2;
gc.weightx = 1;
gc.weighty = 1;
add(startButton, gc);
startButton.addActionListener(new ActionListener() {
public void actionPerformed(ActionEvent arg0) {
start();
}
});
setSize(200, 400);
setDefaultCloseOperation(EXIT_ON_CLOSE);
setVisible(true);
}
private void start() {
// Use SwingWorker and return null from doInBackground if
// you don't want any final result and you don't want to update the GUI
// as the thread goes along.
// First argument is the thread result, returned when processing finished.
// Second argument is the value to update the GUI with via publish() and process()
SwingWorker worker = new SwingWorker() {
@Override
/*
* Note: do not update the GUI from within doInBackground.
*/
protected Boolean doInBackground() throws Exception {
// Simulate useful work
for(int i=0; i<30; i++) {
Thread.sleep(100);
System.out.println("Hello: " + i);
// optional: use publish to send values to process(), which
// you can then use to update the GUI.
publish(i);
}
return false;
}
@Override
// This will be called if you call publish() from doInBackground()
// Can safely update the GUI here.
protected void process(List chunks) {
Integer value = chunks.get(chunks.size() - 1);
countLabel1.setText("Current value: " + value);
}
@Override
// This is called when the thread finishes.
// Can safely update GUI here.
protected void done() {
try {
Boolean status = get();
statusLabel.setText("Completed with status: " + status);
} catch (InterruptedException e) {
// TODO Auto-generated catch block
e.printStackTrace();
} catch (ExecutionException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
};
worker.execute();
}
}
SwingWorker 의 첫 번 째 template argument: doInBackground 방법의 반환 형식, get 방법의 반환 값 형식
template argument 에 서 는 Void (void 에 대응 하 는 클래스) 만 사용 할 수 있 습 니 다.Void 를 사용 하면 doInBackground 방법 은 null 로 돌아 가 야 합 니 다.
template argument 에 서 는 class 만 사용 할 수 있 고 primitive type 을 사용 할 수 없습니다.
SwingWorker 의 두 번 째 template argument: publish 방법의 매개 변수 유형, process 방법 매개 변수 List 의 일반적인 유형.doInBackground 방법 을 실행 하 는 동시에 update GUI 는 doInBackground 방법 에서 publish 방법 을 호출 한 다음 override process 방법 을 사용 합 니 다.
process 방법의 매개 변 수 는 List 입 니 다. doInBackground 방법 에서 Publish 를 호출 할 때마다 process 방법 이 호출 되 는 것 은 아니 기 때 문 입 니 다.이 List 는 매번 publish 의 내용 을 저장 합 니 다.process 방법 에 서 는 GUI safely 를 업데이트 할 수 있 습 니 다.process 방법 은 EDT 에서 배 치 됩 니 다.
모든 SwingWorker 대상 은 execute 한 번 만 가능 하 며, 다시 실행 해 야 한다 면 대상 을 다시 만 들 수 있 습 니 다.
doInBackground 방법 중 update GUI 가 안전 하지 않 습 니 다.doInBackground 방법 은 exception 을 throw 할 수 있 습 니 다.done 방법 중 catch 가 가능 합 니 다.
done 방법 은 이 thread 가 끝 날 때 실 행 됩 니 다. done 방법 에 서 는 GUI safely 를 업데이트 할 수 있 습 니 다.
get 방법 은 doInBackground 방법의 반환 값 을 얻 습 니 다. 만약 doInBackground 가 아직 실행 되 지 않 았 다 면 get 방법 wait.
이 내용에 흥미가 있습니까?
현재 기사가 여러분의 문제를 해결하지 못하는 경우 AI 엔진은 머신러닝 분석(스마트 모델이 방금 만들어져 부정확한 경우가 있을 수 있음)을 통해 가장 유사한 기사를 추천합니다:
JPA + QueryDSL 계층형 댓글, 대댓글 구현(2)이번엔 전편에 이어서 계층형 댓글, 대댓글을 다시 리팩토링해볼 예정이다. 이전 게시글에서는 계층형 댓글, 대댓글을 구현은 되었지만 N+1 문제가 있었다. 이번에는 그 N+1 문제를 해결해 볼 것이다. 위의 로직은 이...
텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
CC BY-SA 2.5, CC BY-SA 3.0 및 CC BY-SA 4.0에 따라 라이센스가 부여됩니다.