2013-07-30 2 views
0

Итак, я пытаюсь написать код для поиска JTextField, который извлекает результаты из Интернета (например, как подсказки поиска Google). Единственная проблема - это, наверное, отсутствие опыта программирования. В частности, я настроил его, когда пользователь нажимает на ключ, он отправляет запрос с помощью входа JTextField через HttpURLConnection и получает результаты, затем обновляет. Но всякий раз, когда HttpURLConnection работает, он замораживает программу на пару секунд, пока она делает свою вещь, что в основном запрещает вводить больше символов в поле поиска, если я не возражаю против чего-либо еще. Я рассмотрел использование отдельных потоков, но я не уверен, как правильно прервать поток и начать его с использования новых данных, а все остальное ждет на нем, но все же принимает новые данные. Я рассматривал возможность использованияСинхронизация HttpURLConnection и KeyListener:

thread.stop(); 

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

public class SearchField extends JTextField implements KeyListener { 
    public SearchField() { 
     addkeyListener(this); 
    } 

    public void updateData(ArrayList<String results) { 
     /*Pass the data off the the GUI*/ 
    { 

    @Override 
    public void keyTyped(KeyEvent e) { 
     SearchQuery query = new SearchQuery(this.getText()); 
     updateData(query.getResults()); 
    } 
} 


public class SearchQuery { 

    ArrayList<String> results = new ArrayList<String>(); 

    public SearchQuery(String search) { 
     String search_path = "http://www.whatever.com/" + search; 
     URL url = new URL(search_path); 
     conn = (HttpURLConnection) url.openConnection(); 
     conn.addRequestProperty("User-Agent", "Mozilla/4.76"); 
     in = new BufferedReader(
           new InputStreamReader(conn.getInputStream())); 
     StringBuffer buf = new StringBuffer(); 
     int i; 
     while((i = in.read()) != -1) { 
      buf.append((char) i); 
     } 
     String data = buf.toString(); 

     parse(data); 
    } 

    public void parse(String data) { 
     /*Parse a bunch of JSON, return the results in an array*/ 
     results.add(data); 
    } 

    public ArrayList<String> getResults() { 
     return results; 
    } 
} 

Я просто в недоумении, как синхронизировать ПОЛУЧАТЬ непрерывный ввод при получении новых результатов для каждого нажатия кнопок и отклоняя незаконченные соединения и их обработку соответствующих данных, когда он становится недействительным при следующем нажатии клавиши.

+2

Вам нужно выполнить поиск в другом потоке, если вы не хотите, чтобы событие Dispatch Thread для замораживания. – Kayaman

+0

Должен ли я просто распоряжаться текущей нитью каждый раз, когда он получает новый вход? И как мне заставить его ждать в потоке, чтобы довести результаты до обновления графического интерфейса? – Kyle

+0

Вы могли бы отметить старые потоки как ненужные с помощью простого булевого флага, поэтому они не будут обновлять графический интерфейс, если более свежий поток получает результаты. Также см. Ответ, предоставленный tbodt. – Kayaman

ответ

0

Выполняется загрузка в той же ветке, которая реагирует на события пользователя. Вам нужно сделать загрузку в другом потоке, возможно, сделав SearchQuery удлинителем Thread и выполнив запрос в методе run. Когда пришло время обновить текстовое поле, вы можете использовать SwingUtilities.invokeLater для обновления текстового поля. Вот пример:

public class SearchQuery extends Thread { 
    private SearchField f; 
    public SearchQuery(JTextField f) { 
     this.f = f; 
    } 

    public void run() { 
     // do the query here 
     SwingUtilities.invokeLater(new Runnable() { 
      public void run() { 
       f.updateData(results); 
      } 
     }); 
    } 
} 

Затем измените строку:

SearchQuery query = new SearchQuery(this.getText()); 

к этому:

SearchQuery query = new SearchQuery(this); 
+0

О, это может быть ответ прямо там. Мне нужно будет провести некоторое исследование SwingUtilities.invokeLater и выяснить, как его использовать для обновления моих компонентов. У вас есть хорошие ресурсы? – Kyle

+0

Я добавлю фрагмент кода. – tbodt

+0

Это было бы здорово, спасибо! – Kyle