Модераторы: LSD, AntonSaburov
  

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Как читать посимвольно строку в JTextArea 
:(
    Опции темы
Codemancer
Дата 25.11.2008, 02:25 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 8
Регистрация: 25.11.2008

Репутация: нет
Всего: нет



Подскажите пожалуйста, что нужно добавить в нижеприведенный код, чтобы после открытия файла и загурзки его содержимого в JTextArea можно было обращаться к конкретной строке и читать ее посимвольно из JTextArea?

Код

class CEditor extends Frame{
    CEditor(String s){
        super(s);
        setLayout(null);
    
        Button OpenFileButton = new Button("Open File");
        OpenFileButton.setBounds( 40, 50, 100, 30 ); add(OpenFileButton);
        OpenFileButton.addActionListener(new ActionListener(){
            public void actionPerformed(ActionEvent ae){
                
                JTextArea CMTextArea = new JTextArea(5, 50);
                CMTextArea.setBackground(Color.LIGHT_GRAY);
                CMTextArea.setBounds(20, 100, 140, 100); add(CMTextArea);
                
                JFileChooser fch = new JFileChooser();
                int state = fch.showOpenDialog(null);
                File f = fch.getSelectedFile();            
                
                if(f != null && state == JFileChooser.APPROVE_OPTION)
                    JOptionPane.showMessageDialog(null, f.getPath());
                else if(state == JFileChooser.CANCEL_OPTION)
                    JOptionPane.showMessageDialog(null, "Canceled");
                
                 try {
                       FileReader file_reader = null;
                       file_reader = new FileReader(f);
                       char buffer[] = new char[4096];
                       int len;
                      
                       while ((len = file_reader.read(buffer)) != -1){
                              String s = new String (buffer, 0, len);
                              CMTextArea.append(s);
                       }
                    
                 } catch (IOException e) {
                        e.printStackTrace();
                 }
            }
        });
        
    
        setSize(800,700);
        setVisible(true);
    }
    public static void main(String[] args){
        Frame CMPanel = new CEditor("CMEditor v0.1");
     
        CMPanel.addWindowListener(new WindowAdapter(){
            public void windowClosing(WindowEvent ev){
                System.exit(0);
            }
        });
    }
}



И как можно вынести JTextArea из этого ActionListener? Т.е. чтобы TextArea создавалась не после нажатия кнопки и открытия файла, а уже была на главной форме при запуске приложения. 

Это сообщение отредактировал(а) Codemancer - 25.11.2008, 02:32
PM MAIL ICQ   Вверх
Codemancer
Дата 25.11.2008, 16:24 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 8
Регистрация: 25.11.2008

Репутация: нет
Всего: нет



[B]Сейчас просканировал поиск на тему вообще использования элемента JTextArea. И нашел отчасти ответа на вопрос. Вот эта тема 
 http://forum.vingrad.ru/forum/topic-203340/unread-1.html

Там задача была перегнать содержимое JTextArea в двумерный массив. 
Ответ там был таков 
Цитата
Вытащить все содержимое JTextArea в строку методом getText(), потом распарсить её с помощью StringTokenizer или Scanner. 


Я добавил код 
Код

...
} catch (IOException e) {
                        e.printStackTrace();
                 }
            }
        });
        
        String ts = CMTextArea.getText();
         
        setSize(800,700);
        setVisible(true);



Непонятна вторая часть фразы 
Цитата
 потом распарсить её с помощью StringTokenizer или Scanner  

PM MAIL ICQ   Вверх
inohodec
Дата 27.11.2008, 11:13 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


Профиль
Группа: Участник
Сообщений: 151
Регистрация: 1.12.2004

Репутация: нет
Всего: 2



Попробуй:

Код

JTextArea.getText(int offset, int length)


Это сообщение отредактировал(а) inohodec - 27.11.2008, 11:13
PM MAIL   Вверх
Codemancer
Дата 28.11.2008, 16:10 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 8
Регистрация: 25.11.2008

Репутация: нет
Всего: нет



Спасибо за совет, помогло) Еще такой вопрос, а как узнать колличество строк в JTextArea, в которую уже загружен файл?

Уже не надо, нашел ответ. Если у кого такой же вопрос, то вот ответ
Код

jTextArea1.getLineCount()


Тут возник еще вопрос. Воспользовался предложенным выше вариантом inohodeca. Вот кусок кода 
Код

            try {
            // Get the first 4 characters
            int offset = 0;
            int len = 4;
            String ts = jTextArea1.getText(offset, len);
            jLabel1.setText(ts);
            }catch (BadLocationException e){
                 jOptionPane1.showMessageDialog(null,"Невозможно прочитать данные", "Ошибка", 
                 jOptionPane1.ERROR_MESSAGE|jOptionPane1.OK_OPTION);
            }


первые 4 символа в jTextArea1 это слово "LINE". Почему, если я пытаюсь сравнить значение ts со строчкой "LINE" и если они равны - вывести сообщение, ничего не происходит? Вот код, который поидеи должен их сравнивать.
Код

            try {
            // Get the first 4 characters
            int offset = 0;
            int len = 4;
            String ts = jTextArea1.getText(offset, len);
            if (ts == "LINE")
            {
                jOptionPane1.showMessageDialog(null,"Линия", "Элемент", 
                 jOptionPane1.INFORMATION_MESSAGE|jOptionPane1.OK_OPTION);
            }
            jLabel1.setText(ts);
            }catch (BadLocationException e){
                 jOptionPane1.showMessageDialog(null,"Невозможно прочитать данные", "Ошибка", 
                 jOptionPane1.ERROR_MESSAGE|jOptionPane1.OK_OPTION);
            }



Уже нашел ответ ) Надо сравнивать так
Код

if(ts.equals("LINE")) 
или
if(ts.equalsIgnoreCase("LINE")) 


Это сообщение отредактировал(а) Codemancer - 28.11.2008, 18:39
PM MAIL ICQ   Вверх
Connie
Дата 28.11.2008, 22:25 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 382
Регистрация: 12.8.2008

Репутация: 8
Всего: 9



Codemancer, 
Код

 if (ts == "LINE")

Потому что Вы сравниваете указатели, адресы строк, а они разные, сделайте так
Код

if (ts.equals("LINE")


а еще лучше определите в классе такую константу
private или public final static String LINE_CONS = "LINE";

И сравнение будет выглядеть так
Код

if (LINE_CONST.equals(ts)) или if (ts.equals(LINE_CONST))


Модераторы, я ответ не заметил  :( , удалите пост, пожалуйста

Это сообщение отредактировал(а) Connie - 28.11.2008, 22:26
PM MAIL WWW   Вверх
inohodec
Дата 30.11.2008, 08:57 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


Профиль
Группа: Участник
Сообщений: 151
Регистрация: 1.12.2004

Репутация: нет
Всего: 2



Раз уж тут заговорили о сравнении то позволю себе дать маленький совет
Лучше сначала писать константу и сравнивать ее с объектом
Поможет избежать внезапных null pointers smile

Код

public final static String LINE_CONS = "LINE";

if (LINE_CONST.equals(ts)) // что то к нулю можно приравнять

if (ts.equals(LINE_CONST)) // а вот вызвать на нуле метод нельзя 


Это сообщение отредактировал(а) inohodec - 30.11.2008, 10:46
PM MAIL   Вверх
Codemancer
Дата 30.11.2008, 21:15 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 8
Регистрация: 25.11.2008

Репутация: нет
Всего: нет



Еще вопрс про jTextArea) Если туда уже загружен текст из нескольких строк, как конкретно обратится к определенной строке?
Например, если мне надо получить текст только из второй строки.
PM MAIL ICQ   Вверх
maratische
Дата 30.11.2008, 23:10 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 4
Регистрация: 12.11.2008

Репутация: нет
Всего: нет



ну получить оттуда весь текст getText()
А потом или с помощью регулярных выражений
или ручками через subString() indesOf()

PM MAIL ICQ GTalk   Вверх
math64
Дата 1.12.2008, 11:43 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Завсегдатай
Сообщений: 2505
Регистрация: 12.4.2007

Репутация: 5
Всего: 72



Код

int start = jTextArea.getLineStartOffset(line)
int end = jTextArea.getLineEndOffset(line);
String s = jTextArea.getText(start, end-start);

PM   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
Правила форума "Java"
LSD   AntonSaburov
powerOn   jk1
  • Прежде, чем задать вопрос, прочтите это!
  • Книги по Java собираются здесь.
  • Документация и ресурсы по Java находятся здесь.
  • Используйте теги [code=java][/code] для подсветки кода. Используйтe чекбокс "транслит", если у Вас нет русских шрифтов.
  • Помечайте свой вопрос как решённый, если на него получен ответ. Ссылка "Пометить как решённый" находится над первым постом.
  • Действия модераторов можно обсудить здесь.
  • FAQ раздела лежит здесь.

Если Вам помогли, и атмосфера форума Вам понравилась, то заходите к нам чаще! С уважением, LSD, AntonSaburov, powerOn, jk1.

 
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | Java: GUI и Java FX приложения | Следующая тема »


 




[ Время генерации скрипта: 0.0658 ]   [ Использовано запросов: 22 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.