Эй, ребята, я делаю приложение терминала с помощью Swing и Apache Commons. Я смог перенаправить System.out
и System.err
на JTextArea
легко, но как это сделать для System.in
? Нужно ли переопределить методы Inputstream
? Нужно ли преобразовать String
из JTextArea
в массив байтов, а затем передать его InputStream
? Примеры кода были бы хороши.Переадресовать System.in на компонент качания
ответ
Недавно я попробовал то же самое, вот мой код:
class TexfFieldStreamer extends InputStream implements ActionListener {
private JTextField tf;
private String str = null;
private int pos = 0;
public TexfFieldStreamer(JTextField jtf) {
tf = jtf;
}
//gets triggered everytime that "Enter" is pressed on the textfield
@Override
public void actionPerformed(ActionEvent e) {
str = tf.getText() + "\n";
pos = 0;
tf.setText("");
synchronized (this) {
//maybe this should only notify() as multiple threads may
//be waiting for input and they would now race for input
this.notifyAll();
}
}
@Override
public int read() {
//test if the available input has reached its end
//and the EOS should be returned
if(str != null && pos == str.length()){
str =null;
//this is supposed to return -1 on "end of stream"
//but I'm having a hard time locating the constant
return java.io.StreamTokenizer.TT_EOF;
}
//no input available, block until more is available because that's
//the behavior specified in the Javadocs
while (str == null || pos >= str.length()) {
try {
//according to the docs read() should block until new input is available
synchronized (this) {
this.wait();
}
} catch (InterruptedException ex) {
ex.printStackTrace();
}
}
//read an additional character, return it and increment the index
return str.charAt(pos++);
}
}
и использовать его как это:
JTextField tf = new JTextField();
TextFieldStreamer ts = new TextFieldStreamer(tf);
//maybe this next line should be done in the TextFieldStreamer ctor
//but that would cause a "leak a this from the ctor" warning
tf.addActionListener(ts);
System.setIn(ts);
было некоторое время, так как я закодированы Java, так что я не может быть вверх с современными моделями. Вероятно, вы также должны перегрузить int available()
, но мой пример состоит только из минимального минимума, чтобы заставить его работать с функцией BufferedReader
s readLine()
.
Edit: Для этого, чтобы работать на JTextField
вы должны использовать implements KeyListener
вместо implements ActionListener
, а затем использовать addKeyListener(...)
на вашем TextArea. Функция, что вам нужно вместо actionPerformed(...)
это public void keyPressed(KeyEvent e)
, а затем вы должны проверить if (e.getKeyCode() == e.VK_ENTER)
и вместо того, чтобы использовать весь текст, который вы просто использовать подстроку из последней строки перед курсором с
//ignores the special case of an empty line
//so a test for \n before the Caret or the Caret still being at 0 is necessary
int endpos = tf.getCaret().getMark();
int startpos = tf.getText().substring(0, endpos-1).lastIndexOf('\n')+1;
для входной строки. Потому что иначе вы читали бы весь TextArea каждый раз, когда вы нажимаете enter.
Вам необходимо создать собственную реализацию InputStream
, которая берет свой вход от любого компонента Swing, который вы хотите ... в основном есть буфер, который вы копируете текст с вашего компонента Swing, и который служит источником для InputStream
(который из курс должен блокироваться, если вход не доступен).
- 1. Пользовательский компонент качания: проблема с перерисовкой()
- 2. Перерисовать компонент качания во время работы нитка
- 3. Случайно Перемещение объекта с помощью качания Компонент
- 4. Скрыть компонент качания без повторной калибровки макета?
- 5. Запись данные на System.in
- 6. Отражение на компонентах качания
- 7. Переадресовать переадресацию на вход
- 8. Какой компонент качания Java реализует окно с меньшей кнопкой X?
- 9. Какой компонент качания используется для отображения фотографии с описанием
- 10. Удалить методы или поля из класса, который расширяет компонент качания
- 11. Имеется ли компонент JList с фильтром, зависящий от качания?
- 12. Цикл обновления качания
- 13. Как добавить компонент Swing из объекта в компонент качания в arraylist?
- 14. ускорители качания
- 15. Переадресовать на новую страницу
- 16. Переадресовать на конкретный вид
- 17. переадресовать на страницу профиля
- 18. Переадресовать домен на WWW
- 19. Переадресовать все на public_html
- 20. Многоколоночный комбинированный ящик для качания
- 21. Java DataInputStream с System.in
- 22. Настройка среды для System.in
- 23. как system.in представляет клавиатуру?
- 24. NoSuchElementException после закрытия system.in
- 25. Помещение компонента качания на другой компонент без изменения макета из Free Design в другой?
- 26. Java Потоки и System.in
- 27. Java System.in issue
- 28. System.in и сканер объект
- 29. System.in многострочный вход, StringIndexOutOfBoundsException?
- 30. Что содержит system.in?
Cool Ill просто нужно изменить его, чтобы он занимал последнюю строку JTextArea. Большое спасибо – Giannis
@ latusaki, не совсем вам придется немного модифицировать его, так как 'JTextArea' не генерирует' ActionEvent 'afaik. Вы можете либо сделать несвязанную кнопку, либо добавить к ней прослушиватель действий или переопределить 'JTextArea', и поймать ключевые события, чтобы искать« Ctrl-Enter »или что-то подобное, а затем запускать« ActionEvent »самостоятельно. – PeterT
Метод чтения не вызван по какой-либо причине во время тестирования с текстовым полем. – Giannis