2016-04-25 12 views
0

Ich suche nach Hilfe zu einem Java-Programm, das ich schreibe. Ich muss ein einfaches Balkendiagramm anzeigen, das aus Rechtecken besteht, die auf Daten basieren, die in einem Array gespeichert sind, das von einem JList-Auswahlereignis generiert wurde. Im JPanel ist jedoch nichts gezeichnet und ich kann nicht herausfinden, wie ich es beheben kann.Wie zeichne Rechtecke aus einer JList Auswahl

  1. Listenauswahl-Ereignis (als Referenz)

    try 
    { 
    BufferedReader in = new BufferedReader((new FileReader("scores.txt"))); 
    
    String sLine; 
    
    while ((sLine = in.readLine()) != null) 
    { 
        vecAthlete.addElement(new Stage3_DataFile(sLine)); 
    } 
    
    String[] saAthlete = new String[vecAthlete.size()]; 
    for (int iI = 0; iI < vecAthlete.size(); iI++) 
        saAthlete[iI] = vecAthlete.get(iI).sName; 
    jList_Athlete.setListData(saAthlete); 
    jList_Athlete.setSelectedIndex(0); 
    
    // Reading input line by line 
    // Close file 
        in.close(); 
    } 
    catch (IOException e) 
    { 
        System.out.println("ERROR: Could not read text file!"); 
    } 
    jList_Athlete.addListSelectionListener(new javax.swing.event.ListSelectionListener() 
    { 
        public void valueChanged(javax.swing.event.ListSelectionEvent e) 
        { 
         double[][] daRun = new double[2][7]; 
    
         final double dScoreUsed = 5; 
         double dMinScoreRun1 = 10, dMaxScoreRun1 = 0; 
         double dMinScoreRun2 = 10, dMaxScoreRun2 = 0; 
    
         double dTotalRun1 = 0, dTotalRun2 = 0; 
    
         jLabel_Athlete.setText(vecAthlete.get(jList_Athlete.getSelectedIndex()).sName); 
         jLabel_Country.setText(vecAthlete.get(jList_Athlete.getSelectedIndex()).sCountry); 
    
         jLabel_Run1_Score_1.setText(vecAthlete.get(jList_Athlete.getSelectedIndex()).saTempRun1[0]); 
        jLabel_Run1_Score_2.setText(vecAthlete.get(jList_Athlete.getSelectedIndex()).saTempRun1[1]); 
        jLabel_Run1_Score_3.setText(vecAthlete.get(jList_Athlete.getSelectedIndex()).saTempRun1[2]); 
        jLabel_Run1_Score_4.setText(vecAthlete.get(jList_Athlete.getSelectedIndex()).saTempRun1[3]); 
        jLabel_Run1_Score_5.setText(vecAthlete.get(jList_Athlete.getSelectedIndex()).saTempRun1[4]); 
        jLabel_Run1_Score_6.setText(vecAthlete.get(jList_Athlete.getSelectedIndex()).saTempRun1[5]); 
        jLabel_Run1_Score_7.setText(vecAthlete.get(jList_Athlete.getSelectedIndex()).saTempRun1[6]); 
    
        jLabel_Run2_Score_1.setText(vecAthlete.get(jList_Athlete.getSelectedIndex()).saTempRun2[0]); 
        jLabel_Run2_Score_2.setText(vecAthlete.get(jList_Athlete.getSelectedIndex()).saTempRun2[1]); 
        jLabel_Run2_Score_3.setText(vecAthlete.get(jList_Athlete.getSelectedIndex()).saTempRun2[2]); 
        jLabel_Run2_Score_4.setText(vecAthlete.get(jList_Athlete.getSelectedIndex()).saTempRun2[3]); 
        jLabel_Run2_Score_5.setText(vecAthlete.get(jList_Athlete.getSelectedIndex()).saTempRun2[4]); 
        jLabel_Run2_Score_6.setText(vecAthlete.get(jList_Athlete.getSelectedIndex()).saTempRun2[5]); 
        jLabel_Run2_Score_7.setText(vecAthlete.get(jList_Athlete.getSelectedIndex()).saTempRun2[6]); 
    
    
        daRun[0][0] = Double.parseDouble(jLabel_Run1_Score_1.getText()); 
        daRun[0][1] = Double.parseDouble(jLabel_Run1_Score_2.getText()); 
        daRun[0][2] = Double.parseDouble(jLabel_Run1_Score_3.getText()); 
        daRun[0][3] = Double.parseDouble(jLabel_Run1_Score_4.getText()); 
        daRun[0][4] = Double.parseDouble(jLabel_Run1_Score_5.getText()); 
        daRun[0][5] = Double.parseDouble(jLabel_Run1_Score_6.getText()); 
        daRun[0][6] = Double.parseDouble(jLabel_Run1_Score_7.getText()); 
    
        daRun[1][0] = Double.parseDouble(jLabel_Run2_Score_1.getText()); 
        daRun[1][1] = Double.parseDouble(jLabel_Run2_Score_2.getText()); 
        daRun[1][2] = Double.parseDouble(jLabel_Run2_Score_3.getText()); 
        daRun[1][3] = Double.parseDouble(jLabel_Run2_Score_4.getText()); 
        daRun[1][4] = Double.parseDouble(jLabel_Run2_Score_5.getText()); 
        daRun[1][5] = Double.parseDouble(jLabel_Run2_Score_6.getText()); 
        daRun[1][6] = Double.parseDouble(jLabel_Run2_Score_7.getText()); 
    
        for(int i = 0; i < 7; i++) 
        { 
         if(daRun[0][i] <= dMinScoreRun1) 
         { 
          dMinScoreRun1 = daRun[0][i]; 
         } 
         if(daRun[0][i] >= dMaxScoreRun1) 
         { 
          dMaxScoreRun1 = daRun[0][i]; 
         } 
    
         dTotalRun1 += daRun[0][i]; 
        } 
    
        dTotalRun1 = (dTotalRun1 - dMinScoreRun1 - dMaxScoreRun1)/dScoreUsed; 
        jLabel_TotalRun1.setText(String.valueOf(dTotalRun1)); 
        jLabel_Run1AddInfo.setText("Min Score: " + (dMinScoreRun1) + ", Max Score: " + (dMaxScoreRun1)); 
    
        for(int i = 0; i < 7; i++) 
        { 
         if(daRun[1][i] <= dMinScoreRun2) 
         { 
          dMinScoreRun2 = daRun[1][i]; 
         } 
         if(daRun[1][i] >= dMaxScoreRun2) 
         { 
          dMaxScoreRun2 = daRun[1][i]; 
         } 
    
         dTotalRun2 += daRun[1][i]; 
        } 
    
        dTotalRun2 = (dTotalRun2 - dMinScoreRun2 - dMaxScoreRun2)/dScoreUsed; 
        jLabel_TotalRun2.setText(String.valueOf(dTotalRun2)); 
        jLabel_Run2AddInfo.setText("Min Score: " + (dMinScoreRun2) + ", Max Score: " + (dMaxScoreRun2)); 
    
        if(dTotalRun1 >= dTotalRun2) 
         jLabel_FinalScore.setText(String.valueOf(dTotalRun1)); 
        else 
         jLabel_FinalScore.setText(String.valueOf(dTotalRun2)); 
    
    
        jPanel_Graph.repaint(); 
    } 
    }); 
    
  2. JPanel Definitionen

    JPanel jPanel_Graph = new JPanel(); 
    jPanel_Graph.setBorder(new BevelBorder(BevelBorder.LOWERED, null, null, null, null)); 
    jPanel_Graph.setBounds(729, 159, 700, 200); 
    frame.getContentPane().add(jPanel_Graph); 
    
    img = new BufferedImage(jPanel_Graph.getWidth(), 
             jPanel_Graph.getHeight(), 
             BufferedImage.TYPE_INT_RGB); 
    
    g2dimg = (Graphics2D)img.getGraphics(); 
    
    // Draw a filled white coloured rectangle on the entire area to clear it. 
    g2dimg.setPaint(Color.WHITE); 
    g2dimg.fill(new Rectangle2D.Double(0, 0, img.getWidth(), img.getHeight())); 
    
  3. JPanel Zeichnung Event

    class myJPanel extends JPanel 
    { 
    private Rectangle2D.Double rectangle; 
    
    public void paintComponent(Graphics g) 
    { 
        super.paintComponent(g); 
    
        for(int i = 0; i < 7; i++) 
        { 
         dHeight = daRun[0][i]; 
    
         rectangle = new Rectangle2D.Double(dX, dY, dWidth, dHeight); 
         g2dimg.setPaint(Color.red); 
         g2dimg.draw(rectangle); 
         g2dimg.fill(rectangle); 
    
         dX += dXIncrement; 
         g2dimg.drawImage(img, 0, 0, null); 
         } 
        } 
    } 
    

Vielen Dank im Voraus!

+0

Ich bin nicht wirklich sicher, wie das sollten alle zusammen genäht werden oder tatsächlich, wenn es wäre, würde es tatsächlich funktionieren. Wie weiß 'jPanel_Graph', was es malen soll? – MadProgrammer

+0

Betrachte, das 'JPanel' (welches auch immer es ist) ist verantwortlich für das Rendern des Modells, dein 'ListSelectionListener' ist verantwortlich für das Erzeugen dieses Modells und übergibt es an das' JPanel', so dass es die Ergebnisse – MadProgrammer

+0

in Ordnung bringen kann Wie kann ich diese Informationen tatsächlich an JPanel weitergeben, um diese Ergebnisse zu rendern? –

Antwort

1

Also von dem, was ich sagen kann, gibt es keine Möglichkeit für Ihre "Grafik" zu wissen, was es malen soll. Die Grundidee ist, dass Ihr "Diagramm" sich auf das Malen der Daten/des Modells konzentrieren sollte, also müssen Sie etwas wissen, wenn sich die Daten ändern.

Es gibt viele Möglichkeiten, wie Sie beispielsweise ein Modell erstellen könnten, dem Sie Daten hinzufügen/entfernen, das Aktualisierungen auslösen könnte, für die der Grafikbereich Listener enthält, und sich dann mit den neuen Daten aktualisiert.

Oder Sie übergeben Sie einfach die Daten, die Sie direkt in der grafischen Darstellung Fenster aktualisiert möchten, die in diesem Fall könnte die einfachste Lösung für Sie

import java.awt.BorderLayout; 
import java.awt.Color; 
import java.awt.Dimension; 
import java.awt.EventQueue; 
import java.awt.Graphics; 
import java.awt.Graphics2D; 
import java.awt.geom.Rectangle2D; 
import javax.swing.DefaultListModel; 
import javax.swing.JFrame; 
import javax.swing.JList; 
import javax.swing.JPanel; 
import javax.swing.JScrollPane; 
import javax.swing.UIManager; 
import javax.swing.UnsupportedLookAndFeelException; 
import javax.swing.event.ListSelectionEvent; 
import javax.swing.event.ListSelectionListener; 

public class Test { 

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

    public Test() { 
     EventQueue.invokeLater(new Runnable() { 
      @Override 
      public void run() { 
       try { 
        UIManager.setLookAndFeel(UIManager.getSystemLookAndFeelClassName()); 
       } catch (ClassNotFoundException | InstantiationException | IllegalAccessException | UnsupportedLookAndFeelException ex) { 
        ex.printStackTrace(); 
       } 

       JFrame frame = new JFrame("Testing"); 
       frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); 
       frame.add(new TestPane()); 
       frame.pack(); 
       frame.setLocationRelativeTo(null); 
       frame.setVisible(true); 
      } 
     }); 
    } 

    public class TestPane extends JPanel { 

     private GraphPane graphPane; 

     public TestPane() { 
      setLayout(new BorderLayout()); 
      DefaultListModel<Double> listmodel = new DefaultListModel<>(); 
      for (int index = 0; index < 100; index++) { 
       listmodel.addElement(Math.random()); 
      } 

      graphPane = new GraphPane(); 
      add(graphPane); 

      JList<Double> listData = new JList<>(listmodel); 
      add(new JScrollPane(listData), BorderLayout.WEST); 

      listData.addListSelectionListener(new ListSelectionListener() { 
       @Override 
       public void valueChanged(ListSelectionEvent e) { 
        graphPane.setData(listData.getSelectedValuesList().toArray(new Double[0])); 
       } 
      }); 
     } 

    } 

    public class GraphPane extends JPanel { 

     private Double[] data; 

     public void setData(Double[] data) { 
      this.data = data; 
      repaint(); 
     } 

     @Override 
     public Dimension getPreferredSize() { 
      return new Dimension(200, 200); 
     } 

     @Override 
     protected void paintComponent(Graphics g) { 
      super.paintComponent(g); 
      if (data != null && data.length > 0) { 
       Graphics2D g2d = (Graphics2D) g.create(); 
       double barWidth = getWidth()/(double)data.length; 
       int xPos = 0; 
       for (Double value : data) { 
        double height = (getHeight() - 1) * value; 
        Rectangle2D bar = new Rectangle2D.Double(xPos, getHeight() - height, barWidth, height); 
        g2d.setColor(Color.GREEN); 
        g2d.fill(bar); 
        g2d.setColor(Color.BLACK); 
        g2d.draw(bar); 
        xPos += barWidth; 
       } 
       g2d.dispose(); 
      } 
     } 

    } 

}