JSwing,如何在开始另一个动作之前进行Jtable渲染?

时间:2014-10-11 03:52:42

标签: java swing jtable actionlistener

我在正常的Jpanel上有我的按钮和动作监听器,当我点击它应该打开一个联系窗口的按钮,然后向它们发送每个文本1乘1.它打开一个窗口,在发送短信之前保持空白,即使在我的动作监听器中,它显然需要首先启动窗口。

        else if (ae.getActionCommand() == "Initiate Recall") {

        int doneCheck = 0;

        if (doneCheck == 0){
        oh.ViewAllMembers();
        doneCheck = 1;
        }
        if (doneCheck == 1){
        try {

            oh.doRecall();
        } catch (Exception e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
        }
        }
    }

这是我的召回方法

public void doRecall() throws Exception {

    String customMessage = getMessage();
    boolean programOpen = true;

    Member con = new Member();

    Object data[][] = new Object[v.size()][8];

    k = 0;

    for (int j = 0; j < v.size(); j++) {

        con = (Member) v.elementAt(k);

        data[j][0] = con.getFName();
        data[j][1] = con.getLName();
        data[j][2] = con.getNname();
        data[j][3] = con.getEMail();
        data[j][4] = con.getAddress();
        data[j][5] = con.getPhoneNo();
        data[j][6] = con.getresponse();
        data[j][7] = con.getBday();

        try {
            String myPasscode = "*******";
            String myUsername = "*******";
            String toPhoneNumber = con.getPhoneNo();
            customMessage = customMessage.replaceAll("\\s+", "+");
            System.out.println(customMessage);

            String requestUrl = ("http://cloud.fowiz.com/api/message_http_api.php?username=******&phonenumber=+"
                    + toPhoneNumber + "&message=" + customMessage + "&passcode=******");

            URL url = new URL(requestUrl);

            HttpURLConnection uc = (HttpURLConnection) url.openConnection();
            System.out.println(uc.getResponseMessage());
            String reply = uc.getResponseMessage();

            if (reply.equalsIgnoreCase("ok")) {

            }

        } catch (Exception ex) {
            System.out.println(ex.getMessage());

        }
        k++;

    }
    k = 0;
    for (int j = 0; j < v.size(); j++) {

        con = (Member) v.elementAt(k);

        boolean phoneCheck = false;
        while (phoneCheck != true) {
            mR2 = new MailReader();
            String host = "pop.gmail.com";// change accordingly
            String mailStoreType = "pop3";
            String username = "*********@gmail.com";// change
                                                        // accordingly
            String password = "*******";// change accordingly
            MailReader.check(host, mailStoreType, username, password);
            if (MailReader.searchForPhone(con.getPhoneNo()) == true) {
                System.out.println("IT WORKED");
                phoneCheck = true;
            }

        }

    }

}

这是我的观点联系方式

public void ViewAllMembers() {

    newFrame = new JFrame("All Members In The Roster");
    newFrame.setSize(600, 300);
    newFrame.setIconImage(img);

    Member con = new Member();

    String columnNames[] = { "First Name", "Last Name", "Nickname",
            "E Mail Address", "Address", "Phone No.", "response", "B'day" };

    Object data[][] = new Object[v.size()][8];

    for (int j = 0; j < v.size(); j++) {

        con = (Member) v.elementAt(k);

        data[j][0] = con.getFName();
        data[j][1] = con.getLName();
        data[j][2] = con.getNname();
        data[j][3] = con.getEMail();
        data[j][4] = con.getAddress();
        data[j][5] = con.getPhoneNo();
        data[j][6] = con.getresponse();
        data[j][7] = con.getBday();

        k++;

    }
    k = 0;

    JTable abtable = new JTable(data, columnNames);
    JScrollPane scrollPane = new JScrollPane(abtable);
    abtable.setPreferredScrollableViewportSize(new Dimension(500, 370));

    JPanel pane = new JPanel();
    JLabel label = new JLabel("Members Currently In The Recall Roster");
    pane.add(label);

    newFrame.getContentPane().add(pane, BorderLayout.SOUTH);
    newFrame.getContentPane().add(scrollPane, BorderLayout.CENTER);

    newFrame.setLocation(screenWidth / 4, screenHeight / 4);
    newFrame.show();

}

1 个答案:

答案 0 :(得分:1)

问题:

    else if (ae.getActionCommand() == "Initiate Recall") {

请勿使用==来比较字符串。理解==检查两个对象是否相同而不是您感兴趣的。另一方面,这些方法检查两个字符串是否具有相同的字符相同的顺序,这是重要的。而不是

if (fu == "bar") {
  // do something
}

做,

if ("bar".equals(fu)) {
  // do something
}

,或者

if ("bar".equalsIgnoreCase(fu)) {
  // do something
}

下一步:

    int doneCheck = 0;

    if (doneCheck == 0){
    oh.ViewAllMembers();

我猜这是一个长期运行的代码 - 你永远不会告诉我们这是做什么的(??)。如果是这样,它会让您完整的Swing GUI进入睡眠状态,使其无法响应。也许它需要在后台线程上运行。

    doneCheck = 1;
    }
    if (doneCheck == 1){
    try {
        oh.doRecall();
    }

oh.doRecall()是否显示您的JTable?如果是,或者如果没有,那么您并没有很好地向我们解释您的代码,但似乎假设我们可以理解未显示的代码和概念。现实检查:我们不能。


修改

  • 您的doRecall()代码应该在后台线程中调用,例如使用SwingWorker(Google Concurrency in Swing),因为它会占用Swing事件线程,从而阻止您显示其他代码。这是您的主要问题,本教程将帮助您学习如何解决它。
  • 您似乎正在展示多个JFrame,这是您想要解决的常见Swing新手错误。如果您需要显示一个从属窗口,显示一个对话框,如JDialog,或者不显示子窗口,并用CardLayout交换视图。
  • 同样,请勿使用==来比较字符串。
  • 不要调用已弃用的方法,例如JFrame#show()。他们因某种原因而被弃用,Java API将告诉您应该使用的替代方案。

像......那样的东西。

        if ("Initiate Recall".equalsIgnoreCase(ae.getActionCommand())) {
           // viewAllMembers method name should begin with a lower-case letter 
           oh.viewAllMembers();
           SwingWorker<Void, Void> worker = new SwingWorker<Void, Void>() {
              @Override
              protected Void doInBackground() throws Exception {
                 oh.doRecall();
                 return null;
              }

              @Override
              protected void done() {
                 try {
                    get();
                 } catch (InterruptedException | ExecutionException e) {
                    // do something with any exceptions here
                    e.printStackTrace();
                 }
              }
           };
           worker.execute();
        }