algorithms-for-computing-li.../LinearRegressionTool/src/main/java/de/wwwu/awolf/view/panels/EvaluationPanel.java

389 lines
13 KiB
Java
Raw Normal View History

2020-03-21 00:37:09 +00:00
package de.wwwu.awolf.view.panels;
2020-03-21 00:37:09 +00:00
import de.wwwu.awolf.model.Line;
import de.wwwu.awolf.presenter.Presenter;
2020-03-21 19:54:03 +00:00
import de.wwwu.awolf.presenter.algorithms.Algorithm;
import de.wwwu.awolf.presenter.data.DataProvider;
2020-03-21 00:37:09 +00:00
import de.wwwu.awolf.view.MainFrame;
import de.wwwu.awolf.view.custom.ButtonGroupAtLeastTwo;
import javax.swing.*;
import javax.swing.border.TitledBorder;
2017-09-08 19:23:02 +00:00
import javax.swing.filechooser.FileNameExtensionFilter;
import javax.swing.filechooser.FileSystemView;
import javax.swing.table.DefaultTableModel;
2017-09-08 19:23:02 +00:00
import javax.swing.table.JTableHeader;
import java.awt.*;
import java.io.File;
2020-03-21 19:54:03 +00:00
import java.io.Serializable;
2020-03-21 00:37:09 +00:00
import java.util.List;
2020-03-21 19:54:03 +00:00
import java.util.*;
/**
2017-09-08 19:23:02 +00:00
* Created by
* Armin Wolf
* on 02.08.17.
*/
public class EvaluationPanel extends JPanel {
private final MainFrame view;
private JTable table;
2017-09-08 19:23:02 +00:00
private JTableHeader header;
private JButton start;
private JButton clearTable;
private JButton exportData;
2017-09-05 18:39:52 +00:00
private JRadioButton evalTypeOne; //1: Alg - N: Data
private JRadioButton evalTypeTwo; //N: Alg - 1: Data
private ButtonGroup radiobuttonGroup;
private ButtonGroup checkboxGroup;
private ButtonGroupAtLeastTwo checkboxAtLeastOne;
2017-09-05 18:39:52 +00:00
private JCheckBox lms; //1: Alg - N: Data
private JCheckBox rm; //N: Alg - 1: Data
private JCheckBox ts; //1: Alg - N: Data
private JPanel comp;
2017-09-05 18:39:52 +00:00
private JPanel algorithmPanel;
private JPanel leftSidePanel;
private JPanel datasetCount;
private JComboBox<Integer> datasetCountChoice;
2017-09-08 19:23:02 +00:00
private JComboBox<String> datasetType;
2017-09-05 18:39:52 +00:00
private JLabel datasetCountLabel;
private DefaultTableModel model;
2017-09-08 19:23:02 +00:00
private int currentRowOfTypes;
private JPanel buttonPanel;
private PlotPanel plotPanel;
2020-03-21 19:54:03 +00:00
private Map<Algorithm.Type, Color> colorMap;
private String[] selections = {"Approximationsgüte", "Least Median of Squares", "Repeated-Median", "Theil-Sen"};
2017-10-17 06:34:55 +00:00
/**
* Konstruktor
2020-03-20 17:08:18 +00:00
*
2017-10-17 06:34:55 +00:00
* @param view View
*/
public EvaluationPanel(MainFrame view) {
super();
this.view = view;
this.setLayout(new BorderLayout());
2017-09-08 19:23:02 +00:00
this.currentRowOfTypes = 0;
2020-03-21 19:54:03 +00:00
this.colorMap = new HashMap<>();
this.colorMap.put(Algorithm.Type.LMS, Color.ORANGE);
this.colorMap.put(Algorithm.Type.RM, Color.RED);
this.colorMap.put(Algorithm.Type.TS, Color.MAGENTA);
this.colorMap.put(Algorithm.Type.NAIV_LMS, Color.BLUE);
this.colorMap.put(Algorithm.Type.NAIV_RM, Color.GREEN);
this.colorMap.put(Algorithm.Type.NAIV_TS, Color.CYAN);
2017-09-05 18:39:52 +00:00
init();
2017-09-08 19:23:02 +00:00
addListener();
addComponents();
2017-09-08 19:23:02 +00:00
}
2017-10-17 06:34:55 +00:00
/**
* Initialisiere die Komponenten
*/
private void init() {
datasetCountLabel = new JLabel("Größe des Datensatzes");
Integer[] choice = {50, 100, 200, 500, 1000, 1500};
2017-09-05 18:39:52 +00:00
datasetCountChoice = new JComboBox(choice);
String[] datatypes = {"Punktwolke", "Gerade", "Kreis und Gerade", "Import von CSV-Datei"};
2017-09-08 19:23:02 +00:00
datasetType = new JComboBox<>(datatypes);
start = new JButton("Start");
clearTable = new JButton("Löschen");
exportData = new JButton("Datenexport");
clearTable.setEnabled(false);
exportData.setEnabled(false);
2017-09-08 19:23:02 +00:00
evalTypeOne = new JRadioButton("Algorithmus evaluieren");
evalTypeTwo = new JRadioButton("Algorithmen vergleichen");
lms = new JCheckBox("Least Median of Squares");
rm = new JCheckBox("Repeated Median");
ts = new JCheckBox("Theil-Sen");
2017-09-05 18:39:52 +00:00
radiobuttonGroup = new ButtonGroup();
checkboxGroup = new ButtonGroup();
checkboxAtLeastOne = new ButtonGroupAtLeastTwo();
buttonPanel = new JPanel(new FlowLayout());
2017-09-05 18:39:52 +00:00
leftSidePanel = new JPanel(new BorderLayout());
comp = new JPanel(new GridLayout(0, 1));
plotPanel = new PlotPanel();
model = new DefaultTableModel() {
2017-09-05 18:39:52 +00:00
@Override
public boolean isCellEditable(int row, int column) {
//all cells false
return false;
}
};
table = new JTable(model);
2017-09-08 19:23:02 +00:00
UIManager.put("TableHeader.font", new Font("SansSerif", Font.BOLD, 14));
UIManager.put("TableHeader.foreground", Color.WHITE);
header = table.getTableHeader();
header.setBackground(Color.GRAY);
2017-09-05 18:39:52 +00:00
algorithmPanel = new JPanel(new FlowLayout(FlowLayout.LEFT));
datasetCount = new JPanel(new FlowLayout(FlowLayout.LEFT));
}
2017-10-17 06:34:55 +00:00
/**
* Hinzufügen der Komponenten zum ContentPane
*/
private void addComponents() {
2017-09-05 18:39:52 +00:00
evalTypeOne.setSelected(true);
2017-09-08 19:23:02 +00:00
lms.setSelected(true);
2017-09-05 18:39:52 +00:00
checkboxGroup.add(lms);
checkboxGroup.add(rm);
checkboxGroup.add(ts);
radiobuttonGroup.add(evalTypeOne);
radiobuttonGroup.add(evalTypeTwo);
2017-09-08 19:23:02 +00:00
buttonPanel.add(start);
buttonPanel.add(clearTable);
buttonPanel.add(exportData);
2017-09-05 18:39:52 +00:00
algorithmPanel.add(lms);
algorithmPanel.add(rm);
algorithmPanel.add(ts);
datasetCount.add(datasetCountLabel);
datasetCount.add(datasetCountChoice);
2017-09-08 19:23:02 +00:00
datasetCount.add(datasetType);
2017-09-05 18:39:52 +00:00
comp.add(evalTypeOne);
comp.add(evalTypeTwo);
comp.add(algorithmPanel);
comp.add(datasetCount);
2017-09-05 18:39:52 +00:00
comp.setBorder(new TitledBorder("Konfiguration"));
//Tabelle
table.setDragEnabled(true);
JScrollPane scrollPane = new JScrollPane(table);
scrollPane.setWheelScrollingEnabled(true);
2017-09-05 18:39:52 +00:00
scrollPane.setBorder(new TitledBorder("Ergebnisse"));
//Plot
plotPanel.createPlot(new LinkedList<>());
plotPanel.setBorder(new TitledBorder("Plot"));
2017-09-05 18:39:52 +00:00
leftSidePanel.add(comp, BorderLayout.NORTH);
leftSidePanel.add(scrollPane, BorderLayout.CENTER);
2020-03-23 20:58:39 +00:00
this.add(leftSidePanel, BorderLayout.CENTER);
this.add(buttonPanel, BorderLayout.SOUTH);
2017-09-08 19:23:02 +00:00
}
2017-10-17 06:34:55 +00:00
/**
* Hinzufügen der Listener
*/
private void addListener() {
2017-09-08 19:23:02 +00:00
start.addActionListener(e -> {
int type;
int alg;
int n;
if (radiobuttonGroup.isSelected(evalTypeOne.getModel())) {
2017-09-08 19:23:02 +00:00
type = 0;
} else {
type = 1;
}
alg = checkSelection();
n = (Integer) datasetCountChoice.getSelectedItem();
String datatyp = (String) datasetType.getSelectedItem();
2020-03-21 00:37:09 +00:00
if ("Import von CSV-Datei".equals(datatyp)) {
SwingUtilities.invokeLater(() -> {
File file = null;
JFileChooser chooser = new JFileChooser(FileSystemView.getFileSystemView().getHomeDirectory());
chooser.setPreferredSize(new Dimension(800, 700));
chooser.setFileFilter(new FileNameExtensionFilter("Comma-Separated Value, (*.csv)", "csv", "text"));
chooser.setMultiSelectionEnabled(false);
chooser.setFileSelectionMode(JFileChooser.FILES_ONLY);
if (chooser.showOpenDialog(this) == JFileChooser.APPROVE_OPTION) {
2020-03-21 00:37:09 +00:00
//Logging.logInfo ("Datei "+chooser.getSelectedFile()+ " ausgewählt.");
file = chooser.getSelectedFile();
final File input = file;
Thread t = new Thread(() -> ((Presenter) view.getPresenter()).startEvaluation(type, alg, input));
t.start();
}
});
} else {
2020-03-21 19:54:03 +00:00
((Presenter) view.getPresenter()).startEvaluation(type, n, alg, DataProvider.DataType.values()[datasetType.getSelectedIndex()]);
}
clearTable.setEnabled(true);
exportData.setEnabled(true);
2017-09-08 19:23:02 +00:00
});
evalTypeOne.addActionListener(e -> {
checkboxAtLeastOne.remove(lms);
checkboxAtLeastOne.remove(rm);
checkboxAtLeastOne.remove(ts);
lms.setSelected(true);
checkboxGroup.add(lms);
checkboxGroup.add(rm);
checkboxGroup.add(ts);
});
2017-09-05 18:39:52 +00:00
2017-09-08 19:23:02 +00:00
evalTypeTwo.addActionListener(e -> {
checkboxGroup.remove(lms);
checkboxGroup.remove(rm);
checkboxGroup.remove(ts);
checkboxAtLeastOne.addAll(lms, rm, ts);
2017-09-08 19:23:02 +00:00
lms.setSelected(true);
rm.setSelected(true);
});
clearTable.addActionListener(e -> {
SwingUtilities.invokeLater(() -> {
int n = model.getDataVector().size();
for (int i = 0; i < n; i++) {
model.removeRow(0);
currentRowOfTypes--;
}
this.revalidate();
clearTable.setEnabled(false);
exportData.setEnabled(false);
});
});
exportData.addActionListener(e -> {
SwingUtilities.invokeLater(() -> {
SwingUtilities.invokeLater(() -> {
File file = null;
JFileChooser chooser = new JFileChooser(FileSystemView.getFileSystemView().getHomeDirectory());
chooser.setPreferredSize(new Dimension(800, 700));
chooser.setFileFilter(new FileNameExtensionFilter("Comma-Separated Value, (*.csv)", "csv", "text"));
chooser.setMultiSelectionEnabled(false);
chooser.setFileSelectionMode(JFileChooser.FILES_ONLY);
if (chooser.showOpenDialog(this) == JFileChooser.APPROVE_OPTION) {
file = chooser.getSelectedFile();
String filename = file.getAbsolutePath().contains(".csv") ? file.getAbsolutePath() : file.getAbsolutePath().concat(".csv");
2020-03-21 00:37:09 +00:00
final File input = new File(filename);
2020-03-20 17:08:18 +00:00
Thread t = new Thread(() -> ((Presenter) view.getPresenter()).startDatasetExportEvaluation(input));
t.start();
}
});
});
});
2017-09-08 19:23:02 +00:00
}
2017-10-17 06:34:55 +00:00
/**
* Fügt der Tabelle eine Spalte hinzu
*
2020-03-20 17:08:18 +00:00
* @param data Daten der Spalte
* @param col Spalte
* @param isLabel <code>true</code>, falls es sich um die Approximations Überschriften handelt
2017-10-17 06:34:55 +00:00
*/
2020-03-21 19:54:03 +00:00
public void addColumn(final List<? extends Serializable> data, final int col, final boolean isLabel) {
2017-10-17 06:34:55 +00:00
if (isLabel) {
2020-03-21 19:54:03 +00:00
addBlankRows(data.size());
2017-09-08 19:23:02 +00:00
}
2020-03-21 19:54:03 +00:00
for (int i = 0; i < data.size(); i++) {
int row = currentRowOfTypes - data.size() + i;
model.setValueAt(data.get(i), row, col);
2017-09-08 19:23:02 +00:00
}
this.repaint();
this.revalidate();
}
2017-09-05 18:39:52 +00:00
2017-10-17 06:34:55 +00:00
/**
* Fügt der Tabelle eine Zeile hinzu
2020-03-20 17:08:18 +00:00
*
2020-03-21 19:54:03 +00:00
* @param tableEntries Daten der Tabelle
2017-10-17 06:34:55 +00:00
*/
2020-03-21 19:54:03 +00:00
public void addRow(Map<Algorithm.Type, Map<String, String>> tableEntries) {
2017-09-08 19:23:02 +00:00
2020-03-21 19:54:03 +00:00
SwingUtilities.invokeLater(() -> {
2017-09-08 19:23:02 +00:00
2020-03-21 19:54:03 +00:00
Set<Algorithm.Type> types = tableEntries.keySet();
List<String> columnlabels = new ArrayList<>();
types.forEach(type -> {
columnlabels.add(" ");
});
model.setColumnIdentifiers(columnlabels.toArray());
tableEntries.entrySet().forEach(row -> {
model.addRow(row.getValue().keySet().toArray());
model.addRow(row.getValue().values().toArray());
});
this.repaint();
this.revalidate();
});
2017-09-05 18:39:52 +00:00
}
2020-03-21 19:54:03 +00:00
2017-10-17 06:34:55 +00:00
/**
2020-03-21 19:54:03 +00:00
* <p>
2017-10-17 06:34:55 +00:00
* Visualisierung der Ausgleichsgerade
2020-03-20 17:08:18 +00:00
*
2020-03-21 19:54:03 +00:00
* @param lines the lines
* @param alg identifizierung des Alg.
2017-10-17 06:34:55 +00:00
*/
2020-03-21 19:54:03 +00:00
public void drawLines(final List<Line> lines, final Algorithm.Type alg) {
for (Line line : lines) {
plotPanel.addLineToPlot(line.getM(), line.getB(), colorMap.get(alg), alg.name());
}
2017-09-08 19:23:02 +00:00
}
2017-10-17 06:34:55 +00:00
/**
* Hilfsmethode
2020-03-20 17:08:18 +00:00
*
2017-10-17 06:34:55 +00:00
* @param n Anzahl der leeren Zeilen
*/
private void addBlankRows(int n) {
for (int i = 0; i < n; i++) {
String[] tmp = {"", "", "", "",};
2017-09-08 19:23:02 +00:00
model.addRow(tmp);
}
}
2017-10-17 06:34:55 +00:00
/**
* Hilfsmethode
2020-03-20 17:08:18 +00:00
*
2017-10-17 06:34:55 +00:00
* @param val Anzahl der Zeilen die noch hinzugefügt werden
*/
public void setCurrentRow(int val) {
2017-09-08 19:23:02 +00:00
this.currentRowOfTypes += val;
}
2017-10-17 06:34:55 +00:00
/**
* @return Kodierung welche Algorithmen ausgewählt wurden
*/
private int checkSelection() {
if (lms.isSelected() && rm.isSelected() && ts.isSelected()) {
2017-09-08 19:23:02 +00:00
return 6;
} else if (!lms.isSelected() && rm.isSelected() && ts.isSelected()) {
2017-09-08 19:23:02 +00:00
return 5;
} else if (lms.isSelected() && !rm.isSelected() && ts.isSelected()) {
2017-09-08 19:23:02 +00:00
return 4;
} else if (lms.isSelected() && rm.isSelected() && !ts.isSelected()) {
2017-09-08 19:23:02 +00:00
return 3;
} else if (!lms.isSelected() && !rm.isSelected() && ts.isSelected()) {
2017-09-08 19:23:02 +00:00
return 2;
} else if (!lms.isSelected() && rm.isSelected() && !ts.isSelected()) {
2017-09-08 19:23:02 +00:00
return 1;
} else if (lms.isSelected() && !rm.isSelected() && !ts.isSelected()) {
2017-09-08 19:23:02 +00:00
return 0;
} else {
throw new IllegalStateException("Mindestens ein Algortihmus muss selektiert werden");
}
}
}