Гость
Целевая тема:
Создать новую тему:
Автор:
Форумы / Java [игнор отключен] [закрыт для гостей] / Прорисовка на JFrame. / 9 сообщений из 9, страница 1 из 1
08.12.2006, 12:38:18
    #34185848
dmkm
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Прорисовка на JFrame.
Помогите, пожалуйста, разобраться. Нажимаю на кнопку "Показать диаграмму", на JFrame ничего не появляется. Растягиваю окно, диаграмма появляется. Пробовал использовать JPannel: нажимаю кнопку, диаграмма появляется, но когда растягиваю или увожу окно за границы экрана, рисунок стирается. Так как же нарисовать по нажатию кнопки диаграмму и сделать так, чтобы она не стиралась?
...
Рейтинг: 0 / 0
08.12.2006, 12:45:55
    #34185872
hinotf
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Прорисовка на JFrame.
Может, что-то не так с minSize, maxSize и менеджером разметки?

Nai tiruvantel ar varyuvantel i Valar tieyanna nu vilya
...
Рейтинг: 0 / 0
08.12.2006, 15:06:23
    #34186522
fixxer
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Прорисовка на JFrame.
А чем рисуете?
Если в paint(Graphics g), то возможно не вызывается super.paint(g)
...
Рейтинг: 0 / 0
08.12.2006, 17:21:34
    #34186987
Juga
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Прорисовка на JFrame.
frame.validate() после отрисовки
...
Рейтинг: 0 / 0
08.12.2006, 17:54:25
    #34187078
leafox
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Прорисовка на JFrame.
Судя по описанным симптомам, график рисуется через getGraphics() напрямую. Естественно, после изменения размеров окна и др. что влияет на перерисовку, график пропадает.
Нужно сделать так:

Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
 class  GraphPanel
 extends  JPanel
{
          public   void  paintComponent( Graphics g )
         {
             super .paintComponent( g );
            Graphics2D g2 = ( Graphics2D )g;
           // а вот тут нужно рисовать график
         }
}
Теперь эту панель добавляем в фрейм, напр. frame.getContentPane().add( panel ) и все нормально будет
...
Рейтинг: 0 / 0
11.12.2006, 23:51:56
    #34191854
dmkm
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Прорисовка на JFrame.
Конечно, большое всем спасибо, но ничего не работает. Пробовал все.
Выкладываю свой код, может где глупую ошибку допустил. Уже и не знаю...
...
Рейтинг: 0 / 0
11.12.2006, 23:53:29
    #34191856
dmkm
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Прорисовка на JFrame.
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
28.
29.
30.
31.
32.
33.
34.
35.
36.
37.
38.
39.
40.
41.
42.
43.
44.
45.
46.
47.
48.
49.
50.
51.
52.
53.
54.
55.
56.
57.
58.
59.
60.
61.
62.
63.
64.
65.
66.
67.
68.
69.
70.
71.
72.
73.
74.
75.
76.
77.
78.
79.
80.
81.
82.
83.
84.
85.
86.
87.
88.
89.
90.
91.
92.
93.
94.
95.
96.
97.
98.
99.
100.
101.
102.
103.
104.
105.
106.
107.
108.
109.
110.
111.
112.
113.
114.
115.
116.
117.
118.
119.
120.
121.
122.
123.
124.
125.
126.
127.
128.
129.
130.
131.
132.
133.
134.
135.
136.
137.
138.
139.
140.
141.
142.
143.
144.
145.
146.
147.
148.
149.
150.
151.
152.
153.
154.
155.
156.
157.
158.
159.
160.
161.
162.
163.
164.
165.
166.
167.
168.
169.
170.
171.
172.
173.
174.
175.
176.
177.
178.
179.
180.
181.
182.
183.
184.
185.
186.
187.
188.
189.
190.
191.
192.
 import  java.awt.*;

 import  java.awt.event.*;

 import  javax.swing.*;

 import  java.util.Random;

//	Основной класс 
 public   class  Diagram  extends  JFrame  implements  ActionListener {

     int  arrLength =  5 ;				//	Кол-во строк таблицы
     private  DCanvas dCanv;			//	Канва для рисования диаграммы
     private  JButton goButton;	    //	Кнопка действия
     private  JTable dataTable;	    //	Таблица для ввода исходных данных
     private  Panel tPanel;	  		//	Панель для размещения диаграммы
    //private Panel dPanel;			//	Панель для размещения диаграммы
     private  JPanel btPanel;			//	Панель для кнопки
    
    //	Конструктор класса
     public  Diagram() {    	
    	setTitle("Круговая диаграмма");

    	//	Указываем менеджер компоновки  
    	BorderLayout lay =  new  BorderLayout();	
        setLayout(lay);      	
    	dataTable =  new  JTable(arrLength, 1 ); 
   	
    	//	Заносим данные по-умолчанию
    	dataTable.getModel().setValueAt( 17 ,  0 ,  0 );
    	dataTable.getModel().setValueAt( 12 ,  1 ,  0 );
    	dataTable.getModel().setValueAt( 10 ,  2 ,  0 );
    	dataTable.getModel().setValueAt( 26 ,  3 ,  0 );
    	dataTable.getModel().setValueAt( 22 ,  4 ,  0 );  
      	
    	// 	Размещаем диаграмму
    	dCanv =  new  DCanvas();    	
         int [] arr =  new   int [arrLength];  	
 	     for  ( int  i= 0 ; i<arrLength; i++) {
          //  Формируем новый массив с данными	  
          arr[i] = Integer.valueOf(dataTable.getModel().getValueAt(i,  0 ).toString());
	    }       
 	    //	Задаем ширину и высоту диаграммы
    	 int  h =  this .getHeight()- 70 ;
    	 int  w =  this .getWidth()- 100 ;
    	
        dCanv.init(arr, w, h);
        add(dCanv, BorderLayout.CENTER); 
        
    	// 	Размещаем панель для таблицы  
    	tPanel =  new  Panel();
	    add(tPanel, BorderLayout.WEST);		
	    tPanel.add(dataTable);    
	 
    	//	Размещаем панель для кнопки
    	btPanel =  new  JPanel();
    	add(btPanel, BorderLayout.SOUTH);  
  	
    	//	Назначаем слушателя для кнопки и помещаем её на панель
    	goButton =  new  JButton("Показать диаграмму");
    	goButton.addActionListener( this );    	
    	btPanel.add(goButton);

    	//	Настройки для окна
    	setSize( 410 ,  390 );
    	setVisible(true);
    }  
    
    //	Обработчик события
     public   void  actionPerformed(ActionEvent e) {   
    	
       if  (e.getSource()==goButton) { 
    	  
         int [] arr =  new   int [arrLength];      	
	
 	     for  ( int  i= 0 ; i<arrLength; i++) {
          //  Формируем новый массив с данными	  
          arr[i] = Integer.valueOf(dataTable.getModel().getValueAt(i,  0 ).toString());
	    }
 	    //	Задаем ширину и высоту диаграммы
    	 int  h =  this .getHeight()- 70 ;
    	 int  w =  this .getWidth()- 100 ;

    	dCanv.init(arr, w, h);
    	dCanv.update(getGraphics());
    	//validate();
    	//System.out.print("Okk");	 	

      }  else  {
    	  setVisible(false);
    	  dispose();
    	  System.exit( 0 );
      }   

    }    

     public   static   void  main(String[] args) {    	
       new  Diagram();    	
    }  
  
}

//	Класс, рисующий диаграмму

 class  DCanvas  extends  Canvas {

	 int  w, h;
	 int [] data;
	Color[] colors;

         public   void  init( int [] arr,  int  width,  int  height) {

           int  i, r, g, b;

           this .data =  new   int [arr.length];

           this .colors =  new  Color[arr.length]; 

          Random rnd =  new  Random();

           this .w = width;

           this .h = height;

           for  (i =  0 ; i < data.length; i++) {

            r = rnd.nextInt( 255 );

            g = rnd.nextInt( 255 );

            b = rnd.nextInt( 255 );

             this .colors[i] =  new  Color(r, g, b);

             this .data[i] = arr[i];

          }

        }

	
	 public   void  paint(Graphics g) {
		
	   super .paint(g);

	   int  x,y, size, i;

	  x = w/ 2 ;

	  y = h/ 2 ;
		
	  size = Math.min(x,y)- 1 ;

	   int  fi =  0 , psi;

	   for  (i =  0 ; i < data.length; i++) {

	    psi = data[i]* 363 /sum();

	    g.setColor(colors[i]) ;

	    g.fillArc(x-size, y-size,  2 *size,  2 *size, fi, psi);

	    g.setColor(Color.black);

	    g.setFont( new  Font("Serif",Font.BOLD,  ( int ) (size/ 16 )));

	    g.drawString(Integer.toString(i+ 1 ) + " строка (" +  new  Integer(( int )data[i]* 100 /sum()).toString() + " %)", x+( int ) ((size*Math.cos((fi+psi/ 2 )*Math.PI/ 180 ) / 1 . 5 )), y-( int )((size*Math.sin ((fi+psi/ 2 )*Math.PI/ 180 )/ 1 . 5 )));
	    
            g.drawLine(x,y,x+( int )(size*Math.cos(fi*Math.PI/ 180 )),y-( int )(size*Math.sin (fi*Math.PI/ 180 )));
	    
            fi += psi;

	  } 

	  g.drawOval(x-size, y-size,  2 *size,  2 *size);

	}
	
	//  Сумма исходных данных
	 public   int  sum() {
		
	   int  summa =  0 ;		
	   for  ( int  i =  0 ; i < data.length; i++) {
	     summa += data[i];
	  }
	   return  summa;
	  
	}
}

      
...
Рейтинг: 0 / 0
12.12.2006, 00:52:05
    #34191904
fjord
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Прорисовка на JFrame.
Добавь dCanv.repaint();
т.е.:
Код: plaintext
1.
2.
3.
4.
5.
6.
 	    //	Задаем ширину и высоту диаграммы
    	 int  h =  this .getHeight()- 70 ;
    	 int  w =  this .getWidth()- 100 ;

    	dCanv.init(arr, w, h);
    	dCanv.update(getGraphics());
        dCanv.repaint();
...
Рейтинг: 0 / 0
13.12.2006, 00:27:03
    #34195010
dmkm
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Прорисовка на JFrame.
Спасибо fjord, в этом и был мой промах.
...
Рейтинг: 0 / 0
Форумы / Java [игнор отключен] [закрыт для гостей] / Прорисовка на JFrame. / 9 сообщений из 9, страница 1 из 1
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]