Как сделать редактируемой только следующую строку JTextArea (+ JScrollPane)

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

JTextArea ta = new JTextArea();
JScrollPane sp = new JScrollPane(ta);

Потом каркас ...

    f.setTitle("Server");
    f.setBounds(ss.width - 600, 50, 550, 350);
    f.setResizable(false);
    f.setDefaultCloseOperation(JFrame.DO_NOTHING_ON_CLOSE);//added window listener so closes socket connection first
    f.setAlwaysOnTop(true);

Затем добавляем его:

    f.add(sc);
    jt.setBackground(Color.BLACK);
    jt.setForeground(Color.WHITE);
    //jt.setEditable(false);

Наконец, метод, который я использую для вывода в TextArea:

public static void append(String text) {
    jt.append(text);
    jt.append("\n\n"+System.getProperty("user.name")+" / "+getIp()+" > ");
    jt.setCaretPosition(jt.getDocument().getLength());
}

Теперь мне нужно назначить String тому, что пользователь вводит в JTextArea после того, как они нажмут Enter:>?

jt.addActionListener(...{
    public void ActioEvent(ActionEvent e){
        String text = JTextArea.getLines().getLastLine().getText().replace(System.getProperty("user.name")+" / "+getIp()+"       > ", "");
    }
});

Может что-то в этом роде? Тогда мне нужно, чтобы редактировалась только часть после ">"?


person Matthew Rowlands    schedule 06.10.2014    source источник
comment
Используйте JTextField под JTextArea.   -  person Kevin Workman    schedule 06.10.2014
comment
Но, хотя это проще, это не действительно то, что я хочу   -  person Matthew Rowlands    schedule 06.10.2014
comment
Как это не то, что вы хотите? Если я не пропускаю какое-то требование, это именно то, что вы ищете. Это стандартный подход к данной проблеме. Обратите внимание, что вы можете изменить границы и еще много чего текстовых компонентов, чтобы они казались одним компонентом, если это вас беспокоит.   -  person Kevin Workman    schedule 06.10.2014
comment
На самом деле, я думаю, вы правы, я просто подумал, что есть способ сделать это в самой JTextArea. Спасибо.   -  person Matthew Rowlands    schedule 06.10.2014
comment
Просто обрабатывайте события в JTextArea и не позволяйте изменять существующий текст. Должно быть легко.   -  person Prakash    schedule 06.10.2014


Ответы (3)


Это можно сделать с помощью DocumentFilter. Это довольно непонятная и мало используемая часть Java, и ею пользоваться далеко не просто. Однако он позволяет вставлять DocumentFilter между пользовательским интерфейсом (где редактируется форматированный текст) и базовой моделью (содержимым). Вы пропускаете все операции «вставить» и «удалить» через фильтр, который может принять, отклонить или изменить их. Вы можете закодировать фильтр, чтобы разрешить изменения только в командной строке, но не в подсказке.

Как я уже сказал, это довольно сложная часть кодирования, а структура Document / DocumentFilter имеет большую сложность, которая не нужна вашему конкретному приложению. Однако он предоставляет вам все необходимое.

На стандартных страницах документации Java есть учебное пособие, но не расширенное, и в Интернете есть очень мало известных мне примеров.

ProtectedTextComponent (спасибо camickr) предоставляет пример того, как сделать что-то похожее.

person DJClayworth    schedule 06.10.2014
comment
this is a pretty hard piece of coding - Я согласен :) Если вам интересно, вы можете проверить Защищенный текстовый компонент, который сделает это за вас. - person camickr; 06.10.2014
comment
@camickr Это хороший класс, который многое упрощает. Не возражаете, если я включу это в свой ответ? - person DJClayworth; 06.10.2014
comment
Как я сказал в своем ответе, вы не сможете использовать класс как есть, но вы можете поиграть, настроить и экспериментировать. - person camickr; 07.10.2014

Используйте Collection a JTextField.
Позвольте пользователю ввести JTextField, и как только он нажмет enter, переместите элемент управления к следующему JTextField, сделав указанное выше JTextField неотредактируемым, а также удалите с него JScrollPane.

Надеюсь это поможет.

person Aditya Singh    schedule 06.10.2014

Я также согласен с тем, что подход JTextArea / JTextField является распространенным и более простым подходом.

Однако, если вы хотите немного усложнить себе жизнь, вы можете проверить Protected Текстовый компонент, который сделает за вас большую часть логики.

Текущая реализация ProtectedDocument позволяет вам только добавлять защиту к Документу, но не удалять ее, поэтому первое, что вам нужно сделать, это добавить метод «Очистить» все защищенные фрагменты текста. Это достаточно просто, вы просто очищаете записи на карте, используемые классом.

Затем вам нужно будет заменить действие «Enter» по умолчанию, используемое JTextPane. Вы делаете это, играя с Key Bindings текстовой области. См. Привязки клавиш для получения основной информации. В вашем настраиваемом действии вам сначала нужно вызвать только что созданный метод «clear (...)». Затем вы должны добавить текст в текстовую область. Наконец, вы должны защитить весь текст, кроме последнего числа "x" символов.

person camickr    schedule 06.10.2014