Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > Java: GUI и Java FX приложения > JTextArea+прокрутка


Автор: force 27.4.2007, 09:06
Есть некая панель. В ней находится много контролов, а внизу самом JTextArea.  Эта панель находится в JScrollPane. ТАк вот при вызове метода setText у JTextArea панель автоматически прокручивается в самый низ. Нужно же, что ничего не менялось, т.е. чтобы скрол так и оставался в верхнем положении. Программно попытка установить скролл в верхнее положение после вызова setText также не проходит (его положение не изменяется). Проблема явно связана с изменением положения каретки. Если принудительно поставить setCaretPosition(0), то тогда панель прокручивается не до самого низа, а то первой строки JTextArea (что тоже нехорошо, нужно чтобы setText никак не влиял на положение скрола).
Версия Java 1.42_05 (другую использовать не имею возможности).

Автор: dorogoyIV 27.4.2007, 11:26
попробуй вместо setText JTextArea.append();
 у меня по крайней мере работает так как ты хочешь.

Автор: nornad 27.4.2007, 15:05
Можно ещё попробовать вместо setCaretPosition(0) использовать установку фокуса на один из верхних контролов в скроллпейне (контрол.requestFocus()).

Автор: dorogoyIV 29.4.2007, 13:18
и пометь пожалуйста вопрос как решенный если нашел ответ  smile 

не ленись.  smile 

а то начинают возникать подозрения... в чем же дело?...

Автор: nornad 29.4.2007, 15:22
 smile 
Цитата(dorogoyIV @  29.4.2007,  16:18 Найти цитируемый пост)
не ленись.

Думаю, он просто ещё не успел появиться на форуме после наших ответов.

Автор: dorogoyIV 29.4.2007, 20:18
Цитата

Думаю, он просто ещё не успел появиться на форуме после наших ответов.


видел я его в онлайне  smile 

Автор: powerOn 29.4.2007, 23:00

M
powerOn
Господа, прекращаем оффтопить.

Автор: force 30.4.2007, 16:06
Вопрос то на самом деле не решен.  append не помогает. Аналогично вся панель прокручивается вниз. Возможно это проблема Java 1.42_05  такая. Фокус пробовал ставить на верхний контрол, скрол прокручивается обратно вверх, но не до конца.
Может быть несколько нерпаивльно понимается, как у меня размещены контролы. Ещё раз попробую описать.
Есть JScrollPane, в нем находится некая панель (пусть panel1). В ней находится 3 панели (сверху вниз), для каждой установлено titledBorder. Верхняя содержить просто много JLabel. Следующая за ней таблиц и самаяч нижняя JTextArea. Если в JTextArea текст не устанавливать, то все прекрасно работает, вниз не прокручивается (изначально высота основной панели такая, что JTextArea даже без текста не виден, т.е. есть скрол). Как только вызывает для JTextArea setText или append, то прокручивается самая главная панель (panel1) вниз.

Автор: nornad 30.4.2007, 18:38
Попробуй сделать так:
Код

textArea.setFocusable( false );
textArea.append( str );
textArea.setFocusable( true );

Автор: force 30.4.2007, 21:33
nornad, Спасибо, попробую. Но ведь append просто добавляет в конец. А как до этого очистить textArea, чтобы скрол вниз не прокрутился, хотя по идее setText("")  не будет прокручивать (не пробовал пока ещё).

Автор: nornad 1.5.2007, 00:16
Цитата(force @  1.5.2007,  00:33 Найти цитируемый пост)
А как до этого очистить textArea,

Просто сразу используй setText(), а не append().
Успешность метода не гарантирую, но шансы есть - фокус на компонент падать не должен, а значит и прокрутка не должна бы идти до него...

Автор: dorogoyIV 1.5.2007, 02:02
вот работающий код:

Код

import java.awt.*;
import javax.swing.*;
import javax.swing.JTextArea;
import javax.swing.JButton;
import java.awt.event.*;

public class ScrollPane extends JFrame
{
 JTextArea jta;
 JButton jb;

 public ScrollPane(String s) 
 {
  super(s);
  setBounds(100,100,300,100);
  setResizable(false);
  setLayout(new BorderLayout());
  JLabel label = new JLabel("panel 2"); 
  jta=new JTextArea(" ");
  jb=new JButton("Text");
  jb.addActionListener(new ActionListener()
  {
   public void actionPerformed(ActionEvent e)
   {
    jta.append("1"+'\n'+"2"+'\n'+"3");
//    jta.setText("1"+'\n'+"2"+'\n'+"3");
   }
  });
  JPanel p1=new JPanel();
  JPanel p2=new JPanel();
  JPanel p3=new JPanel();
  p1.add(jb);
  p2.add(label);
  p3.add(jta);
  JPanel p4=new JPanel();
  p4.setLayout(new BorderLayout());
  p4.add(p1,BorderLayout.NORTH);
  p4.add(p2,BorderLayout.CENTER);
  p4.add(p3,BorderLayout.SOUTH);
  int h = ScrollPaneConstants.HORIZONTAL_SCROLLBAR_AS_NEEDED; 
  int v = ScrollPaneConstants.VERTICAL_SCROLLBAR_AS_NEEDED;

  JScrollPane scrollPane = new JScrollPane(p4,v,h); 
  add(scrollPane, BorderLayout.CENTER); 
 } 

 public static void main(String[]args)
 {
  JFrame ScrollPane=new ScrollPane("panels");
  ScrollPane.setVisible(true);
  ScrollPane.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
 }
}


если поиграешь с 25 и 26 строкой, увидишь разницу  smile 

также обрати внимание на строку:
Код

  jta=new JTextArea(" ");

сразу написан пробел. если его убрать и написать:
Код

  jta=new JTextArea();

опять будет прокручивать вниз.
думаю дальше надо делать как говорил nornad, но я не проверял.

Автор: force 1.5.2007, 16:28
B]nornad[/B], Нет, метод не прошел. ВСе равно прокручивается.

dorogoyIV,  Большое спасибо! То, что надо. Но вот с очисткой всего этого проблемы. setText ("") вызывается нормально, но после него при добавлении прокручивакется вниз (вызов setText(" ") само прокручивает). Единственное возможное решение, которое я вижу, это удалять компонент и создавать заново при каждом добавлении текста. Но это как-то криво.

Я только не понимаю, зачем нужно было так мудрить с JTextArea. Зачем делать по умолчанию эту прокрутку ?!

Автор: dorogoyIV 1.5.2007, 17:00
Цитата

удалять компонент и создавать заново при каждом добавлении текста. Но это как-то криво.


если тебя устроит, то здесь поможет jTextArea.setEditable(false);

Автор: force 1.5.2007, 17:20
dorogoyIV,  И чем он мне может помочь, что-то слабо понял. Мне нужно всего лишь при нажатии на кнопку Text в вашем примере текст не добавлялся к текущему содержимому, а просто устанавливался (ну и не прокручивался).

Автор: dorogoyIV 1.5.2007, 17:25
Цитата

И чем он мне может помочь, что-то слабо понял. Мне нужно всего лишь при нажатии на кнопку Text в вашем примере текст не добавлялся к текущему содержимому, а просто устанавливался (ну и не прокручивался).


мой пример показывает в общих чертах. тебе надо подстраивать под свой код (я то его не видел).

Автор: force 1.5.2007, 18:09
dorogoyIV, ОК, спасибо за помощь! Буду разбираться тщательно в этом. Вопрос можно сказать решен.

Автор: force 2.5.2007, 17:41
Вот правильное решение проблемы, если кому интересно. Нашел в списке багов Swing на сайте Sun:
http://bugs.sun.com/bugdatabase/view_bug.do?bug_id=4476714
Там есть решение проблемы и для версий старше 1.5, и для 1.5. и новее.

Автор: IceQueen 16.5.2007, 15:17
сделаи отдельный клас: ТextAreaStream   , а потом в  mainFrame добавь 
Код

       initTxtArea();        
        getContentPane().add(new JScrollPane(txtArea));
        System.setOut(new PrintStream(new TextAreaStream(txtArea)));


========================
Код

package idp.gui;

import java.io.*;
import java.lang.*;
import javax.swing.*;


public class TextAreaStream extends OutputStream
{    
    
    private JTextArea textArea;
    
    public TextAreaStream(JTextArea textArea)
    {
        this.textArea = textArea;
    }

    public void write(int b) throws IOException
    {
        char c = (char)b;
        textArea.append(String.valueOf(c));
    }
}




Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)