Witam serdecznie!
Piszę pewną aplikację, której częścią UI jest właśnie JTextArea, która służy do wpisywania poleceń.
Pierwszy problem jaki mam, to problem z dodaniem do niego `JScrollPane` (a może raczej Jtextarea do Jscrollpane). Problem polega na tym, że nie ma paska przewijania, o ile nie użyje funkcji `setRows()`, której używać nie chce, ponieważ rozmiar tego obszaru ma się zmieniać wraz z rozmiarem okna. Jeżeli ustawie np. `setRows(4)` rozmiar obszaru mi się automatycznie zmienia, a pasek przewijania mam na stałe, choć w konstruktorze podałem `VERTICAL_SCROLLBAR_AS_NEEDED`.
` private JScrollPane CommandLineScrollField = new JScrollPane(CommandField, JScrollPane.VERTICAL_SCROLLBAR_AS_NEEDED, JScrollPane.HORIZONTAL_SCROLLBAR_NEVER);`
i dodaje owy CommandLineScrollField
przed frame.setVisible(true)
rightPanel.add(CommandLineScrollField, BorderLayout.SOUTH);
konstruktor dla CommandLine (klasa, która dziedziczy po JTextArea) wygląda tak:
CommandLinePanel() {
super();
int temp;
temp = (int)(panelSize.height * 0.7);
panelSize.height = panelSize.height - temp;
//setRows(4);
setPreferredSize(panelSize);
setBackground(Color.LIGHT_GRAY);
setText("Wpisz polecenie: ");
setEditable(true);
setEnabled(true);
selectAll();
registerKeyboardAction(panelAction,"ENTER",KeyStroke.getKeyStroke(KeyEvent.VK_ENTER,0,false),JComponent.WHEN_FOCUSED);
}
Drugi problem jaki mnie spotkał, to zawieszanie się całej aplikacji. Powstał on po tym, jak dodałem aplikacji podwójne buforowanie i gdy wpisywałem komendę do obszaru tekstowego to aplikacja zawieszała mi się czasami po wpisaniu pierwszej komendy i wciśnięciu ENTER, czasami po wpisaniu czwartej. Zupełna losowość. Wpadłem na pomysł, aby z przetwarzania tej komendy utworzyć nowy wątek. Wszystko git, tylko po wpisaniu komendy i otrzymaniu odpowiedzi od bota karetka ustawia się na początek obszaru lub jej położenie względem wpisywanego przeze mnie tekstu nie zmienia się wcale. Żadne `setCaretPosition()` nie za bardzo mi tutaj działa. Kod źródłowy do wypisywania w tym obszarze wygląda tak (jest on w tworzonym za każdym razem wątku):
<code> command = getText().split(System.lineSeparator());
append(System.lineSeparator() + ">Odpowiedz bota..." + System.lineSeparator());
Ponadto nie wiem, czy rozwiązanie tego wątkami przynajmniej w taki sposób w jaki ja to zrobiłem jest ok, ponieważ każde wciśnięcie ENTER tworzy nowy wątek do przetwarzania polecenia. W powyższym kodzie `command` jest to tablica Stringów na 50 elementów, która jest normalnie inicjowana i nie wiem czemu, zawsze wywala mi `ArrayIndexOutOfBoundsException: 2`(!)
Inicjalizacja tej tablicy wygląda oczywiście tak:
` private String[] command = new String[50];`
Bardzo bym prosił o jakieś wskazówki co do tych problemów.
Pozdrawiam.