2020-03-21 00:37:09 +00:00
package de.wwwu.awolf.view.panels ;
2017-09-10 15:45:47 +00:00
2020-03-21 00:37:09 +00:00
import de.wwwu.awolf.model.Line ;
import de.wwwu.awolf.model.Point ;
2017-09-10 15:45:47 +00:00
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 ;
2020-03-21 00:37:09 +00:00
import java.util.List ;
2017-09-10 15:45:47 +00:00
/ * *
* 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 {
2020-03-21 00:37:09 +00:00
private List < Line > lines ;
private List < Point > points ;
2017-09-10 15:45:47 +00:00
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 ;
2017-10-17 06:34:55 +00:00
/ * *
* Konstruktor
* /
2017-09-10 15:45:47 +00:00
public DualityPanel ( ) {
super ( ) ;
this . setPreferredSize ( new Dimension ( 800 , 800 ) ) ;
this . setMinimumSize ( new Dimension ( 800 , 800 ) ) ;
this . setLayout ( new BorderLayout ( ) ) ;
}
2017-10-17 06:34:55 +00:00
/ * *
* Hilfsmethode um die Parameter im einem Schritt zu setzen
2020-03-20 17:08:18 +00:00
*
* @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
2017-10-17 06:34:55 +00:00
* /
2020-03-21 00:37:09 +00:00
public void setPrameters ( List < Line > lines , List < Point > points , Double xmin , Double xmax , Double ymin , Double ymax ) {
2017-09-10 15:45:47 +00:00
this . lines = new LinkedList < > ( lines ) ;
this . points = new LinkedList < > ( points ) ;
this . domainMin = xmin ;
this . domainMax = xmax ;
this . rangeMin = ymin ;
this . rangeMax = ymax ;
}
2017-10-17 06:34:55 +00:00
/ * *
* Die Methode erzeugt ein Arrangement von Geraden .
* /
2017-09-10 15:45:47 +00:00
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 ( ) ;
2017-10-15 07:55:29 +00:00
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 ) ;
2017-09-10 15:45:47 +00:00
info . setFont ( font ) ;
2017-10-15 07:55:29 +00:00
//info.setForeground(Color.DARK_GRAY);
2017-09-10 15:45:47 +00:00
info . setEditable ( false ) ;
info . setWrapStyleWord ( true ) ;
this . add ( info , BorderLayout . SOUTH ) ;
this . add ( panel , BorderLayout . CENTER ) ;
}
2017-10-17 06:34:55 +00:00
/ * *
* Hilfmethode für die Zoom - Funktion im Panel
2020-03-20 17:08:18 +00:00
*
2017-10-17 06:34:55 +00:00
* @param component Komponente
* /
2017-09-10 15:45:47 +00:00
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 ;
}
}
} ) ;
}
2017-10-17 06:34:55 +00:00
/ * *
* Zoom - Funktionalität für das Panel
2020-03-20 17:08:18 +00:00
*
2017-10-17 06:34:55 +00:00
* @param chartPanel
* /
2017-09-10 15:45:47 +00:00
protected void addZooming ( ChartPanel chartPanel ) {
chartPanel . addMouseWheelListener ( new MouseWheelListener ( ) {
2017-10-17 06:34:55 +00:00
@Override
2017-09-10 15:45:47 +00:00
public void mouseWheelMoved ( MouseWheelEvent e ) {
2020-03-21 00:37:09 +00:00
double min ;
double max ;
Double val ;
val = e . getPreciseWheelRotation ( ) * - 1 ;
2017-09-10 15:45:47 +00:00
2020-03-21 00:37:09 +00:00
if ( ctrlPressed ) {
//Logging.logInfo("CTRL + ZOOM");
2017-09-10 15:45:47 +00:00
min = range . getLowerBound ( ) ;
max = range . getUpperBound ( ) ;
DateRange dateRangeX = move ( val , min , max ) ;
range . setRange ( dateRangeX ) ;
2020-03-21 00:37:09 +00:00
} else if ( shiftPressed ) {
//Logging.logInfo("SHIFT + ZOOM");
2017-09-10 15:45:47 +00:00
min = domain . getLowerBound ( ) ;
max = domain . getUpperBound ( ) ;
DateRange dateRangeY = move ( val , min , max ) ;
domain . setRange ( dateRangeY ) ;
} else {
2020-03-21 00:37:09 +00:00
Double x = ( double ) e . getY ( ) ;
Double y = ( double ) e . getY ( ) ;
2017-09-10 15:45:47 +00:00
if ( e . getScrollType ( ) ! = MouseWheelEvent . WHEEL_UNIT_SCROLL )
return ;
if ( e . getWheelRotation ( ) < 0 )
2017-10-17 06:34:55 +00:00
increaseZoom ( ( ChartPanel ) e . getComponent ( ) ) ;
2017-09-10 15:45:47 +00:00
else
2017-10-17 06:34:55 +00:00
decreaseZoom ( ( ChartPanel ) e . getComponent ( ) ) ;
2017-09-10 15:45:47 +00:00
}
}
2017-10-17 06:34:55 +00:00
/ * *
* Bewegung im Panel
* @param val Bewegung
* @param min minimale Wert
* @param max maximale Wert
2020-03-20 17:08:18 +00:00
* @return aktuell Sichtbare Teil des Panels
2017-10-17 06:34:55 +00:00
* /
2017-09-10 15:45:47 +00:00
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 ) ;
}
2017-10-17 06:34:55 +00:00
/ * *
* Reinzoomen
* @param chart chart
* /
public synchronized void increaseZoom ( JComponent chart ) {
2017-09-10 15:45:47 +00:00
ChartPanel ch = ( ChartPanel ) chart ;
2017-10-17 06:34:55 +00:00
zoomChartAxis ( ch , true ) ;
2017-09-10 15:45:47 +00:00
}
2017-10-17 06:34:55 +00:00
/ * *
* Rauszoomen
* @param chart chart
* /
public synchronized void decreaseZoom ( JComponent chart ) {
2017-09-10 15:45:47 +00:00
ChartPanel ch = ( ChartPanel ) chart ;
2017-10-17 06:34:55 +00:00
zoomChartAxis ( ch , false ) ;
2017-09-10 15:45:47 +00:00
}
2017-10-17 06:34:55 +00:00
/ * *
* Zoom
* @param chartP
* @param increase
* /
private void zoomChartAxis ( ChartPanel chartP , boolean increase ) {
2017-09-10 15:45:47 +00:00
int width = chartP . getMaximumDrawWidth ( ) - chartP . getMinimumDrawWidth ( ) ;
int height = chartP . getMaximumDrawHeight ( ) - chartP . getMinimumDrawWidth ( ) ;
if ( increase ) {
2020-03-21 00:37:09 +00:00
chartP . zoomInBoth ( width * 0 . 5 , height * 0 . 5 ) ;
2017-09-10 15:45:47 +00:00
} else {
2020-03-21 00:37:09 +00:00
chartP . zoomOutBoth ( width * 0 . 5 , height * 0 . 5 ) ;
2017-09-10 15:45:47 +00:00
}
}
} ) ;
}
2017-10-17 06:34:55 +00:00
/ * *
* Datensatz leeren
* /
2017-09-10 15:45:47 +00:00
public void clear ( ) {
if ( dataset ! = null )
dataset . removeAllSeries ( ) ;
}
}