2012-06-08 2 views
2

Я ищу направление относительно того, как заменить System.in на InputStream, который читается непосредственно с JTextField.Установка System.in для чтения из JTextField

До сих пор мой подход в значительной степени был проб и ошибок. В настоящее время у меня есть;

JTextField input = new JTextField(); 

System.setIn(new InputStream() { 
    int ptr = 0; 
    @Override 
    public int read() throws IOException { 
    int c; 
    try { 
     c = input.getText().charAt(ptr); 
    } 
    catch (IndexOutOfBoundsException ioob) { 
     return 0; 
    } 
    ptr++; 
    return c; 
    } 
}); 

Это дает NoSuchElementException как при попытке считывания, когда вход пуст, и я предполагаю, что никогда не может найти разделитель.

Какой подход мне не хватает?

+0

Почему бы просто не использовать 'KeyListener' для обнаружения каждого введенного ключа? – evanwong

+0

@evanwong Можете ли вы предложить, как это может быть связано с входным потоком? – Jivings

ответ

3

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

final LinkedBlockingQueue<Character> sb = new LinkedBlockingQueue<Character>(); 

final JTextField t = new JTextField(); 
t.addKeyListener(new KeyListener() { 
    @Override 
    public void keyTyped(KeyEvent e) { 
    sb.offer(e.getKeyChar()); 
    } 
    ... 
}); 

System.setIn(new BufferedInputStream(new InputStream() { 
    @Override 
    public int read() throws IOException { 
    int c = -1; 
    try { 
     c = sb.take();    
    } catch(InterruptedException ie) { 
    } 
    return c;   
    } 
})); 
+0

Вы сделали различные семантические решения, чем указывают спецификации. И вы не следуете блокировочному контракту. И вернуть 0 // ничего не вернуть прямо сейчас, это просто плохое решение в моих глазах. –

+0

Как насчет Ctrl-V? –

+0

@CaptainGiraffe Я улучшил свой ответ. – Jivings

1

Вы смотрите на полпути, но:

От Javadocs

Этот метод блокируется до ввода данных не имеется, конец потока обнаруживается, или исключение.

http://docs.oracle.com/javase/1.4.2/docs/api/java/io/InputStream.html#read%28%29

Таким образом, ваш метод должен просто ждать для нажатия клавиши. Либо обрабатывая NoSuchElementException, либо KeyListener, который проверяет, сколько (новых?) Символов доступно.

Семантика этого InputStream отличается от консольной, поэтому вам нужно принять некоторые проектные решения о том, как обрабатывать изменения, а не только нажатия клавиш.

+0

Так что я должен просто поймать это исключение? – Jivings

+0

@ Поведение Да, а не возврат из метода. Вернитесь, когда у вас есть данные. –

+0

Мне кажется, что я должен возвращать 0, когда есть исключение, так как метод должен возвращать количество байтов, которые были прочитаны. – Jivings