【问题标题】:Alert window until method finishes execution in Swing警告窗口,直到方法在 Swing 中完成执行
【发布时间】:2013-09-07 15:11:45
【问题描述】:

显示的图像是我使用Swing 制作的窗口。

当我单击Submit 按钮时如何创建一个警报窗口,并且在执行的操作完成之前应该显示警报(警报+代码应该在后台运行)?

这是我的代码 sn-p :

private void jButton1ActionPerformed(java.awt.event.ActionEvent evt) {                                         
    //alert window should start here when button performed
    //and end based on the output i get
    DefaultHttpClient httpclient  = new DefaultHttpClient();
    jLabel3.setText("");
    try {
        httpclient.getCredentialsProvider().setCredentials(
            new AuthScope(getHost(), AuthScope.ANY_PORT),
            new UsernamePasswordCredentials(getUser(), getPass()));                    
        HttpResponse response = null;
        HttpEntity entity = null;
        try {
            response = httpclient.execute(httpget);
            if(response.getStatusLine().getStatusCode()==500) {
                jLabel3.setText("Such Goods Movement does not exist / You do not have permssions for the entered.");
                //end here or 
            } else if(response.getStatusLine().getStatusCode()==401) {
                System.out.println(response);
                jLabel3.setText("Auth Failed");
                //end here or soon based on the event
            }
            entity = response.getEntity();
            System.out.println(entity);
            if (entity != null) {
                InputStream instream = entity.getContent();
                System.out.println(instream);
                BufferedReader reader = new BufferedReader(
                    new InputStreamReader(instream));
                String inputLine;
                String xmlText="";
                while ((inputLine = reader.readLine()) != null)
                    xmlText = xmlText+inputLine+"\n";
                System.out.println(xmlText);
                try {
                    DocumentBuilder db = DocumentBuilderFactory.newInstance().newDocumentBuilder();
                    InputSource is = new InputSource();
                    is.setCharacterStream(new StringReader(xmlText));
                    DefaultTableModel model = (DefaultTableModel) jTable1.getModel();
                    model.setRowCount(0);
                    Document doc = db.parse(is);
                    NodeList nodes = doc.getElementsByTagName("MaterialMgmtInternalMovementLine");
                    for (int i = 0; i < nodes.getLength(); i++) {
                        Element element = (Element) nodes.item(i);
                        getListGRNLine(element);
                    }
                } catch (SAXException ex) {
                    Logger.getLogger(GoodsReceipt.class.getName()).log(Level.SEVERE, null, ex);
                } catch (ParserConfigurationException ex) {
                    Logger.getLogger(GoodsReceipt.class.getName()).log(Level.SEVERE, null, ex);
                }
            }
        } catch(UnknownHostException e){
            jLabel3.setText("URL Not Found / Check Internet Connectivity");
        } catch(NoRouteToHostException f){
            jLabel3.setText("URL Not Found / Check Internet Connectivity");
        } catch (IOException ex) {
            Logger.getLogger(GoodsReceipt.class.getName()).log(Level.SEVERE, null, ex);
        }
        try {
            EntityUtils.consume(entity);
        } catch (IOException ex) {
            Logger.getLogger(GoodsReceipt.class.getName()).log(Level.SEVERE, null, ex);
        }
    } catch (UnsupportedEncodingException ex) {
        Logger.getLogger(GoodsReceipt.class.getName()).log(Level.SEVERE, null, ex);
    } finally {
        // When HttpClient instance is no longer needed,
        // shut down the connection manager to ensure
        // immediate deallocation of all system resources
        httpclient.getConnectionManager().shutdown();
    }
}

图像窗口:

【问题讨论】:

  • i.imgur.com/sqSs9E1.png 这是我的图片的链接(窗口)
  • 请查看SwingWorker。在actionPerformed() 方法中的注释处,将JDialog 置于带有警报消息的可见状态,将其余代码放入SwingWorker 的doInBackground() 方法和done() 方法中,只需丢弃JDialog。您必须在Event Dispatcher Thread 上拨打JLabel.setText() 之类的电话。如果它是一些中间事物的结果,那么只需调用publish() 并在process() 方法中执行JLabel.setText()。就是这样:-)
  • 不过,如果您可以提供一个简单、简短、可编译的 (SSCCE)。这对我们提供一个工作示例会很有帮助:-)
  • 好的,我会调查的。
  • 一旦我将 jDialog 作为代码放入,背景应该停止的地方有很多。你能举个例子吗?

标签: java swing background alert execution


【解决方案1】:

只需单击开始,然后等待JDialog 自动关闭。这可能会给你一个小小的想法,关于如何去做这件事:-)

请看一下这个例子:

import java.awt.*;
import java.awt.event.*;
import java.net.URL;
import javax.imageio.ImageIO;
import javax.swing.*;

public class SwingWorkerExample {

    private JFrame frame;
    private JLabel statusLabel;
    private JTextArea tArea;
    private JButton startButton;
    private JButton stopButton;

    private MyDialog dialog;

    private BackgroundTask backgroundTask;

    private ActionListener buttonActions =
                            new ActionListener() {
        @Override
        public void actionPerformed(ActionEvent ae) {
            JButton source = (JButton) ae.getSource();
            if (source == startButton) {
                startButton.setEnabled(false);
                stopButton.setEnabled(true);
                backgroundTask = new BackgroundTask();
                backgroundTask.execute();
                dialog = new MyDialog(frame, true);
                dialog.displayDialog();
            } else if (source == stopButton) {
                backgroundTask.cancel(true);
                stopButton.setEnabled(false);
                startButton.setEnabled(true);
            }
        }
    };

    private void displayGUI() {
        frame = new JFrame("Swing Worker Example");
        frame.setDefaultCloseOperation(JFrame.DISPOSE_ON_CLOSE);

        JPanel contentPane = new JPanel();
        contentPane.setBorder(
            BorderFactory.createEmptyBorder(5, 5, 5, 5));
        contentPane.setLayout(new BorderLayout(5, 5));

        statusLabel = new JLabel("Status Bar", JLabel.CENTER);

        tArea = new JTextArea(20, 20);
        tArea.setWrapStyleWord(true);
        tArea.setLineWrap(true);
        tArea.setBorder(
            BorderFactory.createTitledBorder("Chat Area : "));
        JScrollPane chatScroller = new JScrollPane();
        chatScroller.setViewportView(tArea);

        startButton = new JButton("Start");
        startButton.addActionListener(buttonActions);
        stopButton = new JButton("Stop");
        stopButton.setEnabled(false);
        stopButton.addActionListener(buttonActions);
        JPanel buttonPanel = new JPanel();
        buttonPanel.add(startButton);
        buttonPanel.add(stopButton);

        contentPane.add(statusLabel, BorderLayout.PAGE_START);
        contentPane.add(chatScroller, BorderLayout.CENTER);
        contentPane.add(buttonPanel, BorderLayout.PAGE_END);

        frame.setContentPane(contentPane);
        frame.pack();
        frame.setLocationByPlatform(true);
        frame.setVisible(true);
    }

    private class BackgroundTask extends SwingWorker<Void, String> {

        private String textInput;
        private int counter = 0, count = 0;

        private String[] arrNames = { "US Rates Strategy Cash",
            "Pavan Wadhwa(1-212) 844-4597", "Srini Ramaswamy(1-212) 844-4983",
            "Meera Chandan(1-212) 855-4555", "Kimberly Harano(1-212) 823-4996",
            "Feng Deng(1-212) 855-2555", "US Rates Strategy Derivatives",
            "Srini Ramaswamy(1-212) 811-4999",
            "Alberto Iglesias(1-212) 898-5442",
            "Praveen Korapaty(1-212) 812-3444", "Feng Deng(1-212) 812-2456",
            "US Rates Strategy Derivatives", "Srini Ramaswamy(1-212) 822-4999",
            "Alberto Iglesias(1-212) 822-5098",
            "Praveen Korapaty(1-212) 812-3655", "Feng Deng(1-212) 899-2222" };

        public BackgroundTask() {
            statusLabel.setText((this.getState()).toString());
            System.out.println(this.getState());
        }

        @Override
        protected Void doInBackground() {           
            System.out.println(this.getState());
            while (!isCancelled()) {
                counter %= arrNames.length;
                System.out.format("Count : %d%n", count);
                publish(arrNames[counter]);
                counter++;
                count++;
                if (count == 10000) {
                    this.cancel(true);
                }
            }
            System.out.println(this.getState());            
            return null;
        }

        @Override
        protected void process(java.util.List<String> messages) {
            statusLabel.setText((this.getState()).toString());
            for (String message : messages)
                tArea.append(message + "\n");
        }

        @Override
        protected void done() {
            System.out.println("DONE called");
            dialog.dispose();
        }
    }

    public static void main(String[] args) {
        Runnable runnable = new Runnable() {
            @Override
            public void run() {
                new SwingWorkerExample().displayGUI();
            }
        };
        EventQueue.invokeLater(runnable);
    }
}

class MyDialog extends JDialog {

    private JLabel alertLabel;
    private ImageIcon icon;

    public MyDialog(Frame owner, boolean isModal) {
        super(owner, isModal);
        try {
            icon = new ImageIcon(ImageIO.read(new URL(
                "http://i.imgur.com/Aoluk8n.gif")));        
        } catch (Exception e) {
            e.printStackTrace();
        }
    }

    public void displayDialog() {
        alertLabel = new JLabel("Alert Message", icon, JLabel.CENTER);
        JPanel contentPane = new JPanel();
        contentPane.add(alertLabel);

        setContentPane(contentPane);
        pack();
        setVisible(true);
    }
}

【讨论】:

  • 这个“JDialog”窗口在几秒钟内启动和关闭..无法完全理解它
  • @ManiDeep :在 while(isCancelled()) 的 if 条件下,使用 count == 30000 (这实际上是模拟您正在执行的长时间运行的任务),如果您希望对话框保持很长时间.在这个while 中,您将放置您编写的所有代码,只需从按钮启动SwingWorker,显示对话框,然后在您认为适合您时关闭JDialog,方法是调用this.cancel(true)。删除我的答案作为正确答案,直到你理解了这个东西,以便其他人也可以指导你:-)
  • 无法将它附加到我的程序中:(我可以得到另一个解决方案吗.. 这样它对我有用
  • @ManiDeep :这是closing a JDialog 的另一种方式,尽管您必须再次找到使其适用于您的情况的逻辑。您只需要创建一个函数并编写 actionPerformed() 方法中写入的所有内容,然后在需要关闭 JDialog 时调用此方法。
猜你喜欢
  • 2011-02-12
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2020-11-21
  • 1970-01-01
  • 2021-08-19
  • 2017-04-16
  • 2018-11-03
相关资源
最近更新 更多