Inhalt

Aktueller Ordner: duesseldorfer-schuelerinventar-java-client/src/main/java/com/duesk
⬅ Übergeordnet

TimeSeriesDialog.java

package com.duesk;

import javax.swing.*;
import javax.swing.table.AbstractTableModel;
import java.awt.*;
import java.util.ArrayList;
import java.util.List;
import org.jfree.chart.ChartFactory;
import org.jfree.chart.ChartPanel;
import org.jfree.chart.JFreeChart;
import org.jfree.chart.plot.PlotOrientation;
import org.jfree.data.category.DefaultCategoryDataset;
import com.duesk.api.models.Profile;
import com.duesk.api.models.Norms;
import com.duesk.utils.Calculator;

public class TimeSeriesDialog extends JDialog {
    private List<Profile> profiles;
    private String groupName;
    private List<int[]> competenceValues = new ArrayList<>();
    private List<String> profileNames = new ArrayList<>();
    private JTable timeSeriesTable;
    private ChartPanel chartPanel;
    private JComboBox<String> competenceCombo;
    
    public TimeSeriesDialog(JFrame parent, List<Profile> profiles, String groupName) {
        super(parent, "Zeitreihe - " + groupName, true);
        this.profiles = profiles;
        this.groupName = groupName;
        setSize(1000, 700);
        setLocationRelativeTo(parent);
        
        calculateAllProfiles();
        initComponents();
    }
    
    private void calculateAllProfiles() {
        for (Profile profile : profiles) {
            // Items extrahieren
            int[] seItems = new int[36];
            for (int i = 1; i <= 36; i++) {
                seItems[i-1] = profile.getItem(i);
            }
            
            // Summen berechnen
            int[] sums = Calculator.calculateSums(seItems);
            
            // Profilwerte berechnen (mit HS-Normen)
            int[] values = Calculator.calculateProfileValues(sums, Norms.NORM_SE_HS);
            
            // Auf 1-5 skalieren
            int[] scaledValues = new int[6];
            for (int i = 0; i < 6; i++) {
                scaledValues[i] = values[i] + 1;
            }
            
            competenceValues.add(scaledValues);
            profileNames.add(profile.getName());
        }
    }
    
    private void initComponents() {
        setLayout(new BorderLayout());
        
        // ComboBox für Kompetenzauswahl
        JPanel topPanel = new JPanel(new FlowLayout(FlowLayout.LEFT));
        topPanel.add(new JLabel("Kompetenz:"));
        competenceCombo = new JComboBox<>(Norms.KOMPETENZEN);
        competenceCombo.addActionListener(e -> updateChart());
        topPanel.add(competenceCombo);
        add(topPanel, BorderLayout.NORTH);
        
        // SplitPane mit Chart oben und Tabelle unten
        JSplitPane splitPane = new JSplitPane(JSplitPane.VERTICAL_SPLIT);
        
        // Chart
        chartPanel = new ChartPanel(null);
        chartPanel.setPreferredSize(new Dimension(900, 300));
        splitPane.setTopComponent(chartPanel);
        
        // Tabelle
        TimeSeriesTableModel tableModel = new TimeSeriesTableModel();
        timeSeriesTable = new JTable(tableModel);
        timeSeriesTable.setRowHeight(22);
        splitPane.setBottomComponent(new JScrollPane(timeSeriesTable));
        
        splitPane.setResizeWeight(0.5);
        add(splitPane, BorderLayout.CENTER);
        
        // Schließen Button
        JButton closeBtn = new JButton("Schließen");
        closeBtn.addActionListener(e -> dispose());
        JPanel bottomPanel = new JPanel();
        bottomPanel.add(closeBtn);
        add(bottomPanel, BorderLayout.SOUTH);
        
        updateChart();
    }
    
    private void updateChart() {
        int compIndex = competenceCombo.getSelectedIndex();
        
        DefaultCategoryDataset dataset = new DefaultCategoryDataset();
        for (int i = 0; i < competenceValues.size(); i++) {
            dataset.addValue(competenceValues.get(i)[compIndex], 
                Norms.KOMPETENZEN[compIndex], String.valueOf(i + 1));
        }
        
        JFreeChart chart = ChartFactory.createLineChart(
            "Zeitreihe - " + Norms.KOMPETENZEN[compIndex],
            "Profile", "Wert (1-5)", dataset,
            PlotOrientation.VERTICAL, true, true, false);
        
        chartPanel.setChart(chart);
    }
    
    private class TimeSeriesTableModel extends AbstractTableModel {
        private final String[] columns = {"Nr.", "Name", "Arbeitsverhalten", "Lernverhalten", 
            "Sozialverhalten", "Fachkompetenz", "Personale Kompetenz", "Methodenkompetenz"};
        
        @Override
        public int getRowCount() { return competenceValues.size(); }
        @Override
        public int getColumnCount() { return 8; }
        @Override
        public String getColumnName(int col) { return columns[col]; }
        
        @Override
        public Object getValueAt(int row, int col) {
            if (col == 0) return row + 1;
            if (col == 1) return profileNames.get(row);
            int[] values = competenceValues.get(row);
            return values[col - 2];
        }
    }
}