Java JOptionPane.showMessageDialog是否等待单击“确定”?
这可能是我忽略的一件非常简单的事情,但我似乎无法理解 我有以下更新JTable的方法:Java JOptionPane.showMessageDialog是否等待单击“确定”?,java,swing,jtable,keylistener,joptionpane,Java,Swing,Jtable,Keylistener,Joptionpane,这可能是我忽略的一件非常简单的事情,但我似乎无法理解 我有以下更新JTable的方法: class TableModel extends AbstractTableModel { public void updateTable() { try { // update table here ... } catch (NullPointerException npe) {
class TableModel extends AbstractTableModel {
public void updateTable() {
try {
// update table here
...
} catch (NullPointerException npe) {
isOpenDialog = true;
JOptionPane.showMessageDialog(null, "No active shares found on this IP!");
isOpenDialog = false;
}
}
}
但是,在按下消息对话框上的OK按钮之前,我不希望将isOpenDialog
boolean设置为false,因为如果用户按下enter键,它将激活文本字段上的KeyListener
事件,如果设置为false
,它将再次触发整个代码块
部分KeyListener代码如下所示:
public class KeyReleased implements KeyListener {
...
@Override
public void keyReleased(KeyEvent ke) {
if(txtIPField.getText().matches(IPADDRESS_PATTERN)) {
validIP = true;
} else {
validIP = false;
}
if (ke.getKeyCode() == KeyEvent.VK_ENTER) {
if (validIP && !isOpenDialog) {
updateTable();
}
}
}
}
JOptionPane.showMessageDialog()
是否有某种机制,在按下OK按钮之前阻止执行下一行?谢谢。试试这个
catch(NullPointerException ex){
Thread t = new Thread(new Runnable(){
public void run(){
isOpenDialog = true;
JOptionPane.setMessageDialog(Title,Content);
}
});
t.start();
t.join(); // Join will make the thread wait for t to finish its run method, before
executing the below lines
isOpenDialog = false;
}
JOptionPane创建一个模式对话框,因此在处理该对话框(按下其中一个按钮或关闭菜单按钮)之前,不会调用超出该对话框的行
更重要的是,你不应该使用KeyListener来做这类事情。如果您想让JTextField监听是否按enter键,请向其添加一个ActionListener。满足您需要的一个简单解决方法是使用showMessageDialog(),这使您可以从用户处获取输入,然后继续进行类似操作。请看一下这个示例程序,以便澄清:-)
Swing操作(例如打开对话框)应该在EventDispatcherThreadAgree with noise中发生:这种代码不属于Swing应用程序,因为它完全忽略了Swing线程规则。甚至我也同意Swing操作必须在Event Dispatcher线程中发生,如main()swing应用程序中的方法在事件调度程序线程中调度GUI的构造并退出。但书中所描述的规则是为了理想世界,有时你需要成为一个叛逆者才能完成工作。你的意识形态是有缺陷的,@KumarVivekMitra。
import javax.swing.*;
public class JOptionExample
{
public static void main(String... args)
{
SwingUtilities.invokeLater(new Runnable()
{
public void run()
{
int selection = JOptionPane.showConfirmDialog(
null
, "No active shares found on this IP!"
, "Selection : "
, JOptionPane.OK_CANCEL_OPTION
, JOptionPane.INFORMATION_MESSAGE);
System.out.println("I be written" +
" after you close, the JOptionPane");
if (selection == JOptionPane.OK_OPTION)
{
// Code to use when OK is PRESSED.
System.out.println("Selected Option is OK : " + selection);
}
else if (selection == JOptionPane.CANCEL_OPTION)
{
// Code to use when CANCEL is PRESSED.
System.out.println("Selected Option Is CANCEL : " + selection);
}
}
});
}
}
You can get acces to the OK button if you create optionpanel and custom dialog. Here's an example of this kind of implementation:
/*
* To change this template, choose Tools | Templates
* and open the template in the editor.
*/
/**
*
* @author OZBORN
*/
public class TestyDialog {
static JFrame okno;
static JPanel panel;
/**
* @param args the command line arguments
*/
public static void main(String[] args) {
zrobOkno();
JButton przycisk =new JButton("Dialog");
przycisk.setSize(200,200);
panel.add(przycisk,BorderLayout.CENTER);
panel.setCursor(null);
BufferedImage cursorImg = new BufferedImage(16, 16, BufferedImage.TYPE_INT_ARGB);
przycisk.setCursor(Toolkit.getDefaultToolkit().createCustomCursor(
cursorImg, new Point(0, 0), "blank cursor"));
final JOptionPane optionPane = new JOptionPane(
"U can close this dialog\n"
+ "by pressing ok button, close frame button or by clicking outside of the dialog box.\n"
+"Every time there will be action defined in the windowLostFocus function"
+ "Do you understand?",
JOptionPane.INFORMATION_MESSAGE,
JOptionPane.DEFAULT_OPTION);
System.out.println(optionPane.getComponentCount());
przycisk.addActionListener(new ActionListener(){
@Override
public void actionPerformed(ActionEvent e) {
final JFrame aa=new JFrame();
final JDialog dialog = new JDialog(aa,"Click a button",false);
((JButton)((JPanel)optionPane.getComponents()[1]).getComponent(0)).addActionListener(new ActionListener() {
@Override
public void actionPerformed(ActionEvent e) {
aa.dispose();
}
});
dialog.setContentPane(optionPane);
dialog.pack();
dialog.addWindowFocusListener(new WindowFocusListener() {
@Override
public void windowLostFocus(WindowEvent e) {
System.out.println("Zamykam");
aa.dispose();
}
@Override public void windowGainedFocus(WindowEvent e) {}
});
dialog.setVisible(true);
}
});
}
public static void zrobOkno(){
okno=new JFrame("Testy okno");
okno.setLocationRelativeTo(null);
okno.setSize(200,200);
okno.setPreferredSize(new Dimension(200,200));
okno.setVisible(true);
okno.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
panel=new JPanel();
panel.setPreferredSize(new Dimension(200,200));
panel.setLayout(new BorderLayout());
okno.add(panel);
}
}