From 0b538c539f76d625dc5e0fbbf075648098009845 Mon Sep 17 00:00:00 2001 From: Sebastian Rieger Date: Mon, 27 Nov 2017 16:23:08 +0100 Subject: [PATCH] improved GUI and RMI handling --- .../mandelbrot/rmi/MGuiRMI.java | 145 +++++++++++------- 1 file changed, 86 insertions(+), 59 deletions(-) diff --git a/VerteilteSysteme-Examples/src/verteiltesysteme/mandelbrot/rmi/MGuiRMI.java b/VerteilteSysteme-Examples/src/verteiltesysteme/mandelbrot/rmi/MGuiRMI.java index 03df54c..6fe7531 100644 --- a/VerteilteSysteme-Examples/src/verteiltesysteme/mandelbrot/rmi/MGuiRMI.java +++ b/VerteilteSysteme-Examples/src/verteiltesysteme/mandelbrot/rmi/MGuiRMI.java @@ -1,5 +1,7 @@ package verteiltesysteme.mandelbrot.rmi; +import java.awt.BorderLayout; + //Mandelbot Example A. Gepperth import java.awt.Color; @@ -22,6 +24,8 @@ import javax.swing.JFrame; import javax.swing.JLabel; import javax.swing.JPanel; import javax.swing.JSlider; +import javax.swing.JTextField; +import javax.swing.border.BevelBorder; import javax.swing.event.ChangeEvent; import javax.swing.event.ChangeListener; @@ -51,7 +55,7 @@ class MyJLabel extends JLabel { @Override protected void paintComponent(Graphics g) { - super.paintComponent(g); + super.paintComponent(g); g.setColor(Color.black); g.drawRect(this.boxULx, this.boxULy, this.boxW, this.boxH); } @@ -66,8 +70,10 @@ public class MGuiRMI implements ActionListener, ChangeListener, MouseListener, M JButton endButton; JButton backButton; JButton calcButton; + JTextField hostTextField; JSlider maxIterations; MyJLabel view; + JLabel message; int nrIterations; // box management @@ -79,8 +85,8 @@ public class MGuiRMI implements ActionListener, ChangeListener, MouseListener, M // how many points in the image? // change if you want a higher resolution - public static final int RESX = 600; - public static final int RESY = 600; + public static int RESX = 600; + public static int RESY = 600; MGuiRMI() { // set up GUI @@ -88,17 +94,23 @@ public class MGuiRMI implements ActionListener, ChangeListener, MouseListener, M this.panel = new JPanel(); this.endButton = new JButton("Ende"); this.panel.add(this.endButton); - this.backButton = new JButton("Zurueck"); + this.backButton = new JButton("Zurück"); this.panel.add(this.backButton); this.calcButton = new JButton("Rechnen"); + this.hostTextField = new JTextField(20); + this.hostTextField.setText("localhost"); this.panel.add(this.calcButton); + this.panel.add(this.hostTextField); this.frame.add(this.panel); - this.frame.setSize(500, 500); + this.frame.setSize(700, 720); this.frame.setVisible(true); - this.view = new MyJLabel("Platzhalter"); + this.view = new MyJLabel(); this.maxIterations = new JSlider(0, 50, 30); this.panel.add(this.maxIterations); this.panel.add(this.view); + this.message = new JLabel("Status"); + this.message.setBorder(new BevelBorder(BevelBorder.LOWERED)); + this.frame.add(this.message,BorderLayout.SOUTH); this.endButton.addActionListener(this); this.backButton.addActionListener(this); @@ -116,16 +128,10 @@ public class MGuiRMI implements ActionListener, ChangeListener, MouseListener, M this.boxULy = 0; this.boxW = MGuiRMI.RESX; this.boxH = MGuiRMI.RESY; + + this.frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); // Non-Gui stuff - String host = ""; - try { - Registry registry = LocateRegistry.getRegistry(host); - this.remoteCalcObj = (RMIMandelbrotCalculationsInterface) registry.lookup("RMIEchoInterface"); - } catch (RemoteException | NotBoundException e) { - // TODO Auto-generated catch block - e.printStackTrace(); - } this.nrIterations = 1000; } @@ -157,6 +163,7 @@ public class MGuiRMI implements ActionListener, ChangeListener, MouseListener, M if (ae.getSource() == this.backButton) { System.out.println("Zurueck"); + // Zoom und Ausschnitt zurücksetzen double ULx = -0.16099999999999995; double ULy = -0.9365333333333333; double LRx = -0.03533333333333327; @@ -167,68 +174,85 @@ public class MGuiRMI implements ActionListener, ChangeListener, MouseListener, M this.boxH = MGuiRMI.RESY; this.view.setBox(this.boxULx, this.boxULy, this.boxW, this.boxH); this.view.repaint(); - try { - this.remoteCalcObj.setView(ULx, ULy, LRx, LRy); - } catch (RemoteException e) { - // TODO Auto-generated catch block - e.printStackTrace(); + if (this.remoteCalcObj == null) + { + String message = "Fehler: noch nicht verbunden, noch keine Berechnung durchgeführt"; + this.message.setText(message); + System.out.println(message); + } + else + { + try { + this.remoteCalcObj.setView(ULx, ULy, LRx, LRy); + } catch (RemoteException e) { + // TODO Auto-generated catch block + e.printStackTrace(); + } + this.message.setText("Ausschnitt zurückgesetzt"); } } else if (ae.getSource() == this.calcButton) { - System.out.println("Rechnen"); - long timestampStart = System.currentTimeMillis(); - - double ULx = 0; - double ULy = 0; - double LRx = 0; - double LRy = 0; + String hostname = this.hostTextField.getText(); + System.out.println("Verbinde mit RMI Registry auf Host: " + hostname); try { + Registry registry = LocateRegistry.getRegistry(hostname); + this.remoteCalcObj = (RMIMandelbrotCalculationsInterface) registry.lookup("RMIEchoInterface"); + System.out.println("Rechnen"); + long timestampStart = System.currentTimeMillis(); + + //this.boxW = this.boxW / 2; + //MGuiRMI.RESX = MGuiRMI.RESX / 2; + + double ULx = 0; + double ULy = 0; + double LRx = 0; + double LRy = 0; + ULx = this.remoteCalcObj.getULx(); ULy = this.remoteCalcObj.getULy(); LRx = this.remoteCalcObj.getLRx(); LRy = this.remoteCalcObj.getLRy(); - } catch (RemoteException e) { - // TODO Auto-generated catch block - e.printStackTrace(); - } - double w = LRx - ULx; - double h = LRy - ULy; - ULx = ULx + w * this.boxULx / (double) MGuiRMI.RESX; - ULy = ULy + h * this.boxULy / (double) MGuiRMI.RESY; - w *= this.boxW / (double) (RESX); - h *= this.boxH / (double) (RESX); - LRx = ULx + w; - LRy = ULy + h; - System.out.println(ULx + "/" + ULy + "/" + LRx + "/" + LRy); - this.boxULx = 0; - this.boxULy = 0; - this.boxW = MGuiRMI.RESX; - this.boxH = MGuiRMI.RESY; - int[] colors = null; - try { + + double w = LRx - ULx; + double h = LRy - ULy; + ULx = ULx + w * this.boxULx / (double) MGuiRMI.RESX; + ULy = ULy + h * this.boxULy / (double) MGuiRMI.RESY; + w *= this.boxW / (double) (RESX); + h *= this.boxH / (double) (RESX); + LRx = ULx + w; + LRy = ULy + h; + System.out.println(ULx + "/" + ULy + "/" + LRx + "/" + LRy); + this.boxULx = 0; + this.boxULy = 0; + this.boxW = MGuiRMI.RESX; + this.boxH = MGuiRMI.RESY; + int[] colors = null; + + //this.remoteCalcObj.setView(ULx, ULy, LRx, LRy); this.remoteCalcObj.setView(ULx, ULy, LRx, LRy); this.remoteCalcObj.iterateAllPoints(this.maxIterations.getValue() * 1000, MGuiRMI.RESX, MGuiRMI.RESY); int[] lookupTable = generateLookupTable(this.maxIterations.getValue() * 1000); colors = new int[MGuiRMI.RESX * MGuiRMI.RESY]; MGuiRMI.applyLookupTable(remoteCalcObj.getResult(), colors, lookupTable); - } catch (RemoteException e) { - // TODO Auto-generated catch block - e.printStackTrace(); - } - BufferedImage colorImage = new BufferedImage(MGuiRMI.RESX, MGuiRMI.RESY, BufferedImage.TYPE_INT_ARGB); - colorImage.setRGB(0, 0, MGuiRMI.RESX, MGuiRMI.RESY, colors, 0, MGuiRMI.RESX); - this.view.setIcon(new ImageIcon(colorImage)); + BufferedImage colorImage = new BufferedImage(MGuiRMI.RESX, MGuiRMI.RESY, BufferedImage.TYPE_INT_ARGB); + colorImage.setRGB(0, 0, MGuiRMI.RESX, MGuiRMI.RESY, colors, 0, MGuiRMI.RESX); + this.view.setIcon(new ImageIcon(colorImage)); - this.view.setBox(this.boxULx, this.boxULy, this.boxW, this.boxH); - this.view.repaint(); + this.view.setBox(this.boxULx, this.boxULy, this.boxW, this.boxH); + this.view.repaint(); + + long timestampEnd = System.currentTimeMillis(); - long timestampEnd = System.currentTimeMillis(); + String timeElapsed = "Dauer: " + ((timestampEnd - timestampStart) / 1000.0) + " sec"; + System.out.println(timeElapsed); + this.message.setText(timeElapsed); + } catch (RemoteException | NotBoundException e) { + // TODO Auto-generated catch block + e.printStackTrace(); + } - String timeElapsed = "Zeit: " + ((timestampEnd - timestampStart) / 1000.0) + " sec"; - System.out.println(timeElapsed); - this.view.setText(timeElapsed); } } @@ -238,6 +262,7 @@ public class MGuiRMI implements ActionListener, ChangeListener, MouseListener, M this.boxW = 1; this.boxH = 1; this.view.setBox(this.boxULx, this.boxULy, this.boxW, this.boxH); + this.message.setText("boxULx: " + this.boxULx + " boxULy: " + this.boxULy + " boxW: " + this.boxW + " boxH: " + this.boxH); } public void mouseDragged(MouseEvent e) { @@ -247,6 +272,7 @@ public class MGuiRMI implements ActionListener, ChangeListener, MouseListener, M this.boxW = m; this.boxH = m; this.view.setBox(this.boxULx, this.boxULy, this.boxW, this.boxH); + this.message.setText("boxULx: " + this.boxULx + " boxULy: " + this.boxULy + " boxW: " + this.boxW + " boxH: " + this.boxH); this.view.repaint(); } @@ -254,6 +280,7 @@ public class MGuiRMI implements ActionListener, ChangeListener, MouseListener, M if (e.getButton() == MouseEvent.BUTTON1) { this.view.repaint(); + this.message.setText("Gesetzt: boxULx: " + this.boxULx + " boxULy: " + this.boxULy + " boxW: " + this.boxW + " boxH: " + this.boxH); } } @@ -272,7 +299,7 @@ public class MGuiRMI implements ActionListener, ChangeListener, MouseListener, M // process a new slider value public void stateChanged(ChangeEvent ce) { if (ce.getSource() == this.maxIterations) { - //System.out.println("Neuer Wert"); + // System.out.println("Neuer Wert"); this.nrIterations = this.maxIterations.getValue() * 1000; } }