使程序等到单击按钮

时间:2016-06-10 06:50:49

标签: java multithreading swing

我遇到了一个可能有一个简单修复的问题,但我似乎无法让它发挥作用。

我需要我的程序暂停或等到用户选择跳过按钮或正/负反馈按钮,然后再继续。 我认为这将需要基本的线程,但我不确定如何实现它。任何帮助都将得到应用。

gui显示在一个单独的类(GUI)中,其余的是另一个类。 代码有点乱,因为它是在12小时内为Hackfest编码的。

编辑:通过删除按钮监听器并使变量保持静态来解决它。

public void onStatus(Status status) {
//this is a listener from the Twitter4J class. Every time new Tweet comes in it updates.
            for (int i = 0; i <= posWords.length; i++) {

                if (status.getText().toLowerCase().contains(gui.sCrit.getText())
                        && (status.getText().toLowerCase().contains(posWords[i].toLowerCase()))) {
//If the tweet matches this criteria do the following:
                    String tweet;
                    Status tempStoreP;
                    System.out.println("Flagged positive because of " +posWords[i].toLowerCase()+" " + i);
                    tempStoreP = status;

                    tweet = tempStoreP.getUser().getName() + ":" + tempStoreP.getText() + " | Flagged as positive \n\r";
                    gui.cTweet.setText(tweet);
                    //Write to log
                    try {


                        wPLog.append("~" + tweet);


                    } catch (IOException e) {
                    }
                    //Add action listeneer to gTweet.
                //here is my problem. I want it to wait until a user has clicked one of these buttons before moving on and getting the next Tweet. It has to pause the thread until a button is clicked then it can only move on to getting another Tweet.
//the problem is that the button listener uses local variables to work. 
                        gui.gTweet.addActionListener(new ActionListener() {
                            public void actionPerformed(ActionEvent e) {
                                if (gui.pTweet.getText().equalsIgnoreCase("")) {
                                    gui.pTweet.setText("Please type a response");
                                } else if (gui.pTweet.getText().equalsIgnoreCase("Please type a response")) {
                                    gui.pTweet.setText("Please type a response");

                                } else {
                                    try {
                                        Status sendPTweet = twitter
                                                .updateStatus("@" + tempStoreP.getUser().getScreenName() + " "
                                                        + gui.pTweet.getText());

                                    } catch (TwitterException e1) {
                                    }   
                                }

                                gui.gTweet.removeActionListener(this);
                            }
                        });

                    //add Aaction listert to sTweet

                        gui.sTweet.addActionListener(new ActionListener() {
                            public void actionPerformed(ActionEvent e) {
                                try {

                                    wPLog.append("Skipped \n\r");

                                } catch (IOException e1) {
                                }
                                gui.sTweet.removeActionListener(this);
                            }
                        });


                }

感谢您的帮助。另外,如果有人可以告诉我为什么单击该按钮时,它会循环并使用相同的消息阻止人们,这将是有帮助的。谢谢。

3 个答案:

答案 0 :(得分:1)

我想到了多线程的事情,我觉得它不够容易。 如果我是你,我会禁用所有控件,除了要点击的按钮。

示例:

JButton button = new JButton( "Test );
button.setEnabled( false );

用户无法点击按钮,直到您使用button.setEnabled( true );,如果您只是禁用所有控件,但按钮应该没问题。

答案 1 :(得分:0)

根据我对你的问题的理解,你可以像这样使用多线程:

JFrame

或 如果您有2 JPanel,则可以使用dispose方法。

或 您可以使用多个pnl1,而跳过按钮点击隐藏pnl2并使用方法显示pnl1.setvisible(false); pbl2.setVisible(true);

{{1}}

答案 2 :(得分:0)

  

我认为这将需要基本的线程,

根本不是真的。

你说你希望你的节目等待。&#34;这个词对Swing应用程序实际上并不重要。 Swing应用程序是事件驱动的。也就是说,您的程序主要由Swing的顶级循环(又称事件调度线程或EDT)调用的事件处理程序组成,以响应发生的各种事情,如鼠标单击,键盘事件,计时器,...

在事件驱动的程序中,&#34;等到X&#34;主要是指禁用某些内容,然后在X处理程序中重新启用它。

当然,Swing程序有时会创建其他线程来处理来自GUI框架不知道的源的输入,并执行&#34; background&#34;计算。在那种情况下,&#34;等到X&#34;可能意味着要通知一些线程暂停,然后发出信号以继续在X处理程序中工作。