Inhalt
Aktueller Ordner:
duesseldorfer-schuelerinventar-java-client/src/main/java/com/dueskTimeSeriesDialog.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];
}
}
}