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

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Помогите разобратся с перерисовкой 
V
    Опции темы
Athlon
Дата 17.2.2006, 22:26 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 100
Регистрация: 15.1.2006
Где: Украина:: Запорож ье

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



Нужно вывести отформатированый текст из файла не используя JTextPane, я вывожу текст непосредствено на фрейм - все нормально.Но мне текст надо еще и скролить по нажатию кнопок вверх вниз - вот тут то и возникает проблема, в keyPressed изменяю начальную координату и перерисовываю, а в результате на фрейме све стирается

Код

public void keyPressed(KeyEvent e)
{
        if(e.getKeyCode() == e.VK_DOWN)
        {
            cur_y += dy;
            Graphics g = this.getGraphics();
            this.paint(g);
        }
        if(e.getKeyCode() == e.VK_UP)
        {
            if(cur_y > 50) cur_y -= dy;
            Graphics g = this.getGraphics();
            this.paint(g);
        }
}

...................

public void paint(Graphics g)
{
       print_file(g);
}


пробовал выводить не текст из файла, а строки забитые в код - все работает.
PM MAIL ICQ   Вверх
batigoal
Дата 17.2.2006, 23:57 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Нелетучий Мыш
****


Профиль
Группа: Участник Клуба
Сообщений: 6423
Регистрация: 28.12.2004
Где: Санктъ-Петербургъ

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



Цитата(Athlon @ 17.2.2006, 23:26 Найти цитируемый пост)
пробовал выводить не текст из файла, а строки забитые в код - все работает.

Ну если так, то проблема в чтении данных, а не их отображении.


--------------------
"Чтобы правильно задать вопрос, нужно знать большую часть ответа" (Р. Шекли)
ЖоржЖЖ
PM WWW   Вверх
LSD
Дата 18.2.2006, 01:08 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Leprechaun Software Developer
****


Профиль
Группа: Модератор
Сообщений: 15718
Регистрация: 24.3.2004
Где: Dublin

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



Попробуй так:
Код
public void keyPressed(KeyEvent e)
{
  if(e.getKeyCode() == KeyEvent.VK_DOWN)
  {
    curY += dy;
    repaint();
  }
  if(e.getKeyCode() == KeyEvent.VK_UP)
  {
    if(curY > 50)
      curY -= dy;
    repaint();
  }
}



--------------------
Disclaimer: this post contains explicit depictions of personal opinion. So, if it sounds sarcastic, don't take it seriously. If it sounds dangerous, do not try this at home or at all. And if it offends you, just don't read it.
PM MAIL WWW   Вверх
Athlon
Дата 18.2.2006, 11:46 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 100
Регистрация: 15.1.2006
Где: Украина:: Запорож ье

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



repaint не помог,
а поповоду ошибок при чтении - вот процедура чтения файла и его вывода,
так вот при каждой перерисовке в консоль выводится что в буфер байты читаются (System.out.println(bytes_read + " - bytes read");)

Код

public void print_file(Graphics gr)
    {        
        Font old_font = gr.getFont();
        File in_file = new File(file_name);
        if(in_file.exists())
        {//указаный файл существует - буду читать
            FontMetrics Arial_big_metrics = gr.getFontMetrics(Arial_big);
            FontMetrics Arial_small_metrics = gr.getFontMetrics(Arial_small);
            Rectangle2D rect = Arial_big_metrics.getStringBounds(file_name, gr);
            dy = (int)rect.getHeight();     //высота строки            
            System.out.println("Redrawing");
            try
            {
                DataInputStream InStream;
                InStream = new DataInputStream(
                        new BufferedInputStream(
                        new FileInputStream(file_name)));
                byte buf[] = new byte[1024];
                int bytes_read;
                String line_begin = "";
                boolean big = true;                
                while((bytes_read = InStream.read(buf)) != -1)
                {//просматриваю считаный буфер
                    System.out.println(bytes_read + " - bytes read");
                    String st = new String(buf);
                    st = st.substring(0,bytes_read);
                    byte endl_bytes[] = {13, 10};
                    String endl = new String(endl_bytes);
                    String lines[] = st.split(endl);
                    System.out.println(lines[0]);
                    line_begin += lines[0];
                    
                    if(big) gr.setFont(Arial_big);
                    else gr.setFont(Arial_small);
                    gr.drawString(line_begin, 10, cur_y);
                    cur_y += dy;
                    big = !big;
                    
                    int last = lines.length - 1;
                    line_begin = lines[last];
                    int i;
                    for(i = 1; i < last; i++)
                    {
                        if(big) gr.setFont(Arial_big);
                        else gr.setFont(Arial_small);
                        gr.drawString(lines[i], 10, cur_y);
                        cur_y += dy;
                        big = !big;
                    }
                }
                if(big) gr.setFont(Arial_big);
                else gr.setFont(Arial_small);
                gr.drawString(line_begin, 10, cur_y);
                //закрываю поток чтения
                InStream.close();
            }
            catch(Exception ioe)
            {
                System.out.println("IO Exception !!!!");
            }
        }       
        gr.setFont(old_font);
    }


Это сообщение отредактировал(а) Athlon - 18.2.2006, 11:48
PM MAIL ICQ   Вверх
LSD
Дата 18.2.2006, 12:20 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Leprechaun Software Developer
****


Профиль
Группа: Модератор
Сообщений: 15718
Регистрация: 24.3.2004
Где: Dublin

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



1. Ты каждый раз при вызове paint() перечитываешь файл?
2. У тебя там стоит печать в консоль, она выводит все правильно?
3. Зачем у тебя стоит такое сложное чтение из файла, да еще без явного указания кодировки? Можно же проще:
Код
BufferedReader reader = new BufferedReader(new InputStreamReader(new FileInputStream(fileName), "UTF-8"));
String str;
while((str = reader.readLine()) != null)
{
  //do some here
}
reader.close();



--------------------
Disclaimer: this post contains explicit depictions of personal opinion. So, if it sounds sarcastic, don't take it seriously. If it sounds dangerous, do not try this at home or at all. And if it offends you, just don't read it.
PM MAIL WWW   Вверх
Athlon
Дата 18.2.2006, 13:03 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 100
Регистрация: 15.1.2006
Где: Украина:: Запорож ье

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



Как я писал выше мне нужно вывести форматированый текст без использования JTextPane (не спрашивайте зачем), другого подобного компонента я не знаю. Поэтому я читаю файл в paint - не вижу смысла загружать его в память(может я ошибаюсь??).

Спасибо, так читать файл гораздо легче, но проблема не решается.

В С++ я рисовал (выводил текст в моем случае) в другой CDC, а при перерисовке просто отображал его на экран (понятно излагаю?), может и здесь можно провернуть подобный трюк ???

Это сообщение отредактировал(а) Athlon - 18.2.2006, 13:14
PM MAIL ICQ   Вверх
LSD
Дата 18.2.2006, 14:51 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Leprechaun Software Developer
****


Профиль
Группа: Модератор
Сообщений: 15718
Регистрация: 24.3.2004
Где: Dublin

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



Код
public class JTextReader extends JComponent
{
  private String fileName;
  private String encoding;
  private BufferedImage img;
  private Font smallFont;
  private Font bigFont;
  private int currentY;

  public JTextReader(String fileName, String encoding)
  {
    this.fileName = fileName;
    this.encoding = encoding;
    img = new BufferedImage(1, 1, BufferedImage.TYPE_INT_RGB);
    bigFont = new Font("Serif", Font.BOLD, 14);
    smallFont = new Font("Serif", Font.PLAIN, 10);
    currentY = 20;
    setOpaque(true);
  }

  private void updateBuffer()
  {
    if(getWidth() != img.getWidth() || getHeight() != img.getHeight())
      img = new BufferedImage(getWidth(), getHeight(), BufferedImage.TYPE_INT_RGB);

    Graphics2D g2 = (Graphics2D) img.getGraphics();
    g2.clearRect(0, 0, img.getWidth(), img.getHeight());
    File file = new File(fileName);
    if(file.exists())
    {
      FontMetrics arialBigMetrics = g2.getFontMetrics(bigFont);
      FontMetrics arialSmallMetrics = g2.getFontMetrics(smallFont);
      Rectangle2D rect = arialBigMetrics.getStringBounds(fileName, g2);
      int dy = (int) rect.getHeight();
      int y = currentY;
      try
      {
        BufferedReader reader = new BufferedReader(new InputStreamReader(new FileInputStream(file), encoding));
        String line;
        boolean useBigFont = true;
        while((line = reader.readLine()) != null)
        {
          if(useBigFont)
            g2.setFont(bigFont);
          else
            g2.setFont(smallFont);

          g2.drawString(line, (float)10, (float)y);
          y += dy;
          useBigFont = !useBigFont;

          if(y > img.getHeight())
            break;
        }
        reader.close();
      }
      catch(Exception ex)
      {
        ex.printStackTrace();
      }
    }
  }

  public void scroll(int amount)
  {
    currentY += amount;
    updateBuffer();
    repaint();
  }

  protected void paintComponent(Graphics g)
  {
    if(getWidth() != img.getWidth() || getHeight() != img.getHeight())
      updateBuffer();

    g.setColor(getBackground());
    g.clearRect(0, 0, getWidth(), getHeight());
    g.drawImage(img, 0, 0, this);
  }

  public static void main(String[] args)
  {
    final JTextReader textReader = new JTextReader("C:\\TMP\\RDBMS\\admin.txt", "Cp866");
    JButton upButton = new JButton("UP");
    upButton.addActionListener(new ActionListener()
    {
      public void actionPerformed(ActionEvent e)
      {
        textReader.scroll(30);
      }
    });

    JButton downButton = new JButton("DOWN");
    downButton.addActionListener(new ActionListener()
    {
      public void actionPerformed(ActionEvent e)
      {
        textReader.scroll(-30);
      }
    });

    JFrame frame = new JFrame("Text frame");
    frame.getContentPane().add(textReader, BorderLayout.CENTER);
    frame.getContentPane().add(upButton, BorderLayout.NORTH);
    frame.getContentPane().add(downButton, BorderLayout.SOUTH);
    frame.setDefaultCloseOperation(JFrame.DISPOSE_ON_CLOSE);
    frame.setSize(800, 600);
    frame.setLocationRelativeTo(null);
    frame.setVisible(true);
  }
}



--------------------
Disclaimer: this post contains explicit depictions of personal opinion. So, if it sounds sarcastic, don't take it seriously. If it sounds dangerous, do not try this at home or at all. And if it offends you, just don't read it.
PM MAIL WWW   Вверх
Athlon
Дата 18.2.2006, 15:19 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 100
Регистрация: 15.1.2006
Где: Украина:: Запорож ье

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



Огромное спасибо smile !!!!!!
Неприменно добавлю плюс как только появится возможность.
PM MAIL ICQ   Вверх
LSD
Дата 18.2.2006, 15:51 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Leprechaun Software Developer
****


Профиль
Группа: Модератор
Сообщений: 15718
Регистрация: 24.3.2004
Где: Dublin

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



Плиз smile


--------------------
Disclaimer: this post contains explicit depictions of personal opinion. So, if it sounds sarcastic, don't take it seriously. If it sounds dangerous, do not try this at home or at all. And if it offends you, just don't read it.
PM MAIL WWW   Вверх
batigoal
Дата 18.2.2006, 16:40 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Нелетучий Мыш
****


Профиль
Группа: Участник Клуба
Сообщений: 6423
Регистрация: 28.12.2004
Где: Санктъ-Петербургъ

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



Цитата(Athlon @ 18.2.2006, 16:19 Найти цитируемый пост)
Неприменно добавлю плюс как только появится возможность.

Сейчас мы эту проблему пофиксим... smile


--------------------
"Чтобы правильно задать вопрос, нужно знать большую часть ответа" (Р. Шекли)
ЖоржЖЖ
PM WWW   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
Правила форума "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.1614 ]   [ Использовано запросов: 22 ]   [ GZIP включён ]


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

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