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

Nai tiruvantel ar varyuvantel i Valar tieyanna nu vilya
...
Рейтинг: 0 / 0
Прорисовка на JFrame.
    #34186522
Фотография fixxer
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
А чем рисуете?
Если в paint(Graphics g), то возможно не вызывается super.paint(g)
...
Рейтинг: 0 / 0
Прорисовка на JFrame.
    #34186987
Juga
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
frame.validate() после отрисовки
...
Рейтинг: 0 / 0
Прорисовка на JFrame.
    #34187078
leafox
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Судя по описанным симптомам, график рисуется через 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
Прорисовка на JFrame.
    #34191854
dmkm
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Конечно, большое всем спасибо, но ничего не работает. Пробовал все.
Выкладываю свой код, может где глупую ошибку допустил. Уже и не знаю...
...
Рейтинг: 0 / 0
Прорисовка на JFrame.
    #34191856
dmkm
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Код: 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
Прорисовка на JFrame.
    #34191904
fjord
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Добавь 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
Прорисовка на JFrame.
    #34195010
dmkm
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Спасибо fjord, в этом и был мой промах.
...
Рейтинг: 0 / 0
9 сообщений из 9, страница 1 из 1
Форумы / Java [игнор отключен] [закрыт для гостей] / Прорисовка на JFrame.
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


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