package View.Panels; import Model.Line; import View.MainFrame; import View.PlotDialog; import View.custom.ButtonGroupAtLeastOne; import java.io.File; import java.util.ArrayList; import java.util.Arrays; import java.util.LinkedList; import javax.swing.*; import javax.swing.border.LineBorder; import javax.swing.border.TitledBorder; import javax.swing.filechooser.FileNameExtensionFilter; import javax.swing.table.DefaultTableModel; import java.awt.*; import javax.swing.table.JTableHeader; import javax.swing.table.TableCellRenderer; import javax.swing.table.TableColumn; import javax.swing.table.TableColumnModel; import View.custom.ColorColumnRenderer; /** * Created by * Armin Wolf * on 02.08.17. */ public class EvaluationPanel extends JPanel{ private final MainFrame view; private JTable table; private JTableHeader header; private JButton start; private JButton latexExport; private JButton clearTable; private JButton exportData; private JRadioButton evalTypeOne; //1: Alg - N: Data private JRadioButton evalTypeTwo; //N: Alg - 1: Data private ButtonGroup radiobuttonGroup; private ButtonGroup checkboxGroup; private ButtonGroupAtLeastOne checkboxAtLeastOne; private JCheckBox lms; //1: Alg - N: Data private JCheckBox rm; //N: Alg - 1: Data private JCheckBox ts; //1: Alg - N: Data private JPanel comp; private JPanel algorithmPanel; private JPanel leftSidePanel; private JPanel datasetCount; private JComboBox datasetCountChoice; private JComboBox datasetType; private JLabel datasetCountLabel; private JSplitPane splitPane; private DefaultTableModel model; private int currentRowOfTypes; private JPanel buttonPanel; private PlotDialog plotDialog; private String[] selections = { "Approximationsgüte","Least Median of Squares","Repeated-Median","Theil-Sen"}; public EvaluationPanel(MainFrame view){ super(); this.view = view; this.setLayout(new BorderLayout()); this.currentRowOfTypes = 0; init(); addListener(); addComponents(); } private void init(){ datasetCountLabel = new JLabel("Größe des Datensatzes"); Integer[] choice = {50,100,200,500,1000,1500}; datasetCountChoice = new JComboBox(choice); String[] datatypes = {"Punktwolke", "Gerade", "Kreis und Gerade"}; datasetType = new JComboBox<>(datatypes); start = new JButton("Start"); latexExport = new JButton("LaTex Export"); clearTable = new JButton("Löschen"); exportData = new JButton("Datenexport"); latexExport.setEnabled(false); clearTable.setEnabled(false); exportData.setEnabled(false); 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"); radiobuttonGroup = new ButtonGroup(); checkboxGroup = new ButtonGroup(); checkboxAtLeastOne = new ButtonGroupAtLeastOne(); buttonPanel = new JPanel(new FlowLayout()); leftSidePanel = new JPanel(new BorderLayout()); comp = new JPanel(new GridLayout(0,1)); plotDialog = new PlotDialog(); model = new DefaultTableModel(){ @Override public boolean isCellEditable(int row, int column) { //all cells false return false; } }; table = new JTable(model); UIManager.put("TableHeader.font", new Font("SansSerif", Font.BOLD, 14)); UIManager.put("TableHeader.foreground", Color.WHITE); header = table.getTableHeader(); header.setBackground(Color.GRAY); splitPane = new JSplitPane(); algorithmPanel = new JPanel(new FlowLayout(FlowLayout.LEFT)); datasetCount = new JPanel(new FlowLayout(FlowLayout.LEFT)); } private void addComponents(){ evalTypeOne.setSelected(true); lms.setSelected(true); checkboxGroup.add(lms); checkboxGroup.add(rm); checkboxGroup.add(ts); radiobuttonGroup.add(evalTypeOne); radiobuttonGroup.add(evalTypeTwo); buttonPanel.add(start); buttonPanel.add(clearTable); buttonPanel.add(exportData); buttonPanel.add(latexExport); algorithmPanel.add(lms); algorithmPanel.add(rm); algorithmPanel.add(ts); datasetCount.add(datasetCountLabel); datasetCount.add(datasetCountChoice); datasetCount.add(datasetType); comp.add(evalTypeOne); comp.add(evalTypeTwo); comp.add(algorithmPanel); comp.add(datasetCount); comp.setBorder(new TitledBorder("Konfiguration")); //Tabelle model.setColumnIdentifiers(selections); table.setDragEnabled(true); JScrollPane scrollPane = new JScrollPane(table); scrollPane.setWheelScrollingEnabled(true); scrollPane.setBorder(new TitledBorder("Ergebnisse")); //Plot plotDialog.createPlot(new LinkedList<>()); plotDialog.setBorder(new TitledBorder("Plot")); leftSidePanel.add(comp, BorderLayout.NORTH); leftSidePanel.add(scrollPane, BorderLayout.CENTER); //Splitpane splitPane.setOrientation(JSplitPane.HORIZONTAL_SPLIT); splitPane.setResizeWeight(.5d); splitPane.setContinuousLayout(true); splitPane.setLeftComponent(leftSidePanel); splitPane.setRightComponent(plotDialog); this.add(splitPane, BorderLayout.CENTER); this.add(buttonPanel, BorderLayout.SOUTH); TableColumn tm = table.getColumnModel().getColumn(0); tm.setCellRenderer(new ColorColumnRenderer(Color.lightGray, Color.blue)); } private void addListener(){ start.addActionListener(e -> { int type; int alg; int n; if (radiobuttonGroup.isSelected(evalTypeOne.getModel())){ type = 0; } else { type = 1; } alg = checkSelection(); n = (Integer) datasetCountChoice.getSelectedItem(); String datatyp = (String) datasetType.getSelectedItem(); view.getPresenter().startEvaluation(type,n,alg,datatyp); clearTable.setEnabled(true); latexExport.setEnabled(true); exportData.setEnabled(true); }); evalTypeOne.addActionListener(e -> { checkboxAtLeastOne.remove(lms); checkboxAtLeastOne.remove(rm); checkboxAtLeastOne.remove(ts); lms.setSelected(true); checkboxGroup.add(lms); checkboxGroup.add(rm); checkboxGroup.add(ts); }); evalTypeTwo.addActionListener(e -> { checkboxGroup.remove(lms); checkboxGroup.remove(rm); checkboxGroup.remove(ts); checkboxAtLeastOne.addAll(lms,rm,ts); lms.setSelected(true); rm.setSelected(true); }); latexExport.addActionListener(e -> { SwingUtilities.invokeLater(() -> { File file = null; JFileChooser chooser = new JFileChooser(); chooser.setPreferredSize(new Dimension(800,700)); File workingDirectory = new File(System.getProperty("user.dir")); chooser.setCurrentDirectory(workingDirectory); chooser.setFileFilter(new FileNameExtensionFilter("LaTeX-Datei", "tex", "text")); chooser.setMultiSelectionEnabled(false); chooser.setFileSelectionMode(JFileChooser.FILES_ONLY); if (chooser.showSaveDialog(null) == JFileChooser.APPROVE_OPTION){ //System.out.println ("Datei "+chooser.getSelectedFile()+ " ausgewählt."); file = chooser.getSelectedFile(); String filename = file.getAbsolutePath().contains(".tex") ? file.getAbsolutePath() : file.getAbsolutePath().concat(".tex"); File withExtension = new File(filename); final File input = withExtension; view.getPresenter().startResultExport(model, input); } }); }); clearTable.addActionListener(e -> { SwingUtilities.invokeLater(() ->{ int n = model.getDataVector().size(); for (int i=0;i { SwingUtilities.invokeLater(() -> { JOptionPane.showMessageDialog(null, "Boooooooooooooooooooooooooooooooooooooooooooooooooooooo! :)"); }); }); } public void addColumn(Object[] data, int col, boolean b){ if (b){ addBlankRows(data.length); } for (int i=0;i alg){ Paint[] color = {Color.ORANGE, Color.RED, Color.MAGENTA}; String[] name = {"LMS","RM", "TS"}; for (Double[] o : alg){ Double m = o[1]; Double b = o[1]; int i = o[0].intValue(); plotDialog.addLineToPlot(m,b,color[i],name[i]); } } public void drawLines(Object[] results, int alg){ String[] castedResults = Arrays.copyOf(results, results.length, String[].class); Paint[] color = {Color.ORANGE, Color.RED, Color.MAGENTA}; String[] name = {"LMS","RM", "TS"}; Double m = Double.parseDouble(castedResults[0]); Double b = Double.parseDouble(castedResults[1]); plotDialog.addLineToPlot(m,b,color[alg],name[alg]); } public void setDualPoints(LinkedList points){ plotDialog = new PlotDialog(); plotDialog.setBorder(new TitledBorder("Plot")); splitPane.setRightComponent(plotDialog); plotDialog.createPlot(points); plotDialog.repaint(); plotDialog.revalidate(); } private void addBlankRows(int n){ for (int i=0;i