Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > Java: Апплеты > не работает repaint() и revalidate();


Автор: Kremlin 23.11.2011, 22:06
В общем и целом, есть две кнопки, при нажатии должно перерисовываться, а в идеале появляться полоса прокрутки. Но перерисовывается только при изменении размера, в вебе такое не сработает, так что незнаю что придумать.
Подскажите пожалуйста, где ошибка. 
Вот весь код т.к не знаю что нужно, что нет.
это мейн
Код

import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.awt.event.MouseListener;

import java.awt.event.MouseEvent;

import java.applet.Applet;

import java.awt.Container;
import java.awt.Font;
import java.awt.TextArea;
import java.util.ArrayList;
import java.util.List;
import java.util.Random;

import javax.swing.BoxLayout;
import javax.swing.JButton;
import javax.swing.JComponent;
import javax.swing.JLabel;
import javax.swing.JPanel;
import javax.swing.JScrollPane;

public class NewJApplet extends Applet {
    TextArea text_area;
    int start = 0;
    int stop = 0;
    int click = 0;
    int keytyped = 0;
    PaintGraph pg,pg1=null;
    StringBuffer buffer; 
    Font font = new Font("Verdana", Font.PLAIN, 25);
    private static List<PaintGraph> graphs = new ArrayList<PaintGraph>();
    public void init() {
         setLayout(new BoxLayout(this,BoxLayout.Y_AXIS));

         //понель кнопок
         JPanel butPan=new JPanel();
         butPan.setLayout(new BoxLayout(butPan, BoxLayout.X_AXIS));
         JButton addButton = new JButton("+");
         addButton.setFont(font);
         addButton.setFocusable(false);
         butPan.add(addButton);
  
         JButton remButton = new JButton("-");
         remButton.setFont(font);
         remButton.setFocusable(false);
         butPan.add(remButton);
         
         add(butPan);
         // понель графиков
         final JPanel graphPanel = new JPanel();
            final JScrollPane scrollPane = new JScrollPane(graphPanel);
            graphPanel.setLayout(new BoxLayout(graphPanel, BoxLayout.Y_AXIS));
            add(graphPanel);
            
            // кнопки
         addButton.addActionListener(new ActionListener() {
             public void actionPerformed(ActionEvent e) {
                   PaintGraph pg=new PaintGraph(getArray(600),0);
                  graphs.add(pg);
                 graphPanel.add(pg);
                 //repaint();
                 scrollPane.revalidate();
             }            
         });
         
         remButton.addActionListener(new ActionListener() {
             public void actionPerformed(ActionEvent e) {
                 if(graphs.size() > 0) {
                     int index = graphs.size() - 1;
                     PaintGraph pg = graphs.remove(index);
                     graphPanel.remove(pg);
                     repaint();
                     scrollPane.revalidate();                    
                 }                
             }            
         });
}
    
    public int[] getArray(int kol){
        Random random = new Random();
        int[] array = new int[kol];
        for (int i=0;i<kol;i++){
            array[i]=100-Math.abs(random.nextInt(100));
            }
        return array;
    }
    
} 


сам PaintGraph
Код

import java.awt.*;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.util.Random;

import javax.swing.*;

public class PaintGraph extends JPanel
{
 /**
     * 
     */
    private static final long serialVersionUID = 6090550533945953271L;
    private int[] array;
    private int shy;

 public PaintGraph(int[] array,int shy)
 {
     setArray(array);
     setShy(shy);
  /*
   * ny = 10;// цена деления  по шкалам
   * ky = (float)1.0; // коэф шкалы по у
   * kx = (float)0.0; // коэф шкалы по x
   * oyn = 50; // начальный отступ по y
   * oxn = 50 ; //начальный отступ по х
   * ly = 100; // длина оси у
   * lx = 600; // длина оси х
   * sh=0;//сещение граффика
   */
 }


public void paint(Graphics g) {
    super.paint(g);
    drawGr(g, 10,(float)1.0, 0, shy, 50, 100, 600,array);
 }


 // Метод рисующий массив
    void drawGr(Graphics g,int ny, float ky, float kx, int oyn, int oxn, int ly, int lx, int[] arr){
    //Разбиваем каждую ось на две части для удобства переноса центра координат
      // Ось Y
      g.drawLine( (int)(lx*kx+oxn),oyn,
    (int)(lx*kx+oxn),ly+oyn);
      // Стрелки
      g.drawLine((int)(lx*kx+oxn),oyn,
                  (int)(lx*kx+oxn)-3,oyn+10);
      g.drawLine((int)(lx*kx+oxn),oyn,
                  (int)(lx*kx+oxn)+3,oyn+10);
      // Надпись
      g.drawString("Y",(int)(lx*kx+oxn)-10,oyn+10);
      g.drawString("0",(int)(lx*kx+oxn)-10,(int)(ly*ky+oyn)+10);
      //Деления
      int l1 = (int)(ly*ky);
      int l2 = ly - l1;
      int k1 = (int)l1/ny;
      int k2 = (int)l2/ny;
      for (int i=1;i<k1+1;i++)
      {
       g.drawLine((int)(lx*kx-2+oxn),l1-ny+oyn,
                  (int)(lx*kx+2+oxn),l1-ny+oyn);
       l1=l1-ny;
      }
      l1=ly-l2;
      for(int i=1;i<k2+1;i++)
      {
       g.drawLine((int)(lx*kx-2+oxn),l1+ny+oyn,
                   (int)(lx*kx+2+oxn),l1+ny+oyn);
       l1=l1+ny;
      }
      // Ось Х
      g.drawLine(oxn,(int)(ly*ky+oyn),lx+oxn,(int)(ly*ky+oyn));
      g.drawLine(lx+oxn,(int)(ly*ky+oyn),lx+oxn-10,
                            (int)(ly*ky+oyn)-3);
      g.drawLine(lx+oxn,(int)(ly*ky+oyn),lx+oxn-10,
                            (int)(ly*ky+oyn)+3);
      // Надпись
      g.drawString("Х",lx+40,(int)(ly*ky+oyn)-10);
      // Деления
      l1 = (int)(lx*kx);
      l2 = lx - l1;
      k1 = (int)l1/ny;
      k2 = (int)l2/ny;
      for (int i=1;i<k1+1;i++)
      {
       g.drawLine(l1-ny+oxn,(int)(ly*ky-2+oyn),
                   l1-ny+oxn,(int)(ly*ky+2+oyn));
       l1=l1-ny;
      }
      l1=lx-l2;
      for(int i=1;i<k2+1;i++)
     {
       g.drawLine(l1+ny+oxn,(int)(ly*ky-2+oyn),
       l1+ny+oxn,(int)(ly*ky+2+oyn));
       l1=l1+ny;
      }
      // Выбор метода для рисования функции
       int x1=oxn,y1=ly+oyn,y2;
       for (;x1<lx;){
           y2=arr[x1-50]+oyn;
           x1++;
           g.drawLine(x1,y1,x1+1,y2);
           y1=y2;
           }
 }
 
 
    public int getShy() {
    return shy;
}

    public void setShy(int shy) {
    this.shy = shy;
}

    public int[] getArray() {
    return array;
}

    public void setArray(int[] array) {
    this.array = array;
}
}

repaint() в коментариях, так как и без него должно работать, но пробовал и с ним - ничего

Автор: LSD 24.11.2011, 09:37
1. Вызывай revalidate() у всего апплета. И замени Applet на JApplet.
2. У PaintGraph нет prefered size, может так получится что layout manager установит ему нулевые размеры.

Автор: Kremlin 24.11.2011, 20:00
Спасибо большое!

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