0

私は、数字のリストを検索して、特定の他の数字になるものを見つけるプログラムを書いています。そこに問題はありません。アルゴリズムは、おそらくあまり効率的ではありませんが、機能的です。

現在、数値のリストはテキスト ファイルから取得する必要がありますが、ユーザーがリストをコピーして TextArea に貼り付け、Enter キーを押して、プログラムに文字列を送り返すことができるようにしようとしています。通常の (非 GUI) スレッド。

そうするために、私はこの例に従いました(一番の答え)。ボタンを押す代わりにキーイベントを使用し、リンクされたリストの代わりに文字列を使用していますが、それ以外はかなり似ています。

TextDemo を作成して実行するコード (はい、チュートリアル プログラムを適用しました):

  /*Copy paste text in window */
  public static String copypaste() throws Exception{
    String text = "";
    final TextDemo demo = new TextDemo();
    javax.swing.SwingUtilities.invokeLater(new Runnable() {
      public void run() {
        demo.createAndShowGUI();
      }
    });
    synchronized(demo.text){
      while(demo.text.equals("")){   //if the window is unused
        demo.text.wait();
      }
      text = demo.text;
    }
    return text;
  }

TextDemo 自体 (免責事項を除いて、Oracle に警告しないでください :)):

import java.awt.*;
import java.awt.event.*;
import javax.swing.*;

public class TextDemo extends JPanel implements KeyListener{
    protected JTextArea textArea;
    private final static String newline = "\n";
    public String text = "";
    boolean used = false;

    public TextDemo() {
        super(new GridBagLayout());

        textArea = new JTextArea(100, 30);
        textArea.addKeyListener(this);

        textArea.setEditable(true);
        JScrollPane scrollPane = new JScrollPane(textArea);

        //Add Components to this panel.
        GridBagConstraints c = new GridBagConstraints();
        c.gridwidth = GridBagConstraints.REMAINDER;

        c.fill = GridBagConstraints.BOTH;
        c.weightx = 1.0;
        c.weighty = 1.0;
        add(scrollPane, c);
    }

    public void keyPressed(KeyEvent e) {
        // Listen for the key pressed and check it against "Enter"
        // Then read out of our textarea control and print to screen4       
        if (e.getKeyCode() == e.VK_ENTER) {
          synchronized(text){
            text = textArea.getText();
            System.out.println("Text entered.");
            text.notify();
          }
            }
    }

    public void keyReleased(KeyEvent e) {
        // Listen for the key pressed and check it against "Enter"
        // Then read out of our textarea control and print to screen4       
        if (e.getKeyCode() == e.VK_ENTER) {
            //do nothing
        }
    }

    public void keyTyped(KeyEvent e) {
        // Listen for the key pressed and check it against "Enter"
        // Then read out of our textarea control and print to screen4       
        if (e.getKeyCode() == e.VK_ENTER) {
            //do nothing
        }
    }


    /**
     * Create the GUI and show it.  For thread safety,
     * this method should be invoked from the
     * event dispatch thread.
     */
    public static void createAndShowGUI() {
        //Create and set up the window.
        JFrame frame = new JFrame("TextDemo");
        frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);

        //Add contents to the window.
        frame.add(new TextDemo());

        //Display the window.
        frame.pack();
        frame.setVisible(true);
    }

    public static void main(String[] args) {
        //Schedule a job for the event dispatch thread:
        //creating and showing this application's GUI.
        javax.swing.SwingUtilities.invokeLater(new Runnable() {
            public void run() {
                createAndShowGUI();
            }
        });
    }

}

コードを実行すると、Enter キーを押してプログラムがクラッシュするまで、動作しているように見えます。エラー コード (最初の 5 行のみを含めています。完全なバージョンはこちら: http://img.photobucket.com/albums/v242/ChaosGuide/illegalmonitorstateexception.png ):

Exception in thread "AWT-EventQue-0" java.lang.IllegalMonitorStateException
    at java.lang.Object.notify(Native Method)
    at TextDemo.keyPressed(TextDemo.java:72)
    at java.awt.Component.processKeyEvent(Component.java:6463)
    at javax.swing.JComponent.processKeyEvent(JComponent.java:2829)
    at java.awt.Component.processEvent(Component.java:6282)

スレッドに触れることさえしたのはこれが初めてなので、何が間違っているのか本当にわかりません。

どんな助けでも大歓迎です。

4

1 に答える 1