2014-09-09 2 views
0

Кто-нибудь знает, почему бары на моем барграфе появляются вверх ногами? И какой код я мог бы добавить, чтобы оставить немного места между каждым штрихом? Когда я говорю с ног на голову я имею в виду, что бары даже в верхней и спускаясь они различаются по длинеJPanel HELP, чтобы нарисовать барграф

import java.awt.*; 

import javax.swing.*; 
public class Panel extends JPanel 
    { 
    int []nums; 
    String[]cat; 
    String t; 
    int max=0; 
    int width=0; 
    int height=0; 
    public Panel(int []x,String[]y,String a) 
    { 
     for(int i=0;i<x.length;i++) 
     { 
      if(x[i]>max) 
       max=x[i]; 
     } 
     nums=x; 
     cat=y; 
     t=a; 
     width=nums.length*100+nums.length*10; 
     height=max*10+500; 
     setSize(width,height); 
    } 
    public void paint(Graphics g) 
    { 
     Font title=new Font("TimesNewRoman",Font.BOLD,20); 
     FontMetrics titl=g.getFontMetrics(title); 
     g.setFont(title); 
     g.drawString(t,width/2,20); 
     Font label=new Font("TimesNewRoman",Font.BOLD,15); 
     FontMetrics labl=g.getFontMetrics(label); 
     g.setFont(label); 
     for(int j=0;j<nums.length;j++) 
     { 
      g.setColor(new Color((int)(Math.random()*256),(int)(Math.random()*256),(int)(Math.random()*256))); 
      g.drawString(cat[j],(nums.length*100)-((nums.length-j)*100)+22,height-20); 
      g.fillRect(j*100,height-400,100,nums[j]*15); 


     } 





    } 
} 
+0

Не переопределяйте 'paint', это не лучший метод для использования, подумайте об использовании' paintComponent' и убедитесь, что вы вызываете 'super.paintComponent', прежде чем выполнять какую-либо обычную роспись. См. [Выполнение пользовательской живописи] (http://docs.oracle.com/javase/tutorial/uiswing/painting/) для получения более подробной информации. – MadProgrammer

+0

См. [Хорошее объяснение] (http://stackoverflow.com/a/22361960/2587435) и [пример] (http://stackoverflow.com/a/22075683/2587435) –

ответ

3

Основной вопрос ...

g.fillRect(j * 100, height - 400, 100, nums[j] * 15); 

В основном, это говорит о том, чтобы нарисовать прямоугольник от j * 100 х height - 400, который 100 широких и nums[j] * 15 высоких ...

прямоугольник рисуется вправо/вниз от й/у позиции

Вы должны компенсировать y позицию с height по высоте бара ...

g.fillRect(j * 100, height - (nums[j] * 15), 100, nums[j] * 15); 

Не перегружайте paint, это не самый лучший метод использовать, рассмотреть возможность использования paintComponent и убедитесь, что вы звоните super.paintComponent перед выполнением любых пользовательских работ. См. Performing Custom Painting для более подробной информации.

Не используйте setSize для компонентов, любые значения, которые вы передадите, будут сброшены диспетчером макета родительского контейнера. Вместо этого замените getPreferredSizeJPanel.

Никогда не предполагайте что-либо о фактическом размере компонента из метода paint, что вы хотите, и то, что вы получаете, не всегда будет одним и тем же.

Используйте getWidth и getHeight, чтобы определить фактический размер области просмотра.

+0

так как я могу исправить это @MadProgrammar – user3196301

+0

См. обновление ...... – MadProgrammer

+0

@ user3196301: и снова, как комментарий Мада, переопределить paintComponent и вызовите метод super. 1+ –

0

Из документов для fillRect() (с моей empasis):

левого и правый края прямоугольника находятся на х и х + ширина - 1. сверху и снизу края в у и у + высота - 1.

Так x увеличивается вправо и y - вниз.