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


Автор: Athlon 17.2.2006, 22:26
Нужно вывести отформатированый текст из файла не используя 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);
}


пробовал выводить не текст из файла, а строки забитые в код - все работает.

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

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

Автор: LSD 18.2.2006, 01:08
Попробуй так:
Код
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();
  }
}

Автор: Athlon 18.2.2006, 11:46
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);
    }

Автор: LSD 18.2.2006, 12:20
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();

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

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

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

Автор: LSD 18.2.2006, 14:51
Код
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);
  }
}

Автор: Athlon 18.2.2006, 15:19
Огромное спасибо smile !!!!!!
Неприменно добавлю плюс как только появится возможность.

Автор: LSD 18.2.2006, 15:51
Плиз smile

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

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

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