我的问题是基于理论的问题,但它确实满足了我的特定需求.
当你的SwingWorker抛出a)你可以预料到并且b)需要从中恢复并继续的异常时,你会怎么做,但是你想通知用户这个错误已经发生了?如何获取预期的异常并通知用户而不违反"No Swing code from doInBackground()"规则?
考虑到这个问题,我已经开发了一个SSCCE,我想提出下面的问题.
SSCCE:
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.util.concurrent.ExecutionException;
import javax.swing.JButton;
import javax.swing.JDialog;
import javax.swing.JFrame;
import javax.swing.JOptionPane;
import javax.swing.JProgressBar;
import javax.swing.SwingUtilities;
import javax.swing.SwingWorker;
public class Test {
public static void main(String args[]) {
final JFrame frame = new JFrame();
JButton go = new JButton("Go.");
go.addActionListener(new ActionListener() {
@Override
public void actionPerformed(ActionEvent e) {
new Task(frame);
}
});
frame.add(go);
frame.pack();
frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
frame.setLocationByPlatform(true);
frame.setVisible(true);
}
static class Task extends SwingWorker<Void, Void> {
JFrame …Run Code Online (Sandbox Code Playgroud) 我需要一些简单的java应用程序的帮助,它使用两个jframe来获取一些输入参数.这是我的代码草图:
//second jframe, called when the button OK of the first frame is clicked
public class NewParamJFrame extends JFrame{
...
}
//first jframe
public class StartingJFrame extends JFrame{
private static NewParamJFrame newPFrame = null;
private JTextField gnFilePath;
private JButton btnOK;
public StartingJFrame(){
//..
initComponents();
}
private void initComponents(){
btnOK.addActionListener(new ActionListener(){
public void actionPerformed(ActionEvent e){
try{
EventQueue.invokeAndWait(new Runnable(){
public void run() {
try {
newPFrame = new NewParamJFrame();
newPFrame.setVisible(true);
} catch (Exception e) {
e.printStackTrace();
}
}
});
}
catch(InvocationTargetException e2) …Run Code Online (Sandbox Code Playgroud) 有没有更优雅的方式去做我在下面做的事情?也就是说,是否有比轮询和睡眠,轮询和睡眠更优雅的方式,等等,以便知道何时Runnable.run()通过调用方法invokeLater()?
private int myMethod() {
final WaitForEventQueue waitForQueue = new WaitForEventQueue();
EventQueue.invokeLater(waitForQueue);
while (!waitForQueue.done) {
try {
Thread.sleep(10);
} catch (InterruptedException ignore) {
}
}
return 0;
}
private class WaitForEventQueue implements Runnable {
private boolean done;
public void run() {
// Let all Swing text stuff finish.
done = true;
}
}
Run Code Online (Sandbox Code Playgroud) 我的头衔有些神秘,但我无法想出一个明确的标题.
首先,两个代码片段建立一个参考点(希望我没有拼写错误):
输入 Scanner
'''
Scanner sc = new Scanner(System.in);
for (int i=0; i<10; ++ i) {
System.out.print("Please input a value:");
String answer = sc.next();
// do something with this string
}
...
Run Code Online (Sandbox Code Playgroud)
输入JOptionPane:
...
for (int i=0; i<10; ++ i) {
String answer = JOptionPane.showInputDialog("Please input a value");
// do something with this string
{
Run Code Online (Sandbox Code Playgroud)
因此,在上面的示例中,我们要求用户输入固定次数的值.如何在Swing应用程序中实现相同类型的功能?
我可以创建一个JFramewith JPanel(作为其内容窗格)并添加JLabel(带有提示符)和JTextField此面板.我还可以为ActionListener文本字段创建哪个ActionPerformed方法来检索值并对其进行处理.字符串处理不是一个长期运行的任务,所以我不相信我需要一个单独的工作线程.
由于我们无法真正强迫用户做任何事情,我计划使用javax.swing.Timer …