2016-04-11 3 views
1

Я пытаюсь обновить свой файл на основе данных, которые изменяются во время работы симулятора.Круговая диаграмма, не показывающая ожидаемый результат

Моя проблема заключается в том, что в piechart не отображаются данные правильным образом, и я не знаю, в чем проблема.

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

     int totalAmountOfCars = this.adhocCars + this.reservationCars + this.parkpassCars; 
     float percentageAdHoc = totalAmountOfCars <= 0 || this.adhocCars <= 0 ? 0 : adhocCars/totalAmountOfCars * 100; 
     float percentageParkPass = totalAmountOfCars <= 0 || this.parkpassCars <= 0 ? 0 :parkpassCars/totalAmountOfCars * 100; 
     float percentageReservation = totalAmountOfCars <= 0 || this.reservationCars <= 0 ? 0 :reservationCars/totalAmountOfCars * 100; 


     float adHocAngle = totalAmountOfCars <= 0 || this.adhocCars <= 0 ? 0 : 360/percentageAdHoc*100; 
     float parkPassAngle = totalAmountOfCars <= 0 || this.parkpassCars <= 0 ? 0 : 360/percentageParkPass*100; 
     float reservationAngle = totalAmountOfCars <= 0 || this.reservationCars <= 0 ? 0 : 360/percentageReservation*100; 

     Dimension prefSize = this.getPreferredSize(); 
     g.setColor(Color.WHITE); 
     g.fillRect(prefSize.width/2, prefSize.height/2, 200, 200); 

Здесь я вычислить углы для дуг ..

g.setColor(Color.RED); 
g.fillArc(prefSize.width/2 + 10, prefSize.height/2 + 10, 180, 180, 0,(int)adHocAngle); 
g.setColor(Color.BLUE); 
g.fillArc(prefSize.width/2 + 10, prefSize.height/2 + 10, 180, 180, (int)adHocAngle, (int)adHocAngle+(int)parkPassAngle); 
g.setColor(Color.ORANGE); 
g.fillArc(prefSize.width/2 + 10, prefSize.height/2 + 10, 180, 180,(int)adHocAngle+(int)parkPassAngle, (int)reservationAngle); 

Эта часть должна заполнить ее, а в некоторых случаях целые символы заполнена оранжевым и в других случаях его на 99% красного с крошечная линия синего цвета. Вместо 30%, 40%, 30%, например.

Желтый Диаграмма:
enter image description here

Красный/Синий Диаграмма:
enter image description here

+2

Это трудно для большинства из нас, чтобы догадаться, что может быть неправильным, так как мы не в состоянии проверить небольшие отдельные биты кода. Мы не хотим видеть целую большую программу, так как это подавит нас кодом, большая часть которого полностью не связана с вашей проблемой, но мы очень ценим это, когда плакат прилагает небольшие усилия для создания небольшой компилябельной и исполняемой демонстрации программы, [mcve] (https://stackoverflow.com/help/mcve). Пожалуйста, посмотрите на ссылку для получения более подробной информации о том, что мы просим вас опубликовать. –

+1

Также это: '' Моя проблема в том, что в piechart не отображаются данные правильным образом ... "' - говорит нам мало пользы. Как * точно * ваша программа плохо себя ведет? Детали имеют значение. –

+0

'360/percentAdHoc * 100;' '' '' 'выглядит очень подозрительно. Тригонометрические методы Java обычно работают в радианах. –

ответ

0

Ваша проблема может быть, как вы звоните Graphics#fillArc(...). Если вы посмотрите на Graphics API, и, в частности, в этом методе, вы увидите:

public abstract void fillArc(int x, 
          int y, 
          int width, 
          int height, 
          int startAngle, 
          int arcAngle) 

Обратите внимание, что описание последнего параметра, arcAngle, говорится:

arcAngle - угловой размер дуги относительно начального угла.

Вы можете вызвать метод, как если бы он представлял конечный угол градуса дуги, но это не так, как его следует называть. Опять же, он должен представлять размер дуги в градусах.

Например:

import java.awt.Color; 
import java.awt.Dimension; 
import java.awt.Graphics; 
import java.awt.Graphics2D; 
import java.awt.RenderingHints; 
import java.awt.event.ActionEvent; 
import java.awt.event.ActionListener; 
import java.awt.event.KeyEvent; 
import java.util.Random; 
import javax.swing.*; 

@SuppressWarnings("serial") 
public class PieDemo extends JPanel { 
    private static final int PREF_W = 600; 
    private static final int PREF_H = PREF_W; 
    private static final Color BG = Color.WHITE; 
    private static final int GAP = 40; 
    public static final int TIMER_DELAY = 400; 
    private int redPercent = 0; 
    private int bluePercent = 0; 
    // green will be remainder 

    public PieDemo() { 
     setBackground(BG); 
     add(new JButton(new StartDemoAction("Start", KeyEvent.VK_S))); 
    } 

    @Override 
    protected void paintComponent(Graphics g) { 
     super.paintComponent(g); 
     Graphics2D g2 = (Graphics2D) g; 
     g2.setRenderingHint(RenderingHints.KEY_ANTIALIASING, RenderingHints.VALUE_ANTIALIAS_ON); 
     int redAngle = (redPercent * 360)/100; 
     int blueAngle = (bluePercent * 360)/100; 
     int greenAngle = 360 - redAngle - blueAngle; 
     greenAngle = Math.max(greenAngle, 0); 
     int startAngle = 0; 
     startAngle = drawPie(g, Color.green, startAngle, greenAngle); 
     startAngle = drawPie(g, Color.RED, startAngle, redAngle); 
     startAngle = drawPie(g, Color.BLUE, startAngle, blueAngle); 
    } 

    private int drawPie(Graphics g, Color color, int startAngle, int arcAngle) { 
     int x = GAP; 
     int y = GAP; 
     int w = getWidth() - 2 * GAP; 
     int h = getHeight() - 2 * GAP; 
     g.setColor(color); 
     g.fillArc(x, y, w, h, startAngle, arcAngle); 
     return startAngle + arcAngle; 
    } 

    @Override 
    public Dimension getPreferredSize() { 
     if (isPreferredSizeSet()) { 
      return super.getPreferredSize(); 
     } 
     return new Dimension(PREF_W, PREF_H); 
    } 

    private class StartDemoAction extends AbstractAction { 
     private Timer timer = null; 
     public StartDemoAction(String name, int mnemonic) { 
      super(name); 
      putValue(MNEMONIC_KEY, mnemonic); 
     } 

     @Override 
     public void actionPerformed(ActionEvent e) { 
      if (timer != null && timer.isRunning()) { 
       return; 
      } 
      redPercent = 0; 
      bluePercent = 0; 
      repaint(); 
      timer = new Timer(TIMER_DELAY, new TimerListener()); 
      timer.start(); 
     } 
    } 

    private class TimerListener implements ActionListener { 
     private static final int BOUND = 10; 
     private Random random = new Random(); 

     @Override 
     public void actionPerformed(ActionEvent e) { 
      if (redPercent + bluePercent >= 100) { 
       ((Timer) e.getSource()).stop(); 
      } else { 
       redPercent += random.nextInt(BOUND); 
       bluePercent += random.nextInt(BOUND/2); 

       if (redPercent + bluePercent > 100) { 
        bluePercent = 100 - redPercent; 
       } 
       repaint(); 
      } 
     } 
    } 

    private static void createAndShowGui() { 
     PieDemo mainPanel = new PieDemo(); 

     JFrame frame = new JFrame("PieDemo"); 
     frame.setDefaultCloseOperation(JFrame.DISPOSE_ON_CLOSE); 
     frame.getContentPane().add(mainPanel); 
     frame.pack(); 
     frame.setLocationByPlatform(true); 
     frame.setVisible(true); 
    } 

    public static void main(String[] args) { 
     SwingUtilities.invokeLater(new Runnable() { 
      public void run() { 
       createAndShowGui(); 
      } 
     }); 
    } 
} 
1

Может быть, вы хотите, чтобы убедиться, что ваши расчеты процентов являются правильными первыми.

adhocCars/totalAmountOfCars * 100; 

Должно быть

100/totalAmountOfCars * adhocCars; 
Смежные вопросы