some further changes, added gui logger
This commit is contained in:
parent
bef956bf4c
commit
77ad52ee53
File diff suppressed because it is too large
Load Diff
|
@ -86,6 +86,12 @@
|
||||||
<version>1.2.17</version>
|
<version>1.2.17</version>
|
||||||
</dependency>
|
</dependency>
|
||||||
|
|
||||||
|
<dependency>
|
||||||
|
<groupId>org.apache.logging.log4j</groupId>
|
||||||
|
<artifactId>log4j-core</artifactId>
|
||||||
|
<version>2.13.1</version>
|
||||||
|
</dependency>
|
||||||
|
|
||||||
<dependency>
|
<dependency>
|
||||||
<groupId>com.opencsv</groupId>
|
<groupId>com.opencsv</groupId>
|
||||||
<artifactId>opencsv</artifactId>
|
<artifactId>opencsv</artifactId>
|
||||||
|
@ -98,5 +104,13 @@
|
||||||
<version>28.2-jre</version>
|
<version>28.2-jre</version>
|
||||||
</dependency>
|
</dependency>
|
||||||
|
|
||||||
|
<dependency>
|
||||||
|
<groupId>org.powermock</groupId>
|
||||||
|
<artifactId>powermock-core</artifactId>
|
||||||
|
<version>2.0.6</version>
|
||||||
|
<scope>compile</scope>
|
||||||
|
</dependency>
|
||||||
|
|
||||||
|
|
||||||
</dependencies>
|
</dependencies>
|
||||||
</project>
|
</project>
|
|
@ -40,7 +40,10 @@ public class App {
|
||||||
* @param argv
|
* @param argv
|
||||||
*/
|
*/
|
||||||
public static void main(String[] argv) {
|
public static void main(String[] argv) {
|
||||||
final Presenter presenter = new Presenter(new LineModel(), null);
|
final Presenter presenter = Presenter.getInstance();
|
||||||
|
presenter.setModel(new LineModel());
|
||||||
|
presenter.setView(null);
|
||||||
|
|
||||||
SwingUtilities.invokeLater(() -> {
|
SwingUtilities.invokeLater(() -> {
|
||||||
MainFrame view = new MainFrame();
|
MainFrame view = new MainFrame();
|
||||||
setUIFont(new javax.swing.plaf.FontUIResource(new Font("SansSerif", Font.PLAIN, 12)));
|
setUIFont(new javax.swing.plaf.FontUIResource(new Font("SansSerif", Font.PLAIN, 12)));
|
||||||
|
|
|
@ -30,16 +30,10 @@ public abstract class AbstractPresenter implements Flow.Subscriber<Data> {
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Konstruktor
|
* Konstruktor
|
||||||
*
|
|
||||||
* @param model Modell
|
|
||||||
* @param view View
|
|
||||||
*/
|
*/
|
||||||
public AbstractPresenter(LineModel model, MainFrame view) {
|
public AbstractPresenter() {
|
||||||
this.model = model;
|
|
||||||
this.view = view;
|
|
||||||
executor = Executors.newCachedThreadPool();
|
executor = Executors.newCachedThreadPool();
|
||||||
dataProvider = new DataProvider(this);
|
dataProvider = new DataProvider(this);
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
|
|
|
@ -14,6 +14,7 @@ import de.wwwu.awolf.presenter.util.Logging;
|
||||||
import de.wwwu.awolf.view.MainFrame;
|
import de.wwwu.awolf.view.MainFrame;
|
||||||
|
|
||||||
import javax.swing.*;
|
import javax.swing.*;
|
||||||
|
import java.awt.event.WindowStateListener;
|
||||||
import java.io.File;
|
import java.io.File;
|
||||||
import java.util.List;
|
import java.util.List;
|
||||||
|
|
||||||
|
@ -27,9 +28,18 @@ import java.util.List;
|
||||||
*/
|
*/
|
||||||
public class Presenter extends AbstractPresenter {
|
public class Presenter extends AbstractPresenter {
|
||||||
|
|
||||||
|
private static Presenter instance;
|
||||||
|
|
||||||
public Presenter(LineModel model, MainFrame view) {
|
private Presenter() {
|
||||||
super(model, view);
|
super();
|
||||||
|
}
|
||||||
|
|
||||||
|
public static Presenter getInstance() {
|
||||||
|
if (instance == null) {
|
||||||
|
instance = new Presenter();
|
||||||
|
}
|
||||||
|
|
||||||
|
return instance;
|
||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
|
|
|
@ -0,0 +1,34 @@
|
||||||
|
package de.wwwu.awolf.presenter.util;
|
||||||
|
|
||||||
|
import de.wwwu.awolf.presenter.Presenter;
|
||||||
|
import org.apache.log4j.AppenderSkeleton;
|
||||||
|
import org.apache.log4j.spi.LoggingEvent;
|
||||||
|
import org.powermock.core.classloader.annotations.PowerMockIgnore;
|
||||||
|
|
||||||
|
@PowerMockIgnore("org.apache.log4j.Appender")
|
||||||
|
public class GuiAppender extends AppenderSkeleton {
|
||||||
|
|
||||||
|
private final Presenter presenter = Presenter.getInstance();
|
||||||
|
|
||||||
|
@Override
|
||||||
|
protected void append(LoggingEvent logEvent) {
|
||||||
|
|
||||||
|
if (logEvent.getLevel().toInt() >= 40000) {
|
||||||
|
presenter.getView().logError(logEvent.getRenderedMessage());
|
||||||
|
} else if (logEvent.getLevel().toInt() == 30000) {
|
||||||
|
presenter.getView().logWarning(logEvent.getRenderedMessage());
|
||||||
|
} else if (logEvent.getLevel().toInt() > 10000 && logEvent.getLevel().toInt() < 30000){
|
||||||
|
presenter.getView().logInfo(logEvent.getMessage().toString());
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public void close() {
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public boolean requiresLayout() {
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
}
|
|
@ -50,7 +50,7 @@ public class IntersectionComputer {
|
||||||
if (this.lines.isEmpty()){
|
if (this.lines.isEmpty()){
|
||||||
return Collections.emptyList();
|
return Collections.emptyList();
|
||||||
} else if (this.lines.size() > THRESHOLD) {
|
} else if (this.lines.size() > THRESHOLD) {
|
||||||
Logging.logInfo("Bigger than threshold, split into subtask.");
|
Logging.logDebug("Bigger than threshold, split into subtask.");
|
||||||
return ForkJoinTask.invokeAll(createSubTask()).stream().map(ForkJoinTask::join).flatMap(Collection::stream).collect(Collectors.toList());
|
return ForkJoinTask.invokeAll(createSubTask()).stream().map(ForkJoinTask::join).flatMap(Collection::stream).collect(Collectors.toList());
|
||||||
} else {
|
} else {
|
||||||
return work(this.lines, this.lines, this.lower, this.upper);
|
return work(this.lines, this.lines, this.lower, this.upper);
|
||||||
|
@ -93,7 +93,7 @@ public class IntersectionComputer {
|
||||||
* @return Liste der Schnittpunkte
|
* @return Liste der Schnittpunkte
|
||||||
*/
|
*/
|
||||||
public Collection<Point> compute(final List<Line> lines, final double lower, final double higher) {
|
public Collection<Point> compute(final List<Line> lines, final double lower, final double higher) {
|
||||||
Logging.logInfo("Open ForkJoinPool");
|
Logging.logInfo("Open ForkJoinPool: lines: " + lines.size() + " I(" + lower +", " +higher + "]");
|
||||||
ForkJoinPool pool = ForkJoinPool.commonPool();
|
ForkJoinPool pool = ForkJoinPool.commonPool();
|
||||||
RecursiveComputationTask recursiveComputationTask = new RecursiveComputationTask(lines, lines, lower, higher);
|
RecursiveComputationTask recursiveComputationTask = new RecursiveComputationTask(lines, lines, lower, higher);
|
||||||
pool.execute(recursiveComputationTask);
|
pool.execute(recursiveComputationTask);
|
||||||
|
|
|
@ -6,7 +6,10 @@ import org.apache.log4j.Logger;
|
||||||
public class Logging {
|
public class Logging {
|
||||||
private static Logger logger = Logger.getRootLogger();
|
private static Logger logger = Logger.getRootLogger();
|
||||||
|
|
||||||
private Logging() {
|
private Logging() {}
|
||||||
|
|
||||||
|
private static Logger getLogger() {
|
||||||
|
return logger;
|
||||||
}
|
}
|
||||||
|
|
||||||
public static void logInfo(final String message, Throwable throwable) {
|
public static void logInfo(final String message, Throwable throwable) {
|
||||||
|
|
|
@ -7,7 +7,6 @@ import de.wwwu.awolf.presenter.Presenter;
|
||||||
import de.wwwu.awolf.presenter.algorithms.Algorithm;
|
import de.wwwu.awolf.presenter.algorithms.Algorithm;
|
||||||
import de.wwwu.awolf.presenter.util.Logging;
|
import de.wwwu.awolf.presenter.util.Logging;
|
||||||
import de.wwwu.awolf.view.listener.*;
|
import de.wwwu.awolf.view.listener.*;
|
||||||
import de.wwwu.awolf.view.panels.DualityPanel;
|
|
||||||
import de.wwwu.awolf.view.panels.EvaluationPanel;
|
import de.wwwu.awolf.view.panels.EvaluationPanel;
|
||||||
import de.wwwu.awolf.view.panels.InfoPanel;
|
import de.wwwu.awolf.view.panels.InfoPanel;
|
||||||
import de.wwwu.awolf.view.panels.PlotPanel;
|
import de.wwwu.awolf.view.panels.PlotPanel;
|
||||||
|
@ -32,25 +31,19 @@ import java.util.Map;
|
||||||
*/
|
*/
|
||||||
public class MainFrame extends JFrame {
|
public class MainFrame extends JFrame {
|
||||||
|
|
||||||
|
private InfoPanel output;
|
||||||
private AbstractPresenter presenter;
|
private AbstractPresenter presenter;
|
||||||
private Boolean lmsIsComplete = false;
|
|
||||||
private Boolean rmIsComplete = false;
|
|
||||||
private Boolean tsIsComplete = false;
|
|
||||||
|
|
||||||
private JButton arrangementButton;
|
|
||||||
private JButton importButton;
|
private JButton importButton;
|
||||||
private JButton generateButton;
|
private JButton generateButton;
|
||||||
private JButton exportButton;
|
private JButton exportButton;
|
||||||
|
|
||||||
private InfoPanel output;
|
|
||||||
private MenuBar menu;
|
private MenuBar menu;
|
||||||
private JToolBar toolBar;
|
private JToolBar toolBar;
|
||||||
private TabPanel lmsPanel;
|
private TabPanel lmsPanel;
|
||||||
private TabPanel rmPanel;
|
private TabPanel rmPanel;
|
||||||
private TabPanel tsPanel;
|
private TabPanel tsPanel;
|
||||||
|
|
||||||
private DualityPanel arrangement;
|
|
||||||
private JDialog arrangementDialog;
|
|
||||||
private PlotPanel plotLMS;
|
private PlotPanel plotLMS;
|
||||||
private PlotPanel plotRM;
|
private PlotPanel plotRM;
|
||||||
private PlotPanel plotTS;
|
private PlotPanel plotTS;
|
||||||
|
@ -62,7 +55,6 @@ public class MainFrame extends JFrame {
|
||||||
|
|
||||||
|
|
||||||
private JSplitPane splitpane;
|
private JSplitPane splitpane;
|
||||||
private JScrollPane scrollPane;
|
|
||||||
private JTabbedPane tabbedPane;
|
private JTabbedPane tabbedPane;
|
||||||
private EvaluationPanel evaluationPanel;
|
private EvaluationPanel evaluationPanel;
|
||||||
|
|
||||||
|
@ -194,7 +186,7 @@ public class MainFrame extends JFrame {
|
||||||
if (evaluationDialog == null) {
|
if (evaluationDialog == null) {
|
||||||
SwingUtilities.invokeLater(() -> {
|
SwingUtilities.invokeLater(() -> {
|
||||||
evaluationDialog = new JDialog();
|
evaluationDialog = new JDialog();
|
||||||
evaluationDialog.setTitle("evaluation");
|
evaluationDialog.setTitle("Evaluation");
|
||||||
evaluationDialog.setDefaultCloseOperation(JDialog.DISPOSE_ON_CLOSE);
|
evaluationDialog.setDefaultCloseOperation(JDialog.DISPOSE_ON_CLOSE);
|
||||||
evaluationDialog.setSize(new Dimension(1500, 800));
|
evaluationDialog.setSize(new Dimension(1500, 800));
|
||||||
evaluationDialog.setLocationRelativeTo(null);
|
evaluationDialog.setLocationRelativeTo(null);
|
||||||
|
@ -249,7 +241,6 @@ public class MainFrame extends JFrame {
|
||||||
importButton.setText("Import");
|
importButton.setText("Import");
|
||||||
exportButton.setText("Export");
|
exportButton.setText("Export");
|
||||||
generateButton.setText("Generiere");
|
generateButton.setText("Generiere");
|
||||||
arrangementButton.setText("Dualraum");
|
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
|
@ -265,7 +256,6 @@ public class MainFrame extends JFrame {
|
||||||
* Komponenten werden in Container gesetzt
|
* Komponenten werden in Container gesetzt
|
||||||
*/
|
*/
|
||||||
private void addComponents() {
|
private void addComponents() {
|
||||||
toolBar.add(arrangementButton);
|
|
||||||
toolBar.add(importButton);
|
toolBar.add(importButton);
|
||||||
toolBar.add(exportButton);
|
toolBar.add(exportButton);
|
||||||
toolBar.add(generateButton);
|
toolBar.add(generateButton);
|
||||||
|
@ -273,7 +263,6 @@ public class MainFrame extends JFrame {
|
||||||
|
|
||||||
setJMenuBar(menu.getMenuBar());
|
setJMenuBar(menu.getMenuBar());
|
||||||
add(toolBar);
|
add(toolBar);
|
||||||
//northPanel.add(toolBar);
|
|
||||||
|
|
||||||
setupSplitPane();
|
setupSplitPane();
|
||||||
setupTabbedPane();
|
setupTabbedPane();
|
||||||
|
@ -354,7 +343,6 @@ public class MainFrame extends JFrame {
|
||||||
splitpane = new JSplitPane();
|
splitpane = new JSplitPane();
|
||||||
|
|
||||||
//Buttons
|
//Buttons
|
||||||
arrangementButton = new JButton();
|
|
||||||
importButton = new JButton();
|
importButton = new JButton();
|
||||||
generateButton = new JButton();
|
generateButton = new JButton();
|
||||||
exportButton = new JButton();
|
exportButton = new JButton();
|
||||||
|
@ -368,7 +356,6 @@ public class MainFrame extends JFrame {
|
||||||
try {
|
try {
|
||||||
ClassLoader classLoader = getClass().getClassLoader();
|
ClassLoader classLoader = getClass().getClassLoader();
|
||||||
Image imgImport = ImageIO.read(classLoader.getResource("import.png")).getScaledInstance(16, 16, Image.SCALE_SMOOTH);
|
Image imgImport = ImageIO.read(classLoader.getResource("import.png")).getScaledInstance(16, 16, Image.SCALE_SMOOTH);
|
||||||
Image imgPlot = ImageIO.read(classLoader.getResource("plot.png")).getScaledInstance(16, 16, Image.SCALE_SMOOTH);
|
|
||||||
Image imgStart = ImageIO.read(classLoader.getResource("start.png")).getScaledInstance(32, 32, Image.SCALE_SMOOTH);
|
Image imgStart = ImageIO.read(classLoader.getResource("start.png")).getScaledInstance(32, 32, Image.SCALE_SMOOTH);
|
||||||
Image imgGenerate = ImageIO.read(classLoader.getResource("generate.png")).getScaledInstance(16, 16, Image.SCALE_SMOOTH);
|
Image imgGenerate = ImageIO.read(classLoader.getResource("generate.png")).getScaledInstance(16, 16, Image.SCALE_SMOOTH);
|
||||||
Image imgExport = ImageIO.read(classLoader.getResource("export.png")).getScaledInstance(16, 16, Image.SCALE_SMOOTH);
|
Image imgExport = ImageIO.read(classLoader.getResource("export.png")).getScaledInstance(16, 16, Image.SCALE_SMOOTH);
|
||||||
|
@ -377,7 +364,6 @@ public class MainFrame extends JFrame {
|
||||||
importButton.setIcon(new ImageIcon(imgImport));
|
importButton.setIcon(new ImageIcon(imgImport));
|
||||||
exportButton.setIcon(new ImageIcon(imgExport));
|
exportButton.setIcon(new ImageIcon(imgExport));
|
||||||
generateButton.setIcon(new ImageIcon(imgGenerate));
|
generateButton.setIcon(new ImageIcon(imgGenerate));
|
||||||
arrangementButton.setIcon(new ImageIcon(imgPlot));
|
|
||||||
lmsPanel.getStartButton().setIcon(new ImageIcon(imgStart));
|
lmsPanel.getStartButton().setIcon(new ImageIcon(imgStart));
|
||||||
rmPanel.getStartButton().setIcon(new ImageIcon(imgStart));
|
rmPanel.getStartButton().setIcon(new ImageIcon(imgStart));
|
||||||
tsPanel.getStartButton().setIcon(new ImageIcon(imgStart));
|
tsPanel.getStartButton().setIcon(new ImageIcon(imgStart));
|
||||||
|
@ -411,7 +397,6 @@ public class MainFrame extends JFrame {
|
||||||
this.getLmsPanel().getStartButton().setEnabled(true);
|
this.getLmsPanel().getStartButton().setEnabled(true);
|
||||||
this.getRmPanel().getStartButton().setEnabled(true);
|
this.getRmPanel().getStartButton().setEnabled(true);
|
||||||
this.getTsPanel().getStartButton().setEnabled(true);
|
this.getTsPanel().getStartButton().setEnabled(true);
|
||||||
this.getArrangementButton().setEnabled(true);
|
|
||||||
this.getExportButton().setEnabled(true);
|
this.getExportButton().setEnabled(true);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -422,7 +407,6 @@ public class MainFrame extends JFrame {
|
||||||
this.getLmsPanel().getStartButton().setEnabled(false);
|
this.getLmsPanel().getStartButton().setEnabled(false);
|
||||||
this.getRmPanel().getStartButton().setEnabled(false);
|
this.getRmPanel().getStartButton().setEnabled(false);
|
||||||
this.getTsPanel().getStartButton().setEnabled(false);
|
this.getTsPanel().getStartButton().setEnabled(false);
|
||||||
this.getArrangementButton().setEnabled(false);
|
|
||||||
this.getExportButton().setEnabled(false);
|
this.getExportButton().setEnabled(false);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -432,52 +416,29 @@ public class MainFrame extends JFrame {
|
||||||
/**
|
/**
|
||||||
* @param s Text der ausgegeben wird
|
* @param s Text der ausgegeben wird
|
||||||
*/
|
*/
|
||||||
public void log(String s) {
|
public void logInfo(String s) {
|
||||||
SwingUtilities.invokeLater(() -> output.appendParagraph(s));
|
output.appendParagraph(s);
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* @param s Fehlertext der ausgegeben wird
|
* @param s Fehlertext der ausgegeben wird
|
||||||
*/
|
*/
|
||||||
public void logError(String s) {
|
public void logError(String s) {
|
||||||
SwingUtilities.invokeLater(() -> output.appendParagraphRed(s));
|
SwingUtilities.invokeLater(() -> output.appendParagraph(s));
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* @param s Text der in grüner Farbe ausgegeben wird
|
* @param s Text der in grüner Farbe ausgegeben wird
|
||||||
*/
|
*/
|
||||||
public void logSuccess(String s) {
|
public void logWarning(String s) {
|
||||||
SwingUtilities.invokeLater(() -> output.appendParagraphGreen(s));
|
SwingUtilities.invokeLater(() -> output.appendParagraph(s));
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
|
||||||
* @param s Text der als Überschrift ausgegeben wird
|
|
||||||
*/
|
|
||||||
public void logHeading(String s) {
|
|
||||||
SwingUtilities.invokeLater(() -> output.appendParagraphWithHeading(s));
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Ausgabe einer Tabelle
|
|
||||||
*
|
|
||||||
* @param heading Überschrift
|
|
||||||
* @param rows Zeilen mit Text
|
|
||||||
*/
|
|
||||||
public void createTable(List<String> heading, List<List<String>> rows) {
|
|
||||||
SwingUtilities.invokeLater(() -> output.logTable(heading, rows));
|
|
||||||
}
|
|
||||||
|
|
||||||
/*******************************************************************************************************************
|
/*******************************************************************************************************************
|
||||||
* Getter und Setter Methoden
|
* Getter und Setter Methoden
|
||||||
******************************************************************************************************************/
|
******************************************************************************************************************/
|
||||||
|
|
||||||
/**
|
|
||||||
* @return liefert den Button, zum visualisieren des dualen Raums zurück
|
|
||||||
*/
|
|
||||||
public JButton getArrangementButton() {
|
|
||||||
return arrangementButton;
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* @return liefert das Panel zum visualisieren des LMS-Schätzers
|
* @return liefert das Panel zum visualisieren des LMS-Schätzers
|
||||||
*/
|
*/
|
||||||
|
|
|
@ -46,12 +46,14 @@ public class GenerateDataListener implements ActionListener {
|
||||||
DecimalFormat decimalFormat = (DecimalFormat) numberFormat;
|
DecimalFormat decimalFormat = (DecimalFormat) numberFormat;
|
||||||
decimalFormat.setGroupingUsed(false);
|
decimalFormat.setGroupingUsed(false);
|
||||||
JTextField textField = new JFormattedTextField(decimalFormat);
|
JTextField textField = new JFormattedTextField(decimalFormat);
|
||||||
|
Dimension preferredSize = textField.getPreferredSize();
|
||||||
|
textField.setPreferredSize(new Dimension((int) preferredSize.getWidth(), (int) preferredSize.getHeight() + 5));
|
||||||
textField.setColumns(10);
|
textField.setColumns(10);
|
||||||
textField.setText("20");
|
textField.setText("20");
|
||||||
JButton aproveButton = new JButton("start");
|
JButton aproveButton = new JButton("start");
|
||||||
String[] options = {"Punktwolke", "Gerade", "Kreis und Gerade"};
|
String[] options = {"Punktwolke", "Gerade", "Kreis und Gerade"};
|
||||||
JComboBox<String> datasetTypeComboBox = new JComboBox<>(options);
|
JComboBox<String> datasetTypeComboBox = new JComboBox<>(options);
|
||||||
dialog.setSize(350, 70);
|
dialog.setSize(350, 80);
|
||||||
dialog.setLayout(new FlowLayout());
|
dialog.setLayout(new FlowLayout());
|
||||||
dialog.setResizable(false);
|
dialog.setResizable(false);
|
||||||
dialog.setLocationRelativeTo(presenter.getView());
|
dialog.setLocationRelativeTo(presenter.getView());
|
||||||
|
|
|
@ -1,287 +0,0 @@
|
||||||
package de.wwwu.awolf.view.panels;
|
|
||||||
|
|
||||||
import de.wwwu.awolf.model.Line;
|
|
||||||
import de.wwwu.awolf.model.Point;
|
|
||||||
import org.jfree.chart.ChartFactory;
|
|
||||||
import org.jfree.chart.ChartPanel;
|
|
||||||
import org.jfree.chart.JFreeChart;
|
|
||||||
import org.jfree.chart.axis.ValueAxis;
|
|
||||||
import org.jfree.chart.plot.PlotOrientation;
|
|
||||||
import org.jfree.chart.plot.XYPlot;
|
|
||||||
import org.jfree.chart.renderer.xy.XYLineAndShapeRenderer;
|
|
||||||
import org.jfree.data.time.DateRange;
|
|
||||||
import org.jfree.data.xy.XYSeries;
|
|
||||||
import org.jfree.data.xy.XYSeriesCollection;
|
|
||||||
import org.jfree.util.ShapeUtilities;
|
|
||||||
|
|
||||||
import javax.swing.*;
|
|
||||||
import java.awt.*;
|
|
||||||
import java.awt.event.KeyEvent;
|
|
||||||
import java.awt.event.KeyListener;
|
|
||||||
import java.awt.event.MouseWheelEvent;
|
|
||||||
import java.awt.event.MouseWheelListener;
|
|
||||||
import java.util.LinkedList;
|
|
||||||
import java.util.List;
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Implementierung verschiedener Algorithmen zur Berechnung von Ausgleichsgeraden.
|
|
||||||
*
|
|
||||||
* @Author: Armin Wolf
|
|
||||||
* @Email: a_wolf28@uni-muenster.de
|
|
||||||
* @Date: 28.05.2017.
|
|
||||||
*/
|
|
||||||
public class DualityPanel extends JPanel {
|
|
||||||
|
|
||||||
private List<Line> lines;
|
|
||||||
private List<Point> points;
|
|
||||||
private JFreeChart chart;
|
|
||||||
private ChartPanel panel;
|
|
||||||
private XYSeriesCollection dataset;
|
|
||||||
private JScrollPane scrollPane;
|
|
||||||
private double domainMin, domainMax;
|
|
||||||
private double rangeMin, rangeMax;
|
|
||||||
private ValueAxis domain;
|
|
||||||
private ValueAxis range;
|
|
||||||
private Double delta = 1d;
|
|
||||||
|
|
||||||
private Boolean ctrlPressed = false;
|
|
||||||
private Boolean shiftPressed = false;
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Konstruktor
|
|
||||||
*/
|
|
||||||
public DualityPanel() {
|
|
||||||
super();
|
|
||||||
this.setPreferredSize(new Dimension(800, 800));
|
|
||||||
this.setMinimumSize(new Dimension(800, 800));
|
|
||||||
this.setLayout(new BorderLayout());
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Hilfsmethode um die Parameter im einem Schritt zu setzen
|
|
||||||
*
|
|
||||||
* @param lines Liste der Geraden
|
|
||||||
* @param points Liste der Schnittpunkte
|
|
||||||
* @param xmin minimale x-Koordinate
|
|
||||||
* @param xmax maximale x-Koordinate
|
|
||||||
* @param ymin minimale y-Koordinate
|
|
||||||
* @param ymax maximale y-Koordinate
|
|
||||||
*/
|
|
||||||
public void setPrameters(List<Line> lines, List<Point> points, Double xmin, Double xmax, Double ymin, Double ymax) {
|
|
||||||
this.lines = new LinkedList<>(lines);
|
|
||||||
this.points = new LinkedList<>(points);
|
|
||||||
this.domainMin = xmin;
|
|
||||||
this.domainMax = xmax;
|
|
||||||
this.rangeMin = ymin;
|
|
||||||
this.rangeMax = ymax;
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Die Methode erzeugt ein Arrangement von Geraden.
|
|
||||||
*/
|
|
||||||
public void createArrangement() {
|
|
||||||
dataset = new XYSeriesCollection();
|
|
||||||
|
|
||||||
for (Line p : lines) {
|
|
||||||
XYSeries series = new XYSeries(p.getId() + "#" + p.getX1() + "---" + p.getY1());
|
|
||||||
series.add(p.getX1(), p.getY1());
|
|
||||||
series.add(p.getX2(), p.getY2());
|
|
||||||
dataset.addSeries(series);
|
|
||||||
}
|
|
||||||
|
|
||||||
XYSeries intersections = new XYSeries("intersections");
|
|
||||||
for (Point p : points) {
|
|
||||||
intersections.add(p.getX(), p.getY());
|
|
||||||
}
|
|
||||||
|
|
||||||
dataset.addSeries(intersections);
|
|
||||||
|
|
||||||
chart = ChartFactory.createXYLineChart(null, null, null, dataset,
|
|
||||||
PlotOrientation.HORIZONTAL, false, false, false);
|
|
||||||
|
|
||||||
chart.setRenderingHints(new RenderingHints(RenderingHints.KEY_ANTIALIASING,
|
|
||||||
RenderingHints.VALUE_ANTIALIAS_ON));
|
|
||||||
chart.setAntiAlias(true);
|
|
||||||
|
|
||||||
final XYPlot plot = chart.getXYPlot();
|
|
||||||
domain = plot.getDomainAxis();
|
|
||||||
range = plot.getRangeAxis();
|
|
||||||
|
|
||||||
domain.setRange(domainMin - 1, domainMax + 1);
|
|
||||||
range.setRange(rangeMin - 1, rangeMax + 1);
|
|
||||||
|
|
||||||
plot.setBackgroundPaint(Color.WHITE);
|
|
||||||
plot.setDomainGridlinePaint(Color.white);
|
|
||||||
plot.setRangeGridlinePaint(Color.white);
|
|
||||||
|
|
||||||
final XYLineAndShapeRenderer renderer = new XYLineAndShapeRenderer();
|
|
||||||
renderer.setSeriesLinesVisible(dataset.indexOf(intersections), false);
|
|
||||||
plot.setRenderer(renderer);
|
|
||||||
|
|
||||||
for (int i = 0; i < lines.size(); i++) {
|
|
||||||
// Setze die Shapes für die Schnittpunkte
|
|
||||||
renderer.setSeriesPaint(i, Color.BLUE);
|
|
||||||
renderer.setBaseSeriesVisible(true);
|
|
||||||
}
|
|
||||||
|
|
||||||
Shape shape = ShapeUtilities.createDiagonalCross(4, 1);
|
|
||||||
renderer.setSeriesPaint(lines.size(), Color.BLACK);
|
|
||||||
renderer.setSeriesShape(lines.size(), shape);
|
|
||||||
|
|
||||||
panel = new ChartPanel(chart);
|
|
||||||
panel.setPreferredSize(new Dimension(800, 800));
|
|
||||||
|
|
||||||
addKeyListener(this);
|
|
||||||
addZooming(panel);
|
|
||||||
this.setFocusable(true);
|
|
||||||
|
|
||||||
JTextArea info = new JTextArea();
|
|
||||||
info.setWrapStyleWord(true);
|
|
||||||
info.setLineWrap(true);
|
|
||||||
info.setAlignmentX(JTextArea.CENTER_ALIGNMENT);
|
|
||||||
info.setText("Um in dem Plot hineinzuzoomen kann das Mausrad verwendett werden. Um sich anschließen vertikal bzw. horizontal zu bewegen kann die Kombination (Umschalt/Steuerung) und Mausrad verwendett werden.");
|
|
||||||
Font font = new Font("Serif", Font.ITALIC, 14);
|
|
||||||
info.setFont(font);
|
|
||||||
//info.setForeground(Color.DARK_GRAY);
|
|
||||||
info.setEditable(false);
|
|
||||||
info.setWrapStyleWord(true);
|
|
||||||
|
|
||||||
this.add(info, BorderLayout.SOUTH);
|
|
||||||
this.add(panel, BorderLayout.CENTER);
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Hilfmethode für die Zoom-Funktion im Panel
|
|
||||||
*
|
|
||||||
* @param component Komponente
|
|
||||||
*/
|
|
||||||
public void addKeyListener(JComponent component) {
|
|
||||||
component.addKeyListener(new KeyListener() {
|
|
||||||
@Override
|
|
||||||
public void keyReleased(KeyEvent e) {
|
|
||||||
ctrlPressed = false;
|
|
||||||
shiftPressed = false;
|
|
||||||
}
|
|
||||||
|
|
||||||
@Override
|
|
||||||
public void keyTyped(KeyEvent e) {
|
|
||||||
}
|
|
||||||
|
|
||||||
@Override
|
|
||||||
public void keyPressed(KeyEvent e) {
|
|
||||||
if (e.isControlDown()) {
|
|
||||||
ctrlPressed = true;
|
|
||||||
}
|
|
||||||
|
|
||||||
if (e.isShiftDown()) {
|
|
||||||
shiftPressed = true;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
});
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Zoom-Funktionalität für das Panel
|
|
||||||
*
|
|
||||||
* @param chartPanel
|
|
||||||
*/
|
|
||||||
protected void addZooming(ChartPanel chartPanel) {
|
|
||||||
|
|
||||||
chartPanel.addMouseWheelListener(new MouseWheelListener() {
|
|
||||||
|
|
||||||
@Override
|
|
||||||
public void mouseWheelMoved(MouseWheelEvent e) {
|
|
||||||
|
|
||||||
double min;
|
|
||||||
double max;
|
|
||||||
Double val;
|
|
||||||
val = e.getPreciseWheelRotation() * -1;
|
|
||||||
|
|
||||||
if (ctrlPressed) {
|
|
||||||
//Logging.logInfo("CTRL + ZOOM");
|
|
||||||
min = range.getLowerBound();
|
|
||||||
max = range.getUpperBound();
|
|
||||||
DateRange dateRangeX = move(val, min, max);
|
|
||||||
range.setRange(dateRangeX);
|
|
||||||
} else if (shiftPressed) {
|
|
||||||
//Logging.logInfo("SHIFT + ZOOM");
|
|
||||||
min = domain.getLowerBound();
|
|
||||||
max = domain.getUpperBound();
|
|
||||||
DateRange dateRangeY = move(val, min, max);
|
|
||||||
domain.setRange(dateRangeY);
|
|
||||||
} else {
|
|
||||||
Double x = (double) e.getY();
|
|
||||||
Double y = (double) e.getY();
|
|
||||||
if (e.getScrollType() != MouseWheelEvent.WHEEL_UNIT_SCROLL)
|
|
||||||
return;
|
|
||||||
if (e.getWheelRotation() < 0)
|
|
||||||
increaseZoom((ChartPanel) e.getComponent());
|
|
||||||
else
|
|
||||||
decreaseZoom((ChartPanel) e.getComponent());
|
|
||||||
}
|
|
||||||
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Bewegung im Panel
|
|
||||||
* @param val Bewegung
|
|
||||||
* @param min minimale Wert
|
|
||||||
* @param max maximale Wert
|
|
||||||
* @return aktuell Sichtbare Teil des Panels
|
|
||||||
*/
|
|
||||||
private DateRange move(Double val, Double min, Double max) {
|
|
||||||
Double minimum = min;
|
|
||||||
Double maximum = max;
|
|
||||||
delta = Math.abs(maximum - minimum) * 0.01 * val;
|
|
||||||
|
|
||||||
minimum = minimum + delta;
|
|
||||||
maximum = maximum + delta;
|
|
||||||
|
|
||||||
return new DateRange(minimum, maximum);
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Reinzoomen
|
|
||||||
* @param chart chart
|
|
||||||
*/
|
|
||||||
public synchronized void increaseZoom(JComponent chart) {
|
|
||||||
ChartPanel ch = (ChartPanel) chart;
|
|
||||||
zoomChartAxis(ch, true);
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Rauszoomen
|
|
||||||
* @param chart chart
|
|
||||||
*/
|
|
||||||
public synchronized void decreaseZoom(JComponent chart) {
|
|
||||||
ChartPanel ch = (ChartPanel) chart;
|
|
||||||
zoomChartAxis(ch, false);
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Zoom
|
|
||||||
* @param chartP
|
|
||||||
* @param increase
|
|
||||||
*/
|
|
||||||
private void zoomChartAxis(ChartPanel chartP, boolean increase) {
|
|
||||||
int width = chartP.getMaximumDrawWidth() - chartP.getMinimumDrawWidth();
|
|
||||||
int height = chartP.getMaximumDrawHeight() - chartP.getMinimumDrawWidth();
|
|
||||||
if (increase) {
|
|
||||||
chartP.zoomInBoth(width * 0.5, height * 0.5);
|
|
||||||
} else {
|
|
||||||
chartP.zoomOutBoth(width * 0.5, height * 0.5);
|
|
||||||
}
|
|
||||||
|
|
||||||
}
|
|
||||||
});
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Datensatz leeren
|
|
||||||
*/
|
|
||||||
public void clear() {
|
|
||||||
if (dataset != null)
|
|
||||||
dataset.removeAllSeries();
|
|
||||||
}
|
|
||||||
|
|
||||||
}
|
|
|
@ -50,8 +50,6 @@ public class EvaluationPanel extends JPanel {
|
||||||
private JComboBox<String> datasetType;
|
private JComboBox<String> datasetType;
|
||||||
private JLabel datasetCountLabel;
|
private JLabel datasetCountLabel;
|
||||||
|
|
||||||
private JSplitPane splitPane;
|
|
||||||
|
|
||||||
private DefaultTableModel model;
|
private DefaultTableModel model;
|
||||||
private int currentRowOfTypes;
|
private int currentRowOfTypes;
|
||||||
private JPanel buttonPanel;
|
private JPanel buttonPanel;
|
||||||
|
@ -123,7 +121,6 @@ public class EvaluationPanel extends JPanel {
|
||||||
header = table.getTableHeader();
|
header = table.getTableHeader();
|
||||||
header.setBackground(Color.GRAY);
|
header.setBackground(Color.GRAY);
|
||||||
|
|
||||||
splitPane = new JSplitPane();
|
|
||||||
algorithmPanel = new JPanel(new FlowLayout(FlowLayout.LEFT));
|
algorithmPanel = new JPanel(new FlowLayout(FlowLayout.LEFT));
|
||||||
datasetCount = new JPanel(new FlowLayout(FlowLayout.LEFT));
|
datasetCount = new JPanel(new FlowLayout(FlowLayout.LEFT));
|
||||||
|
|
||||||
|
@ -175,15 +172,7 @@ public class EvaluationPanel extends JPanel {
|
||||||
leftSidePanel.add(comp, BorderLayout.NORTH);
|
leftSidePanel.add(comp, BorderLayout.NORTH);
|
||||||
leftSidePanel.add(scrollPane, BorderLayout.CENTER);
|
leftSidePanel.add(scrollPane, BorderLayout.CENTER);
|
||||||
|
|
||||||
//Splitpane
|
this.add(leftSidePanel, BorderLayout.CENTER);
|
||||||
splitPane.setOrientation(JSplitPane.HORIZONTAL_SPLIT);
|
|
||||||
splitPane.setResizeWeight(.5d);
|
|
||||||
splitPane.setContinuousLayout(true);
|
|
||||||
splitPane.setLeftComponent(leftSidePanel);
|
|
||||||
splitPane.setRightComponent(plotPanel);
|
|
||||||
|
|
||||||
this.add(splitPane, BorderLayout.CENTER);
|
|
||||||
|
|
||||||
this.add(buttonPanel, BorderLayout.SOUTH);
|
this.add(buttonPanel, BorderLayout.SOUTH);
|
||||||
|
|
||||||
}
|
}
|
||||||
|
@ -352,19 +341,6 @@ public class EvaluationPanel extends JPanel {
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
|
||||||
* Visualisierung der dualen Geraden (Eingabemenge)
|
|
||||||
*
|
|
||||||
* @param points Liste der Geraden
|
|
||||||
*/
|
|
||||||
public void setDualPoints(List<Line> points) {
|
|
||||||
plotPanel = new PlotPanel();
|
|
||||||
plotPanel.setBorder(new TitledBorder("Plot"));
|
|
||||||
splitPane.setRightComponent(plotPanel);
|
|
||||||
plotPanel.createPlot(points);
|
|
||||||
plotPanel.repaint();
|
|
||||||
plotPanel.revalidate();
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Hilfsmethode
|
* Hilfsmethode
|
||||||
|
|
|
@ -1,5 +1,8 @@
|
||||||
package de.wwwu.awolf.view.panels;
|
package de.wwwu.awolf.view.panels;
|
||||||
|
|
||||||
|
import de.wwwu.awolf.presenter.util.Logging;
|
||||||
|
import org.apache.log4j.nt.NTEventLogAppender;
|
||||||
|
|
||||||
import javax.swing.*;
|
import javax.swing.*;
|
||||||
import javax.swing.border.TitledBorder;
|
import javax.swing.border.TitledBorder;
|
||||||
import java.awt.*;
|
import java.awt.*;
|
||||||
|
@ -14,7 +17,7 @@ import java.util.List;
|
||||||
*/
|
*/
|
||||||
public class InfoPanel extends JPanel {
|
public class InfoPanel extends JPanel {
|
||||||
|
|
||||||
private JTextPane output;
|
private JTextArea output;
|
||||||
private JScrollPane scrollPane;
|
private JScrollPane scrollPane;
|
||||||
private StringBuilder content;
|
private StringBuilder content;
|
||||||
|
|
||||||
|
@ -22,11 +25,11 @@ public class InfoPanel extends JPanel {
|
||||||
* Konstruktor
|
* Konstruktor
|
||||||
*/
|
*/
|
||||||
public InfoPanel() {
|
public InfoPanel() {
|
||||||
this.setBorder(new TitledBorder("Ausgabekanal"));
|
this.setBorder(new TitledBorder("Logging"));
|
||||||
this.setLayout(new BorderLayout());
|
this.setLayout(new BorderLayout());
|
||||||
output = new JTextPane();
|
output = new JTextArea();
|
||||||
output.setEditable(false);
|
output.setEditable(false);
|
||||||
output.setContentType("text/html");
|
output.setWrapStyleWord(true);
|
||||||
|
|
||||||
content = new StringBuilder();
|
content = new StringBuilder();
|
||||||
|
|
||||||
|
@ -42,37 +45,7 @@ public class InfoPanel extends JPanel {
|
||||||
* @param p Übergebener Text
|
* @param p Übergebener Text
|
||||||
*/
|
*/
|
||||||
public void appendParagraph(String p) {
|
public void appendParagraph(String p) {
|
||||||
content.append("<p>" + p + "</p>");
|
content.append(p).append("\n");
|
||||||
output.setText(content.toString());
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Fügt eine Überschrift dem Panel hinzu
|
|
||||||
*
|
|
||||||
* @param h1 Überschrift
|
|
||||||
*/
|
|
||||||
public void appendParagraphWithHeading(String h1) {
|
|
||||||
content.append("<h1>" + h1 + "</h1>");
|
|
||||||
output.setText(content.toString());
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Fügt einen Text in roter Schrift als Paragraph dem Panel hinzu
|
|
||||||
*
|
|
||||||
* @param p Text
|
|
||||||
*/
|
|
||||||
public void appendParagraphRed(String p) {
|
|
||||||
content.append("<p style=\" color:red \"><em><strong>" + p + "</strong></em></p>");
|
|
||||||
output.setText(content.toString());
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Fügt einen Text in grüner Schrift als Paragraph dem Panel hinzu
|
|
||||||
*
|
|
||||||
* @param p Text
|
|
||||||
*/
|
|
||||||
public void appendParagraphGreen(String p) {
|
|
||||||
content.append("<p style=\" color:green \"><em><strong>" + p + "</strong></em></p>");
|
|
||||||
output.setText(content.toString());
|
output.setText(content.toString());
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -1,5 +1,5 @@
|
||||||
# Root logger option
|
# Root logger option
|
||||||
log4j.rootLogger=DEBUG, file, stdout
|
log4j.rootLogger=DEBUG, file, stdout, GuiAppender
|
||||||
# Direct log messages to a log file
|
# Direct log messages to a log file
|
||||||
log4j.appender.file=org.apache.log4j.RollingFileAppender
|
log4j.appender.file=org.apache.log4j.RollingFileAppender
|
||||||
log4j.appender.file.File=D:\\Git\\master-implementierung\\LinearRegressionTool\\log4j\\app.log
|
log4j.appender.file.File=D:\\Git\\master-implementierung\\LinearRegressionTool\\log4j\\app.log
|
||||||
|
@ -12,3 +12,7 @@ log4j.appender.stdout=org.apache.log4j.ConsoleAppender
|
||||||
log4j.appender.stdout.Target=System.out
|
log4j.appender.stdout.Target=System.out
|
||||||
log4j.appender.stdout.layout=org.apache.log4j.PatternLayout
|
log4j.appender.stdout.layout=org.apache.log4j.PatternLayout
|
||||||
log4j.appender.stdout.layout.ConversionPattern=%d{yyyy-MM-dd HH:mm:ss} %-5p %c{1}:%L - %m%n
|
log4j.appender.stdout.layout.ConversionPattern=%d{yyyy-MM-dd HH:mm:ss} %-5p %c{1}:%L - %m%n
|
||||||
|
# Custom Appender
|
||||||
|
log4j.appender.GuiAppender=de.wwwu.awolf.presenter.util.GuiAppender
|
||||||
|
log4j.appender.GuiAppender.layout=org.apache.log4j.PatternLayout
|
||||||
|
log4j.appender.GuiAppender.layout.ConversionPattern=%d{yyyy-MM-dd HH:mm:ss} %-5p %c{1}:%L - %m%n
|
||||||
|
|
Loading…
Reference in New Issue