4

JFrameと2つのJRadioButtonを作成し、それらにActionListenersを追加する関数graphics()があります。このグラフィックはmain()から呼び出され、グラフィック自体はgame()を呼び出します。

public void game() throws Exception
{

    jTextArea1.setLineWrap(true);
    jTextArea1.setWrapStyleWord(true);
    jTextArea1.setText("This is private information.");

    jRadioButton1.setVisible(true);
    jRadioButton2.setVisible(true);
    try {
    t.sleep(40000);
    repaint();
    } catch (InterruptedException e) {
    // We've been interrupted: no more messages.
    return;    
    }

「これは個人情報です」と表示した後。テキストエリアで、プログラムの実行を40秒間、またはユーザーがJRadioButtonを押すまでのいずれか早い方で一時停止します。そこで、ActionListenerを追加し、その中にt.interrupt()を呼び出しました。

private void jRadioButton1ActionPerformed(java.awt.event.ActionEvent evt) {
     t.interrupt();
    jRadioButton1.setVisible(false);
    jRadioButton2.setVisible(false);
    //System.out.println(t.interrupted());
    jTextArea1.setText("Please wait...");

    }

ただし、割り込みをトリガーするJRadioButtonを選択した後でも、それは発生せず、t.interruptedはfalseを返します。

どんな助けでもいただければ幸いです。

4

1 に答える 1

8

Thread.sleep(...)スレッドをフリーズしてプログラムを効果的にフリーズするため、Swingイベントスレッドを呼び出さないでください。解決策は、要件の時間依存部分にSwingタイマーを使用し、JCheckBoxまたはJRadioButton要件にSelectionListenerを使用することを検討することです。

例えば:

import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.awt.event.ItemEvent;
import java.awt.event.ItemListener;

import javax.swing.*;

public class PausingExecution extends JPanel {
   private static final String SELECTED_TEXT = "Snafus are Better!!!";
   private static final String UNSELECTED_TEXT = "Fubars Rule!!";
   private static final String TIMES_UP = "Time's Up!!!!";
   private static final int TIMER_DELAY = 10 * 1000;

   private JTextField messageField = new JTextField(UNSELECTED_TEXT, 10);
   private JCheckBox checkBox = new JCheckBox("Click Me");

   public PausingExecution() {
      add(messageField);
      add(checkBox);

      checkBox.addItemListener(new ItemListener() {

         @Override
         public void itemStateChanged(ItemEvent iEvt) {
            if (iEvt.getStateChange() == ItemEvent.SELECTED) {
               messageField.setText(SELECTED_TEXT);
            } else {
               messageField.setText(UNSELECTED_TEXT);
            }
         }
      });

      Timer mySwingTimer = new Timer(TIMER_DELAY, new ActionListener() {

         @Override
         public void actionPerformed(ActionEvent e) {
            messageField.setText(TIMES_UP);
            checkBox.setEnabled(false);
         }
      });

      mySwingTimer.setRepeats(false);
      mySwingTimer.start();
   }

   private static void createAndShowGui() {
      PausingExecution mainPanel = new PausingExecution();

      JFrame frame = new JFrame("PausingExecution");
      frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
      frame.getContentPane().add(mainPanel);
      frame.pack();
      frame.setLocationByPlatform(true);
      frame.setVisible(true);
   }

   public static void main(String[] args) {
      SwingUtilities.invokeLater(new Runnable() {
         public void run() {
            createAndShowGui();
         }
      });
   }
}
于 2012-10-25T03:23:07.220 に答える