JTable Swing получить проблему ввода - PullRequest
0 голосов
/ 19 марта 2011

У меня есть метод getInput, который берет строку из текстового поля по нажатию Enter. Я создал цикл while для ожидания, пока onClickListener вернет true (нажал Enter). Вот мой код:

public String getInput(){
    jTextField1.setEditable(true);
    jTextField1.addKeyListener(new java.awt.event.KeyAdapter() {
        public void keyPressed(java.awt.event.KeyEvent evt) {
            temp=jTextField1KeyPressed(evt);
        };
    });
    while(!(temp)){
    }
    temp=false;
    jTextField1.setEditable(false);
    String s= jTextField1.getText();
    jTextField1.setText("");
    return s;

}

private boolean jTextField1KeyPressed(KeyEvent evt) {
    if (evt.getKeyCode() == KeyEvent.VK_ENTER)
        return true;
    else return false;
};

Теперь у меня возникла очень странная проблема: если я добавляю предложение System.out.println в цикл while, оно отлично работает, если я его удаляю, тогда как цикл никогда не завершается. Где проблема? Заранее спасибо.

Ответы [ 3 ]

1 голос
/ 19 марта 2011

Вам потребуется некоторая синхронизация, чтобы изменения в temp распространялись на все необходимые потоки. Но начинать с этого плохого подхода - getInput приведет к потере большого количества циклов ЦП в этом while без какой-либо цели.

Вы могли бы сделать это более чисто. Сначала объявите temp как java.lang.Object и инициализируйте его как простой старый объект:

private Object temp = new Object();

(или что-то в этом роде)

В getInput вместо этого:

while (!temp) { }
temp = false;

поставить это:

synchronized (temp) {
  try {
    temp.wait();
  } catch (InterruptedException ie) {
    // handle this situation: something interrupted your thread before input was finished
  }
}

А в обработчике событий:

synchronized (temp) {
  temp.notify();
}

Таким образом, поток, выполняющий getInput, остается спящим, ожидая, что что-то произойдет, а не сжигая циклы ЦП.

Существуют также варианты wait(), которые принимают значение времени ожидания. Возможно, вам будет интересно их использовать.

0 голосов
/ 19 марта 2011

Если вы вызываете свой getInput из потока событий, вы застреваете в бесконечном цикле.Переменная temp может никогда не быть обновлена, потому что никакие события больше не могут быть обработаны.

Если вы хотите собрать простой ввод, вы, возможно, захотите посмотреть на решение, подобное

String info = JOptionPane.showInputDialog(this, "Please enter info");
0 голосов
/ 19 марта 2011

Ваша проблема называется "Ожидание занята".Вы должны подождать, пока операционная система не сообщит вам, что Enter был нажат.Задавая фиктивный вопрос «Было ли нажато Enter?», «Было ли нажато Enter?», «Было ли нажато Enter?», «Было ли нажато Enter?», «Было ли нажато Enter?», «Было ли нажато Enter?», «Была нажата клавиша Enter? " 1000000000 раз в секунду - не очень хорошая практика ....

Вы можете попробовать использовать это:

jTextField1.addKeyListener(new java.awt.event.KeyAdapter() {
    public void keyPressed(java.awt.event.KeyEvent evt) {
        temp=jTextField1KeyPressed(evt);
        if (temp==true) EnterPressed();
    };
});
void EnterPressed() {
    //enter code here
}
...