From 72e7348b423984dbd98558507f23b3ef3ec54726 Mon Sep 17 00:00:00 2001 From: Armin Wolf Date: Fri, 16 Jun 2017 13:24:35 +0200 Subject: [PATCH] gui anpassungen --- src/main/java/Model/Line.java | 1 + .../java/Presenter/Algorithms/Algorithm.java | 4 +- .../LeastMedianOfSquaresEstimator.java | 58 +++-- .../Algorithms/RepeatedMedianEstimator.java | 2 +- .../Algorithms/TheilSenEstimator.java | 2 +- src/main/java/Presenter/Presenter.java | 95 +++---- src/main/java/View/ArrangementDialog.java | 83 +++++-- src/main/java/View/MainFrame.java | 231 +++++++++++++----- src/main/java/View/MenuPanel.java | 5 +- src/main/java/View/PlotDialog.java | 51 +++- src/main/java/View/SidePanel.java | 41 ++-- 11 files changed, 394 insertions(+), 179 deletions(-) diff --git a/src/main/java/Model/Line.java b/src/main/java/Model/Line.java index 1819949..db9c57e 100644 --- a/src/main/java/Model/Line.java +++ b/src/main/java/Model/Line.java @@ -49,6 +49,7 @@ public class Line { this.m = (y2 -y1)/(x2-x1); this.b = y2 - (x2 * m); + } public double getM() { diff --git a/src/main/java/Presenter/Algorithms/Algorithm.java b/src/main/java/Presenter/Algorithms/Algorithm.java index 8dd4208..002549d 100644 --- a/src/main/java/Presenter/Algorithms/Algorithm.java +++ b/src/main/java/Presenter/Algorithms/Algorithm.java @@ -1,5 +1,7 @@ package Presenter.Algorithms; +import java.util.Observable; + /** * Implementierung verschiedener Algorithmen zur Berechnung von Ausgleichsgeraden. * @@ -7,7 +9,7 @@ package Presenter.Algorithms; * @Email: a_wolf28@uni-muenster.de * @Date: 28.05.2017. */ -public abstract class Algorithm { +public interface Algorithm { } diff --git a/src/main/java/Presenter/Algorithms/LeastMedianOfSquaresEstimator.java b/src/main/java/Presenter/Algorithms/LeastMedianOfSquaresEstimator.java index e7d3224..6203177 100644 --- a/src/main/java/Presenter/Algorithms/LeastMedianOfSquaresEstimator.java +++ b/src/main/java/Presenter/Algorithms/LeastMedianOfSquaresEstimator.java @@ -2,8 +2,13 @@ package Presenter.Algorithms; import Model.Line; import Model.Point; +import Presenter.Presenter; +import View.MainFrame; +import javafx.beans.*; +import sun.applet.Main; import java.util.*; +import java.util.Observable; /** * Implementierung verschiedener Algorithmen zur Berechnung von Ausgleichsgeraden. @@ -12,9 +17,11 @@ import java.util.*; * @Email: a_wolf28@uni-muenster.de * @Date: 28.05.2017. */ -public class LeastMedianOfSquaresEstimator extends Algorithm { +public class LeastMedianOfSquaresEstimator extends Observable implements Algorithm { + private Presenter presenter; + private LinkedList set = new LinkedList<>(); private LinkedList intersections = new LinkedList<>(); private int n; @@ -26,7 +33,21 @@ public class LeastMedianOfSquaresEstimator extends Algorithm { private Slab subSlabU2; private Line sigmaMin; private double heightsigmaMin; - private double intersectionsPoint; + private Double intersectionsPoint; + + public LeastMedianOfSquaresEstimator(LinkedList set, LinkedList intersections, Presenter presenter) { + this.set = set; + this.intersections = intersections; + + //(1.) Let n <- |S|; q+ <- q; q- <- q+ * (1 - quantileError);.... + n = set.size(); + double quantile = 0.5; + double qPlus = quantile; + double qMinus = qPlus * (1 - quantileError); + kMinus = (int) Math.ceil(n * qMinus); + kPlus = (int) Math.ceil(n * qPlus); + this.presenter = presenter; + } public LeastMedianOfSquaresEstimator(LinkedList set, LinkedList intersections) { this.set = set; @@ -39,6 +60,7 @@ public class LeastMedianOfSquaresEstimator extends Algorithm { double qMinus = qPlus * (1 - quantileError); kMinus = (int) Math.ceil(n * qMinus); kPlus = (int) Math.ceil(n * qPlus); + } public void printResult(){ @@ -81,20 +103,21 @@ public class LeastMedianOfSquaresEstimator extends Algorithm { int constant = 1; if ((constant * n) >= numberOfIntersections) { sigmaMin = planeSweep(slab); - } else {//(c.) otherwise.... - //get random intersections point... - Double randomIntersection = null; + } else { + //(c.) otherwise.... + // get random intersections point... Collections.shuffle(tmpIntersections, new Random()); - for (Point point : tmpIntersections) { - if (point.getX() > slab.getLower() && point.getX() < slab.getUpper()) { - randomIntersection = point.getX(); + for (int i=0;i slab.getLower() && tmpIntersections.get(i).getX() < slab.getUpper()) { + intersectionsPoint = tmpIntersections.get(i).getX(); break; + } else { + intersectionsPoint = null; } } - if (randomIntersection != null){ - splitActiveSlab(randomIntersection, slab); - + if (intersectionsPoint != null){ + splitActiveSlab(intersectionsPoint, slab); //(d.) this may update sigma min upperBound(intersectionsPoint); //(e.) for i={1,2}, call lower bound(Ui) @@ -107,15 +130,22 @@ public class LeastMedianOfSquaresEstimator extends Algorithm { if (subSlabU2.getActivity()){ this.slabs.add(subSlabU2); } + } else { this.slabs.poll(); } } + + } else { this.slabs.remove(slab); } - - + } + if (presenter != null){ + setChanged(); + double m = (getSigmaMin().getX2() + getSigmaMin().getX1()) * 0.5; + double b = (getSigmaMin().getY2() + getSigmaMin().getY1()) * 0.5; + notifyObservers(new Line(m,b)); } } @@ -220,7 +250,7 @@ public class LeastMedianOfSquaresEstimator extends Algorithm { * @param point x Koordinate an der, der Split geschieht. */ public void splitActiveSlab(double point, Slab active) { - subSlabU1 = new Slab(active.getLower(), point); + subSlabU1 = new Slab(active.getLower()+0.01, point); subSlabU2 = new Slab(point, active.getUpper()); this.slabs.remove(active); diff --git a/src/main/java/Presenter/Algorithms/RepeatedMedianEstimator.java b/src/main/java/Presenter/Algorithms/RepeatedMedianEstimator.java index 611a851..9e56987 100644 --- a/src/main/java/Presenter/Algorithms/RepeatedMedianEstimator.java +++ b/src/main/java/Presenter/Algorithms/RepeatedMedianEstimator.java @@ -7,5 +7,5 @@ package Presenter.Algorithms; * @Email: a_wolf28@uni-muenster.de * @Date: 28.05.2017. */ -public class RepeatedMedianEstimator extends Algorithm { +public class RepeatedMedianEstimator implements Algorithm { } diff --git a/src/main/java/Presenter/Algorithms/TheilSenEstimator.java b/src/main/java/Presenter/Algorithms/TheilSenEstimator.java index 74a4c9f..609aaf7 100644 --- a/src/main/java/Presenter/Algorithms/TheilSenEstimator.java +++ b/src/main/java/Presenter/Algorithms/TheilSenEstimator.java @@ -7,5 +7,5 @@ package Presenter.Algorithms; * @Email: a_wolf28@uni-muenster.de * @Date: 28.05.2017. */ -public class TheilSenEstimator extends Algorithm { +public class TheilSenEstimator implements Algorithm { } diff --git a/src/main/java/Presenter/Presenter.java b/src/main/java/Presenter/Presenter.java index ea31563..2db8141 100644 --- a/src/main/java/Presenter/Presenter.java +++ b/src/main/java/Presenter/Presenter.java @@ -6,9 +6,11 @@ import Model.Point; import Presenter.Algorithms.LeastMedianOfSquaresEstimator; import View.MainFrame; -import java.util.Collections; +import javax.swing.*; import java.util.LinkedList; import java.util.List; +import java.util.Observable; +import java.util.Observer; /** @@ -18,11 +20,12 @@ import java.util.List; * @Email: a_wolf28@uni-muenster.de * @Date: 28.05.2017. */ -public class Presenter { +public class Presenter implements Observer { private Arrangement model; private MainFrame view; + private LeastMedianOfSquaresEstimator lms; private Double max; private Double min; @@ -36,8 +39,8 @@ public class Presenter { Double[] y = {18d,26d,30d,40d,70d}; // Double[] x = {1d,3d,4d,5d,8d}; // Double[] y = {4d,2d,1d,0d,0d}; - view.logHeading("Dualen Geraden"); - for (int j = 0; j < 5; j++) { + view.logHeading("Duale Darstellung der Punkte als Geraden:"); + for (int j = 0; j < x.length; j++) { Line p = new Line(x[j], y[j]); view.log("f(x) = " + p.getM() + "x + " + p.getB()); this.model.addLine(p); @@ -55,62 +58,39 @@ public class Presenter { rowEntry.add(p.getY().toString()); rows.add(rowEntry); } - view.logHeading("Koordinaten der Punkte"); + view.logHeading("Schnittpunkte der Dualen Geraden:"); view.createTable(heading, rows); - view.logSuccess("Berechnung wurde Erfolgreich durchgeführt"); - Thread thread = new Thread(() -> { - LeastMedianOfSquaresEstimator lms = new LeastMedianOfSquaresEstimator(model.getLines(), model.getNodes()); - lms.approximateLMS(); - }); - thread.start(); + + } + + @Override + public void update(Observable o, Object arg) { + Line result = ((Line) arg); + SwingUtilities.invokeLater(()->{ + getView().createPlot(result.getM(), result.getB()); + getView().setLmsIsComplete(true); + getView().getPlotButton().setEnabled(true); + getView().logSuccess("Berechnung wurde Erfolgreich durchgeführt"); + getView().log("m: "+result.getM()+" b: "+result.getB()); + }); + + } + + public void startArrangementVisualization() { view.createArrangement(); } public void startScatterPlotVisualization() { - view.createPlot(); + lms = new LeastMedianOfSquaresEstimator(model.getLines(), model.getNodes(), this); + lms.addObserver(this); + lms.approximateLMS(); } - - private void convertCoordinates() { - LinkedList xCoordinates = new LinkedList<>(); - LinkedList yCoordinates = new LinkedList<>(); - - for (Point point : model.getNodes()) { - xCoordinates.add(point.getX()); - yCoordinates.add(point.getY()); - } - - Collections.sort(xCoordinates); - Collections.sort(yCoordinates); - - double xmin, xmax; - double ymin, ymax; - - xmin = xCoordinates.getFirst(); - xmax = xCoordinates.getLast(); - ymin = yCoordinates.getFirst(); - ymax = yCoordinates.getLast(); - - -// for (Point p : model.getNodes()) { -// p.setX(scale(p.getX(), xmin, xmax, 0, 700)); -// p.setY(scale(p.getY(), ymin, ymax, 0, 700)); -// } - } - - public double scale(double x, double old_min, double old_max, double new_min, double new_max){ - double old_range = Math.abs(old_max - old_min); - double new_range = Math.abs(new_max - new_min); - double ret = new_min + ((x - old_min) * Math.abs(new_range / old_range)); - System.out.println("Old Range: "+old_range+"\t New Range: "+new_range+"\t ret: "+ret); - return ret; - } - public Point calcIntersection(Line a, Line b) { Line p1 = a; Line p2 = b; @@ -122,18 +102,17 @@ public class Presenter { } public void calcArrangementNodes() { - Thread thread = new Thread(() -> { - for (int i = 0; i < getLines().size(); i++) { - for (int j = i; j < getLines().size(); j++) { - if (i != j){ - model.addNode(calcIntersection(getLines().get(j), getLines().get(i))); + try { + Thread thread = new Thread(() -> { + for (int i = 0; i < getLines().size(); i++) { + for (int j = i; j < getLines().size(); j++) { + if (i != j){ + model.addNode(calcIntersection(getLines().get(j), getLines().get(i))); + } } } - } - convertCoordinates(); - }); - thread.start(); - try { + }); + thread.start(); thread.join(); } catch (InterruptedException e) { e.printStackTrace(); diff --git a/src/main/java/View/ArrangementDialog.java b/src/main/java/View/ArrangementDialog.java index 43b5784..9b48cd8 100644 --- a/src/main/java/View/ArrangementDialog.java +++ b/src/main/java/View/ArrangementDialog.java @@ -1,5 +1,6 @@ package View; +import Model.Line; import Model.Point; import org.jfree.chart.ChartFactory; import org.jfree.chart.ChartPanel; @@ -10,8 +11,11 @@ import org.jfree.chart.plot.XYPlot; import org.jfree.chart.renderer.xy.XYLineAndShapeRenderer; import org.jfree.data.xy.XYSeries; import org.jfree.data.xy.XYSeriesCollection; +import org.jfree.util.ShapeUtilities; import javax.swing.*; +import javax.swing.event.ChangeEvent; +import javax.swing.event.ChangeListener; import java.awt.*; import java.util.LinkedList; @@ -24,24 +28,29 @@ import java.util.LinkedList; */ public class ArrangementDialog extends JPanel { - private LinkedList lines; + private LinkedList> lines; private LinkedList points; private double max; private double min; private JFreeChart chart; private ChartPanel panel; + private JSlider hslider; + private JSlider vslider; private double domainMin, domainMax; private double rangeMin, rangeMax; + private ValueAxis domain; + private ValueAxis range; public ArrangementDialog() { super(); - this.setPreferredSize(new Dimension(800, 500)); - this.setMinimumSize(new Dimension(800, 500)); + this.setPreferredSize(new Dimension(800, 800)); + this.setMinimumSize(new Dimension(800, 800)); + this.setLayout(new BorderLayout()); + this.vslider = new JSlider(SwingConstants.VERTICAL,1,100,50); + this.hslider = new JSlider(SwingConstants.HORIZONTAL,10,1000,500); } - public void setPrameters(Double pmax, Double pmin, LinkedList lines, LinkedList points) { - this.max = pmax; - this.min = pmin; + public void setPrameters(LinkedList> lines, LinkedList points) { this.lines = lines; this.points = points; this.domainMin = Double.MAX_VALUE; @@ -53,10 +62,10 @@ public class ArrangementDialog extends JPanel { public void createArrangement() { XYSeriesCollection dataset = new XYSeriesCollection(); - for (Point p : lines) { - XYSeries series = new XYSeries(p.getX() + p.getY()); - series.add((-1 * this.max), (((-1 * this.max) * p.getX()) + p.getY())); - series.add(this.max, ((this.max * p.getX()) + p.getY())); + for (LinkedList p : lines) { + XYSeries series = new XYSeries(p.get(0).getX() + p.get(0).getY()); + series.add(p.get(0).getX(), p.get(0).getY()); + series.add(p.get(1).getX(), p.get(1).getY()); dataset.addSeries(series); } @@ -73,24 +82,68 @@ public class ArrangementDialog extends JPanel { 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(); - ValueAxis domain = plot.getDomainAxis(); - ValueAxis range = plot.getRangeAxis(); + + domain = plot.getDomainAxis(); + range = plot.getRangeAxis(); domain.setRange(domainMin - 1, domainMax + 1); - range.setRange(rangeMin - 1, rangeMax + - 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 { + JSlider slider = (JSlider) e.getSource(); + double delta = Math.abs(slider.getValue() - 50) * 0.1; + if (slider.getValue() < 50){ + domain.setRange(domainMin - delta, domainMax - delta); + } else { + domain.setRange(domainMin + delta, domainMax + delta); + } + }); + + this.hslider.addChangeListener(e -> { + JSlider slider = (JSlider) e.getSource(); + double delta = Math.abs(slider.getValue() - 500); + + if (slider.getValue() < 500){ + range.setRange(rangeMin - delta, rangeMax - delta); + } else { + range.setRange(rangeMin + delta, rangeMax + delta); + } + }); + } diff --git a/src/main/java/View/MainFrame.java b/src/main/java/View/MainFrame.java index f89c533..ac6e16c 100644 --- a/src/main/java/View/MainFrame.java +++ b/src/main/java/View/MainFrame.java @@ -1,13 +1,21 @@ package View; +import Model.Line; +import Presenter.Algorithms.LeastMedianOfSquaresEstimator; import Presenter.Presenter; +import com.sun.org.apache.xpath.internal.operations.Bool; +import jdk.nashorn.internal.scripts.JO; import javax.swing.*; import javax.swing.event.ChangeEvent; import javax.swing.event.ChangeListener; import java.awt.*; +import java.awt.event.ActionEvent; +import java.awt.event.ActionListener; import java.util.List; +import java.util.Observable; +import java.util.Observer; /** * Implementierung verschiedener Algorithmen zur Berechnung von Ausgleichsgeraden. @@ -16,16 +24,19 @@ import java.util.List; * @Email: a_wolf28@uni-muenster.de * @Date: 28.05.2017. */ -public class MainFrame extends JFrame { +public class MainFrame extends JFrame{ private Presenter presenter; + private Boolean lmsIsComplete = false; + private Boolean rmIsComplete = false; + private Boolean tsIsComplete = false; + //TODO refactoring private JButton arrangementButton; private JButton plotButton; private JButton button3; private JPanel pane; - private JSlider slider; private JDialog arrangementDialog; private JDialog plotDialog; private OutputPanel output; @@ -33,7 +44,8 @@ public class MainFrame extends JFrame { private JPanel sidepanel; private JSplitPane splitpane; private JScrollPane scrollPane; - private ArrangementDialog2 arrangement; + private ArrangementDialog arrangement; + private JTabbedPane tabbedPane; private PlotDialog plot; public MainFrame() { @@ -54,43 +66,30 @@ public class MainFrame extends JFrame { public void createArrangement() { if (arrangement == null) { - arrangement = new ArrangementDialog2(); + arrangement = new ArrangementDialog(); arrangement.setPrameters(getPresenter().calcArrangementLines(), getPresenter().getModel().getNodes()); - // arrangement.createArrangement(); - SwingUtilities.invokeLater(new Runnable() { - @Override - public void run() { - arrangementDialog.add(arrangement, BorderLayout.CENTER); - arrangementDialog.add(slider, BorderLayout.SOUTH); - arrangementDialog.setVisible(true); - } + arrangement.createArrangement(); + SwingUtilities.invokeLater(() -> { + arrangementDialog.add(arrangement, BorderLayout.CENTER); + arrangementDialog.setVisible(true); }); } else { arrangementDialog.setVisible(true); } } - public void createLine() { - //TODO - } - public void createPlot() { - if (plot == null) { + public void createPlot(double m, double b) { plot = new PlotDialog(); - plot.createPlot(getPresenter().getLines()); - SwingUtilities.invokeLater(new Runnable() { - @Override - public void run() { - plotDialog.add(plot); - plotDialog.setVisible(true); - } + SwingUtilities.invokeLater(() -> { + plot.createPlot(getPresenter().getLines()); + plot.addLineToPlot(m, b); + plotDialog.add(plot); + plotDialog.setVisible(true); }); - } else { - plotDialog.setVisible(true); - } } - + /******************************************************************************************************************/ /** * init GUI */ @@ -104,37 +103,17 @@ public class MainFrame extends JFrame { pane.setLayout(new FlowLayout()); menupanel = new MenuPanel(); + tabbedPane = new JTabbedPane(); arrangementDialog = new JDialog(); plotDialog = new JDialog(); arrangementDialog.setSize(new Dimension(800, 800)); plotDialog.setSize(new Dimension(700, 470)); - arrangementDialog.setTitle("Arrangement Dialog"); - plotDialog.setTitle("Scatter Plot Dialog"); + arrangementDialog.setTitle("Dual Representation - Dialog"); + plotDialog.setTitle("Scatter Plot - Dialog"); arrangementDialog.setDefaultCloseOperation(JDialog.HIDE_ON_CLOSE); plotDialog.setDefaultCloseOperation(JDialog.HIDE_ON_CLOSE); - this.slider = new JSlider(JSlider.HORIZONTAL, 10, 300, 10); - this.slider.addChangeListener(new ChangeListener() { - @Override - public void stateChanged(ChangeEvent e) { - SwingUtilities.invokeLater(new Runnable() { - @Override - public void run() { - JSlider source = (JSlider) e.getSource(); - arrangement.setScale((double) source.getValue() / 10); - int thicknes = 50 / source.getValue(); - if (thicknes == 0) { - arrangement.setPointThicknes(1); - } else { - arrangement.setPointThicknes(thicknes); - } - arrangement.repaint(); - arrangement.validate(); - } - }); - } - }); output = new OutputPanel(); @@ -147,31 +126,39 @@ public class MainFrame extends JFrame { plotButton = new JButton("Plot"); button3 = new JButton("Import"); - arrangementButton.addActionListener(e -> getPresenter().startArrangementVisualization()); - plotButton.addActionListener(e -> getPresenter().startScatterPlotVisualization()); - - button3.addActionListener(e -> log("Lorem ipsum dolor sit amet, consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat, sed diam voluptua. At vero eos et accusam et justo duo dolores et ea rebum. Stet clita kasd gubergren, no sea takimata sanctus est Lorem ipsum dolor sit amet. Lorem ipsum dolor sit amet, consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat, sed diam voluptua. At vero eos et accusam et justo duo dolores et ea rebum. Stet clita kasd gubergren, no sea takimata sanctus est Lorem ipsum dolor sit amet. Lorem ipsum dolor sit amet, consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat, sed diam voluptua. At vero eos et accusam et justo duo dolores et ea rebum. Stet clita kasd gubergren, no sea takimata sanctus est Lorem ipsum dolor sit amet. \n" + - "\n" + - "Duis autem vel eum iriure dolor in hendrerit in vulputate velit esse molestie consequat, vel illum dolore eu feugiat nulla facilisis at vero eros et accumsan et iusto odio dignissim qui blandit praesent luptatum zzril delenit augue duis dolore te feugait nulla facilisi. Lorem ipsum dolor sit amet,")); + arrangementButton.addActionListener((ActionEvent e) -> { + Thread t = new Thread(() -> getPresenter().startArrangementVisualization()); + t.start(); + }); + plotButton.addActionListener((ActionEvent e) -> { + plotButton.setEnabled(false); + Thread t = new Thread(() -> getPresenter().startScatterPlotVisualization()); + t.start(); + }); pane.add(arrangementButton); pane.add(plotButton); pane.add(button3); + tabbedPane.add("LMS", sidepanel); + tabbedPane.add("RM", new JPanel()); + tabbedPane.add("TS", new JPanel()); + splitpane.setOrientation(JSplitPane.HORIZONTAL_SPLIT); splitpane.setResizeWeight(.5d); splitpane.setContinuousLayout(true); splitpane.setLeftComponent(output); - splitpane.setRightComponent(sidepanel); + splitpane.setRightComponent(tabbedPane); this.add(pane, BorderLayout.SOUTH); this.add(splitpane, BorderLayout.CENTER); this.add(menupanel, BorderLayout.NORTH); -// this.add(output, BorderLayout.CENTER); -// this.add(sidepanel, BorderLayout.EAST); this.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); this.setVisible(true); } + + + /******************************************************************************************************************/ /** * log Methode */ @@ -196,5 +183,129 @@ public class MainFrame extends JFrame { SwingUtilities.invokeLater(() -> output.logTable(heading, rows)); } + /******************************************************************************************************************/ + /** + * Getter und Setter Methoden! + */ + public Boolean getLmsIsComplete() { + return lmsIsComplete; + } + + public void setLmsIsComplete(Boolean lmsIsComplete) { + this.lmsIsComplete = lmsIsComplete; + } + + public Boolean getRmIsComplete() { + return rmIsComplete; + } + + public void setRmIsComplete(Boolean rmIsComplete) { + this.rmIsComplete = rmIsComplete; + } + + public Boolean getTsIsComplete() { + return tsIsComplete; + } + + public void setTsIsComplete(Boolean tsIsComplete) { + this.tsIsComplete = tsIsComplete; + } + + public JButton getArrangementButton() { + return arrangementButton; + } + + public void setArrangementButton(JButton arrangementButton) { + this.arrangementButton = arrangementButton; + } + + public JButton getPlotButton() { + return plotButton; + } + + public void setPlotButton(JButton plotButton) { + this.plotButton = plotButton; + } + + public JButton getButton3() { + return button3; + } + + public void setButton3(JButton button3) { + this.button3 = button3; + } + + public JPanel getPane() { + return pane; + } + + public void setPane(JPanel pane) { + this.pane = pane; + } + + public JDialog getArrangementDialog() { + return arrangementDialog; + } + + public void setArrangementDialog(JDialog arrangementDialog) { + this.arrangementDialog = arrangementDialog; + } + + public JDialog getPlotDialog() { + return plotDialog; + } + + public void setPlotDialog(JDialog plotDialog) { + this.plotDialog = plotDialog; + } + + public OutputPanel getOutput() { + return output; + } + + public void setOutput(OutputPanel output) { + this.output = output; + } + + public JPanel getMenupanel() { + return menupanel; + } + + public void setMenupanel(JPanel menupanel) { + this.menupanel = menupanel; + } + + public JPanel getSidepanel() { + return sidepanel; + } + + public void setSidepanel(JPanel sidepanel) { + this.sidepanel = sidepanel; + } + + public JSplitPane getSplitpane() { + return splitpane; + } + + public void setSplitpane(JSplitPane splitpane) { + this.splitpane = splitpane; + } + + public JScrollPane getScrollPane() { + return scrollPane; + } + + public void setScrollPane(JScrollPane scrollPane) { + this.scrollPane = scrollPane; + } + + + public PlotDialog getPlot() { + return plot; + } + + public void setPlot(PlotDialog plot) { + this.plot = plot; + } } diff --git a/src/main/java/View/MenuPanel.java b/src/main/java/View/MenuPanel.java index 6cb22a5..788ff74 100644 --- a/src/main/java/View/MenuPanel.java +++ b/src/main/java/View/MenuPanel.java @@ -2,6 +2,8 @@ package View; import javax.swing.*; import java.awt.*; +import java.awt.event.ActionEvent; +import java.awt.event.ActionListener; /** * Implementierung verschiedener Algorithmen zur Berechnung von Ausgleichsgeraden. @@ -20,8 +22,9 @@ public class MenuPanel extends JPanel { this.setLayout(new BorderLayout()); this.menuBar = new JMenuBar(); this.menu = new JMenu("File"); - this.item = new JMenuItem("Exit"); + this.item = new JMenuItem("Exit"); + this.item.addActionListener(e -> { System.exit(0);}); menu.add(item); menuBar.add(menu); diff --git a/src/main/java/View/PlotDialog.java b/src/main/java/View/PlotDialog.java index 80cae06..715a6cd 100644 --- a/src/main/java/View/PlotDialog.java +++ b/src/main/java/View/PlotDialog.java @@ -8,12 +8,15 @@ import org.jfree.chart.JFreeChart; import org.jfree.chart.plot.PlotOrientation; import org.jfree.chart.plot.XYPlot; import org.jfree.chart.renderer.xy.XYItemRenderer; +import org.jfree.chart.renderer.xy.XYLineAndShapeRenderer; 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.util.ArrayList; +import java.util.Collections; import java.util.LinkedList; /** @@ -29,24 +32,29 @@ public class PlotDialog extends JPanel { private ChartPanel panel; private XYSeriesCollection datapoints; private XYSeries series; + private XYSeries linesA, linesB; + private Double min; + private Double max; public PlotDialog() { super(); this.setPreferredSize(new Dimension(800, 500)); this.setMinimumSize(new Dimension(800, 500)); + this.setLayout(new BorderLayout()); } public void createPlot(LinkedList points) { - Thread thread = new Thread(() -> convertData(points)); - thread.start(); try { + Thread thread = new Thread(() -> convertData(points)); + thread.start(); thread.join(); } catch (InterruptedException e) { e.printStackTrace(); } - chart = ChartFactory.createScatterPlot("", + //createScatterPlot + chart = ChartFactory.createXYLineChart("", "X", "Y", datapoints, PlotOrientation.VERTICAL, false, true, false); Shape diamond = ShapeUtilities.createDiamond(2f); chart.setBorderVisible(false); @@ -57,29 +65,54 @@ public class PlotDialog extends JPanel { xyPlot.setDomainCrosshairVisible(true); xyPlot.setRangeCrosshairVisible(true); - XYItemRenderer renderer = xyPlot.getRenderer(); + XYLineAndShapeRenderer renderer = (XYLineAndShapeRenderer) xyPlot.getRenderer(); + renderer.setSeriesLinesVisible(0,false); + renderer.setSeriesShapesVisible(0, true); + renderer.setSeriesLinesVisible(1,true); + renderer.setSeriesLinesVisible(2,true); + renderer.setSeriesPaint(0, Color.blue); renderer.setSeriesShape(0, diamond); + + renderer.setSeriesPaint(1, Color.red); + renderer.setSeriesShape(1, diamond); + renderer.setSeriesStroke(1,new BasicStroke(2.0f)); + renderer.setBaseSeriesVisible(true); + + renderer.setSeriesPaint(2, Color.GREEN); + renderer.setSeriesShape(2, diamond); + renderer.setSeriesStroke(2,new BasicStroke(2.0f)); + renderer.setBaseSeriesVisible(true); + xyPlot.setDomainCrosshairVisible(true); xyPlot.setRangeCrosshairVisible(true); panel = new ChartPanel(chart); - this.add(panel); + this.add(panel, BorderLayout.CENTER); } - public void addLineToPlot() { - //TODO Line Estimator + public void addLineToPlot(double m, double b) { + linesA = new XYSeries("linesA"); + JOptionPane.showMessageDialog(null, "m: "+m+" b: "+b); + linesA.add(min.intValue(), min.intValue() * (-1) * m + b ); + linesA.add(max.intValue(), max.intValue() * (-1) * m + b ); + + datapoints.addSeries(linesA); } private void convertData(LinkedList points) { datapoints = new XYSeriesCollection(); - series = new XYSeries(""); + ArrayList coordinates = new ArrayList<>(); + series = new XYSeries("points"); for (Line p : points) { series.add(p.getM(), p.getB()); - } + coordinates.add(p.getM()); + } + this.max = Collections.max(coordinates) + 1; + this.min = Collections.min(coordinates) - 1; datapoints.addSeries(series); } diff --git a/src/main/java/View/SidePanel.java b/src/main/java/View/SidePanel.java index 9ff1ef0..2e34635 100644 --- a/src/main/java/View/SidePanel.java +++ b/src/main/java/View/SidePanel.java @@ -34,28 +34,31 @@ public class SidePanel extends JPanel { gbc.fill = GridBagConstraints.HORIZONTAL; + addElement(0, "Konstante"); + addElement(1, "Fehler"); + addElement(2,"Quantile"); - for (int i=0;i<9;i++){ - this.labels[i] = new JLabel("dummy "+i); - this.text[i] = new JTextField(); - - gbc.insets = new Insets(0, 5,0,0); - gbc.gridx = 0; - gbc.gridy = i; - gbc.weightx = 0.05; - gbc.weighty = 0.05; - continer.add(this.labels[i], gbc); - - gbc.gridx = 1; - gbc.gridy = i; - gbc.weightx = 0.9; - gbc.weighty = 0.05; - gbc.insets = new Insets(0, 0,0,5); - continer.add(this.text[i], gbc); - } this.add(continer, BorderLayout.NORTH); - } + + private void addElement(int row, String name){ + this.labels[row] = new JLabel(name); + this.text[row] = new JTextField(); + + gbc.insets = new Insets(0, 5,0,0); + gbc.gridx = 0; + gbc.gridy = row; + gbc.weightx = 0.05; + gbc.weighty = 0.05; + continer.add(this.labels[row], gbc); + + gbc.gridx = 1; + gbc.gridy = row; + gbc.weightx = 0.9; + gbc.weighty = 0.05; + gbc.insets = new Insets(0, 0,0,5); + continer.add(this.text[row], gbc); + } }