Java 漫长的过程和中期结果
我有功能Java 漫长的过程和中期结果,java,swing,user-interface,Java,Swing,User Interface,我有功能 公共字符串名称函数(){ while(true){ StringBuilder a=新的StringBuilder(); //做点什么 返回a; } } 现在我想创建GUI和JButton 但我想在单击此按钮后,在每次循环后从namefunction()获取结果。我怎么做 public void actionPerformed(ActionEvent e){ 如果(e.getSource().equals(myButton1)){ tekst4.setText(namefunctio
公共字符串名称函数(){
while(true){
StringBuilder a=新的StringBuilder();
//做点什么
返回a;
}
}
现在我想创建GUI和JButton
但我想在单击此按钮后,在每次循环后从namefunction()
获取结果。我怎么做
public void actionPerformed(ActionEvent e){
如果(e.getSource().equals(myButton1)){
tekst4.setText(namefunction());
}
}
这里是一个非常基本的示例,使用SwingWorker
从长while
循环中接收和显示中间和最终结果。(为了方便和简单,可以将整个代码复制粘贴到
SwingMain.java
并运行)
导入java.awt.BorderLayout;
导入java.awt.Dimension;
导入java.util.List;
导入java.util.concurrent.ExecutionException;
导入javax.swing.DefaultListModel;
导入javax.swing.JButton;
导入javax.swing.JFrame;
导入javax.swing.JLabel;
导入javax.swing.JList;
导入javax.swing.JPanel;
导入javax.swing.SwingWorker;
公务舱SwingMain{
公共静态void creategui(){
JFrame f=新JFrame(“SwingWorker演示”);
f、 setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
f、 setLocationRelativeTo(空);
f、 添加(新的TestPanel());
f、 包装();
f、 setVisible(真);
}
公共静态void main(字符串[]args){
creategui();
}
}
类TestPanel扩展了JPanel{
私有最终默认列表模型列表模型;
私家侦探;
私人最终JLabel最终结果;
私人最终按钮启动;
测试面板(){
setLayout(新边界布局(2,2));
开始=新的JButton(“开始”);
addActionListener(e->start());
添加(开始,BorderLayout.PAGE_开始);
listModel=新的DefaultListModel();
JList interimResults=新的JList(listModel);
interimResults.setPreferredSize(新维度(150200));
添加(interimResults,BorderLayout.CENTER);
finalResults=新的JLabel(“-等待最终结果-”);
添加(最终结果,边框布局。第页\结束);
}
私有void start(){
start.setEnabled(false);;
swingWorker=新的MyWorker();
swingWorker.execute();
}
/*阶级摇摆工人
T-此SwingWorker的返回的结果类型
doInBackground和get方法
V-该SwingWorker的操作员用于执行中间结果的类型
发布和处理方法
*/
类MyWorker扩展了SwingWorker{
//长过程(工作)是用这种方法完成的
@凌驾
受保护的字符串doInBackground()引发异常{
int计数器=0;
StringBuilder结果=新建StringBuilder();
while(计数器<10){
append(String.valueOf(counter));
发布(result.toString());//临时结果
计数器++;
睡眠(500);
}
返回result.toString();//结束结果
}
//此方法用于处理临时“已发布”结果列表
@凌驾
受保护的无效进程(列表块){
for(字符串s:块){
listModel.addElement;
}
}
//完成时调用
@凌驾
受保护的void done(){
试一试{
setText(“最终结果:+get());
}捕获(InterruptedException | ExecutionException ex){
例如printStackTrace();
}
}
}
}
此函数是否将作为线程的一部分运行?@MitchelPaulin没有代码不是“作为线程的一部分运行”。如果函数在while块中返回(无条件地如上所述),则while无效,您可以将其删除。不,需要此“while”。但是这个函数中的代码太长了,我想向您展示一下它的总体工作原理。您可以使用
publish
方法获得中间结果,使用done
获得最终结果。
import java.awt.BorderLayout;
import java.awt.Dimension;
import java.util.List;
import java.util.concurrent.ExecutionException;
import javax.swing.DefaultListModel;
import javax.swing.JButton;
import javax.swing.JFrame;
import javax.swing.JLabel;
import javax.swing.JList;
import javax.swing.JPanel;
import javax.swing.SwingWorker;
public class SwingMain {
public static void creategui(){
JFrame f = new JFrame("SwingWorker Demo");
f.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
f.setLocationRelativeTo(null);
f.add(new TestPanel());
f.pack();
f.setVisible(true);
}
public static void main(String[] args) {
creategui();
}
}
class TestPanel extends JPanel {
private final DefaultListModel<String> listModel;
private MyWorker swingWorker;
private final JLabel finalResults;
private final JButton start;
TestPanel() {
setLayout(new BorderLayout(2, 2));
start = new JButton("Start");
start.addActionListener(e->start());
add(start, BorderLayout.PAGE_START);
listModel = new DefaultListModel<>();
JList<String> interimResults = new JList<>(listModel);
interimResults.setPreferredSize(new Dimension(150,200));
add(interimResults, BorderLayout.CENTER);
finalResults = new JLabel("- waiting for final results - ");
add(finalResults, BorderLayout.PAGE_END);
}
private void start() {
start.setEnabled(false);;
swingWorker = new MyWorker();
swingWorker.execute();
}
/*Class SwingWorker<T,V>
T - the result type returned by this SwingWorker's
doInBackground and get methods
V - the type used for carrying out intermediate results by this SwingWorker's
publish and process methods
*/
class MyWorker extends SwingWorker<String, String> {
//long process (work) is done in this method
@Override
protected String doInBackground() throws Exception {
int counter = 0;
StringBuilder result = new StringBuilder();
while(counter < 10){
result.append(String.valueOf(counter));
publish(result.toString()); //interim result
counter++;
Thread.sleep(500);
}
return result.toString(); //end result
}
//This method is processing List of interim "published" results
@Override
protected void process(List< String> chunks) {
for (String s : chunks) {
listModel.addElement(s);
}
}
//invoked when done
@Override
protected void done() {
try {
finalResults.setText("Final result: "+ get());
} catch (InterruptedException | ExecutionException ex) {
ex.printStackTrace();
}
}
}
}