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 profiles; private String groupName; private List competenceValues = new ArrayList<>(); private List profileNames = new ArrayList<>(); private JTable timeSeriesTable; private ChartPanel chartPanel; private JComboBox competenceCombo; public TimeSeriesDialog(JFrame parent, List 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]; } } }