在DbInterface类中,函数openDB()打开与服务器上Oracle数据库的连接。出于安全原因,用户必须在程序继续进行连接之前在JFrame文本区输入密码。现在这个Jframe有一个动作侦听器,它等待用户输入密码并调用OpenDBContinue()方法。Java:如何使用线程等待来自用户的IO,然后继续
现在的问题是:openDB()不等待Jframe IO完成并假设数据库已打开,将控制权返回给调用类(调用openDB()的任何人),然后继续并开始查询数据库显然失败!
现在我该如何让openframe()在Jframe IO上等待完成?这是给你一个想法的代码。
public void openDB(int inFileInx,String inRemoteDBURLFull) throws FileNotFoundException
{
if(this.password!=null)
try
{ openDBcontinue(inFileInx,inRemoteDBURLFull);
}
catch(Exception exp)
{ DpmLogger.dtlException("SPDBInterfaceException:OpenDB", exp);
}
else {
passwd = new JFrame();
passwd.setLocation(SpdMain.bTabbedPanel.getWidth()/2,SpdMain.bTabbedPanel.getHeight()/2);
passwd.setTitle("Enter Passwd for user "+username);
JPasswordField p =new JPasswordField(10);
p.addActionListener(this);
p.setActionCommand(inFileInx+","+inRemoteDBURLFull);
passwd.add(p);
passwd.setPreferredSize(new Dimension(300,50));
passwd.pack();
passwd.setVisible(true);
pass=new Thread(new Runnable()
{
public void run() {
DpmLogger.dtlTraceOut("The password thread has completed and has got password from the user",DpmLogger.TRACE_RARE,myId);
}
});
try {
pass.join();
} catch (InterruptedException e)
{
DpmLogger.dtlTraceOut("Password thread unable to join",DpmLogger.TRACE_RARE,myId);
}
DpmLogger.dtlTraceOut("Password thread now joined",DpmLogger.TRACE_RARE,myId);
}
}
public void actionPerformed(ActionEvent e)
{ JTextField p=(JTextField)e.getSource();
if(password==null)
password=p.getText();
passwd.setVisible(false);
String[] inVars=e.getActionCommand().split(",");
try
{ openDBcontinue(Integer.parseInt(inVars[0]),inVars[1]);
pass.start();
}
catch(Exception exp)
{ DpmLogger.dtlException("SPDBInterfaceException:OpenDB", exp);
}
}
正如你所看到的,我试图让方法在join()的'pass'线程上等待。动作侦听器在IO完成时启动传递线程。但它不起作用。 OpenDB()无需等待'pass'即可运行。这是因为该方法不在线程内?我是否必须使此DBInterface类扩展Thread类?我很困惑!
退房How to Make Dialogs什么是错了['JDialog'](http://docs.oracle.com/javase/tutorial/uiswing/components/dialog html的)? – MadProgrammer
所有事件都在一个单独的线程(事件调度程序线程)中进行处理。我想你正在应用'pass.join()'在错误的线程中(这使**当前**线程等待通过完成),而你想在JFrame IO上等待完成。如果有任何耗时的处理,你应该考虑'SwingWorker',例如,以便你的UI不会冻结 –
哦,对不起,我使用JPasswordField(你可以在代码中看到它)。我一定忘记提及,但那不是我的问题 – Sid