06-EMMA-GUI Das EMMA-GUI. 06-EMMA-GUI 2 Aufteilung des Bildes (Applikation) Menü - Balken Dateiwerkzeuge Zeichenwerkzeuge Meldungen, Informationen, Fehler.

Slides:



Advertisements
Ähnliche Präsentationen
der Universität Oldenburg
Advertisements

DVG Dateien Dateien. DVG Dateien 2 Die Klasse File Die Klasse File stellt die Verbindung zwischen dem Filesystem des Rechners und dem.
DVG Einfache Klassen Einfache Klassen. DVG Einfache Klassen 2 Strukturen Beispiel: Personendaten bestehen aus –String name –String vorname.
Ein Beispiel in Java.
PKJ 2005/1 Stefan Dissmann Vorwoche - Klasse public class Studierende { private String name, vorname, studiengang; private int matNr, semester; private.
Java – Swing Vortrag von Raphaela Wrede und Anja Jentzsch
Ausnahmen HS Merseburg (FH) WS 06/07.
Java: Programmierung grafischer Oberflächen
Java: Reversi Spielbrett
Java: Objektorientierte Programmierung
Java2D Richard Göbel.
Java: Programmierung grafischer Oberflächen
Java: Dynamische Datentypen
Listen Richard Göbel.
Java: Referenzen und Zeichenketten
Java: Grundlagen der Objektorientierung
Wie überwacht man Objekte im "Alltag" ?. Indem man "Wanzen" an diese anbringt.
Ein Beispiel in Java.
Konstruktoren.
Benötigte Applets Startseite: in HTML-Format Applet auf der Startseite Das Applet, das auf der Startseite geladen wird, wird die vier Buttons und die eine.
Sommersemester 2003 Lars Bernard
Praktikum Entwicklung und Einsatz von Geosoftware I - Sitzung 7 User Interfaces in Java Sommersemester 2003 Lars Bernard.
Institut für Kartographie und Geoinformation Prof.-Dr. Lutz Plümer, Dr. Gerhard Gröger, Dipl.-Ing. Dirk Dörschlag Einführung in die Programmierung mit.
PKJ 2005/1 Stefan Dissmann Ausblick Es fehlen noch: Möglichkeiten zum Strukturieren größerer Programme Umgang mit variabler Zahl von Elementen Umgang mit.
PKJ 2005/1 Stefan Dissmann Rückblick auf 2005 Was zuletzt in 2005 vorgestellt wurde: Klassen mit Attributen, Methoden und Konstruktoren Referenzen auf.
1DVG3 - Eventbehandlung Eventbehandlung. DVG3 - Eventbehandlung 2 Events Events sind externe Ereignisse, die parallel zum normalen Programmablauf auftreten.
DVG3 - Bilder IMAGES (Bilder) Vortrag : Ronny Kuhnert am 9. November 1999.
1DVG3 - Paint Paint ein Zeichenprogramm. DVG3 - Paint 2 Paint – ein Zeichenprogramm.
1DVG3 - anonyme Klassen Anonyme Klassen. DVG3 - anonyme Klassen 2 Syntax new BasisKlasse(Parameterliste) { Modifikationen und Erweiterungen der Basisklasse.
UNDO & SELECT Vortrag : Martin Hiersche
DVG Dateien. DVG Die Klasse File Die Klasse File stellt die Verbindung zwischen dem File-System des Rechners und dem JAVA-Programm her.
DVG Kommentare1 Kommentare. DVG Kommentare 2 Kommentare Es gibt zwei Arten von Kommentaren: einzeilige Kommentare // der Kommentar geht.
DVG Einführung in Java1 Einführung in JAVA.
EDV Swing1 Swing. EDV Swing 2 Swing - AWT AWT passt sein L&F der Umgebung automatisch an. Swing kann sein L&F selbst verändern, auch zur.
07-GraphischeObjekte Graphische Objekte in EMMA301Paint.
SWING DVG Swing.
DVG Klassen und Objekte
DVG Einfache Klassen 1 Einfache Klassen. 2DVG Einfache KlassenStrukturen Beispiel: Personendaten bestehen aus String name String name.
EDV Parallelprogrammierung1 Parallelprogrammierung mit JAVA.
SWING DVG Swing.
03 - Paint Das Zeichenprogramm EMMA Paint2 Aufgabenstellung Entwicklung eines ausschließlich in JAVA programmierten Graphikprogrammes. Vergleichsprodukte:
12-Drucken Drucken in JAVA. 12-Drucken2 Probleme beim Drucken: Es können nur graphische Informationen gedruckt werden. Die zu druckende Information muss.
08-GraphikImplementierung Implementierung der Graphik in EMMA301Paint.
04 - Actions Actions Actions 2 Motivation In verschiedenen Swing-Komponenten werden ausgelöste Aktionen durch ActionListener behandelt. Häufig werden.
Klassen 02 - Klassen.
DVG Kommentare 1 Kommentare. 2 Kommentare Es gibt zwei Arten von Kommentaren: einzeilige Kommentare // der Kommentar geht bis zum Ende der Zeile.
DVG Graphik in Swing Graphik in Swing. DVG Graphik in Swing 2 Zeichnen von Objekten in Swing Die Klasse JComponent enthält die Methode.
DVG Swing SWING. DVG Swing 2 ColorChooser Die Klasse JColorChooser bietet eine komfortable Möglichkeit, Farben auszuwählen. Konstruktor:
05 - Reflection Das Reflection API Reflection2 Ziel Es kommt vor, dass eine Methode ein Objekt als Parameter übergeben bekommt, ohne dass bekannt.
Einführung in die Programmierung Datensammlung
© 2002 Dr. Cavelius - Ley - Pohlig - Taulien Step by step zum JFrame 1 Zum JFrame Step by step by step by step by step by step by step by step by.
© 2005 Pohlig GK Informatik K Zum JFrame Step by step by step by step by step by step by step by step by.
© 2006 MPohlig Grundkurs Informatik mit Java 1 JFrame-Vorlage Step by step by step by step by step by step by step by step by.
FH-Hof Java2D - Grundlagen Richard Göbel. FH-Hof Java2D - Funktionen Java2D unterstützt: das Zeichnen von Grafiken die Darstellung von Texten die Darstellung.
Seite 1 Interface - Konzept Ein Interface führt einen neuen Datentyp ein: interface Frau {... } Das Interface enthält Deklarationen ( keine Definitionen.
Sommersemester 2004 Jan Drewnak Entwicklung und Einsatz von Geosoftware I Praktikum Sitzung 7 Sitzung 7: User Interfaces in Java.
Objektorientierte Modellierung
PRJ 2007/1 Stefan Dissmann Verkettete datenstruktur: Liste Problem: Liste, die eine beliebige Zahl von Elementen verwaltet Operationen: Erzeugen, Anfügen,
Erste Schritte mit Eclipse Neues Projekt erstellen (1)
AWT und JFC Abstract Windowing Toolkit
Java: Programmierung grafischer Oberflächen
Javakurs FSS 2012 Lehrstuhl Stuckenschmidt
CuP - Java Elfte Vorlesung Montag, 11. November 2002.
Javakurs FSS 2012 Lehrstuhl Stuckenschmidt
Java-AG Benutzeroberflächen Juni 2001 Michael Haas.
© 2005 Pohlig Informatik Jg. 11 mfH Michael Pohlig 1 Zum JFrame Step by step by step by step by step by step by step by step by.
Java-Kurs Übung Benutzeroberflächen und Graphik Frames (Fenster)
Institut für Kartographie und Geoinformation Prof. Dr. L. Plümer, Dipl.-Ing. D. Dörschlag, Dr. G. Gröger Einführung in die Programmierung mit Java 13.
GUI Programmierung in Java Branimir Djordjevic. GUI - Wichtige Begriffe -  Die Swing-Bibliothek in Java stellt zum Beispiel die folgenden Windows zur.
Java-Kurs Übung Grafik in Java - das Abstract Windowing Toolkit
 Präsentation transkript:

06-EMMA-GUI Das EMMA-GUI

06-EMMA-GUI 2 Aufteilung des Bildes (Applikation) Menü - Balken Dateiwerkzeuge Zeichenwerkzeuge Meldungen, Informationen, Fehler Windows - Titel Gruppenwerkzeuge Bild

06-EMMA-GUI 3 Aufteilung des Bildes (Applet) Menü - Balken Dateiwerkzeuge Zeichenwerkzeuge Meldungen, Informationen, Fehler Gruppenwerkzeuge Bild

06-EMMA-GUI 4 Aufteilung des Bildes (int. Appli.) Menü - Balken Dateiwerkzeuge Zeichenwerkzeuge Meldungen, Informationen, Fehler Gruppenwerkzeuge Bild

06-EMMA-GUI 5 Menübalken ist extra, da er ggf. an eine umfassendere Applikation andocken muss. Die restlichen Komponenten werden innerhalb des contentFrames (JComponent) angeordnet. BorderLayout ist für EMMA gut geeignet. Im Zentrum muss ein JDesktopPane den virtuellen Desktop für die zu bearbeitenden Bilder bereitstellen. Die einzelnen Bilder werden in JInternalFrames geöffnet.

06-EMMA-GUI 6 Konstruktor private JDesktopPane desktopPane = new JDesktopPane(); public EMMA301Paint (Container parent, boolean createExitButton) { setLayout(new BorderLayout()); add(desktopPane, BorderLayout.CENTER); makeActions(parent, createExitButton); add(makeFileBar(createExitButton), BorderLayout.NORTH); add(makeToolsBar(), BorderLayout.WEST); add(makeStructurBar(), BorderLayout.EAST); add(makeMessageBar(), BorderLayout.SOUTH); makeMenuBar(parent, createExitButton); makePopupMenu(parent, createExitButton); }

06-EMMA-GUI 7 Parameter parent : Elternobjekt für die Komponente, die das Paint-Programm enthält. Bei dieser Komponente wird versucht. das Menü zu platzieren. Wenn null übergeben wird kann kein Menü erzeugt werden. createExitButton : gibt an, ob ein exit-Button erzeugt wird, der bei Betätigung das gesamte Programm beendet(System.exit(0)); Layout : BorderLayout ist gut geeignet für die Platzierung der Arbeitsfläche, sowie der Button-Leisten. DesktopPane wird in der Definition des Attributs desktopPane erzeugt und dem zentralen Feld der Komponente zugewiesen. Zur Definition der erforderlichen Actions wird die Methode createActions aufgerufen. Die benötigten Leisten werden mit entsprechenden Methoden erzeugt und den Randbereichen des Feldes zugeordnet. Das Menü und das Popupmenü werden erzeugt und platziert.

06-EMMA-GUI 8 makeActions private Action exitAction; private void makeActions (Container parent, boolean createExitButton) { if (createExitButton) { exitAction = new AbstractAction ("exit", EMMA301Utils.getImageIcon(parent, "pictures/exit.gif")) { { putValue(Action.SHORT_DESCRIPTION, "Beendet das Programm"); putValue(Action.MNEMONIC_KEY, new Integer('x')); } public void actionPerformed(ActionEvent e) { System.exit(0); } }; } }

06-EMMA-GUI 9 Die Actions werden als private globale Objekte definiert und in der Methode makeActions erzeugt. Zum Laden der Icons wird die Methode EMMA301Utils.getImageIcon benutzt. Innerhalb des Objektinitialisierungsblockes werden den Eigenschaften SHORT_DESCRIPTION und MNEMONIC_KEY passende Werte zugewiesen. Der Konstruktor weist die Eigenschaften NAME und SMALL_ICON zu. Die Methode actionPerformed wird implementiert.

06-EMMA-GUI 10 EMMA301Utils public final class EMMA301Utils { private EMMA301Utils() {} public static ImageIcon getImageIcon(Container parent, String fileName){ try { Class parentClass = parent.getClass(); Method getCodeBase = parentClass.getMethod("getCodeBase", new Class[]{}); URL url = (URL)(getCodeBase.invoke(parent, new Object[]{})); return new ImageIcon(new URL(url, fileName)); } catch (NoSuchMethodException nsme){return new ImageIcon(fileName); } catch (IllegalAccessException iae){} catch (InvocationTargetException ite){} catch (MalformedURLException mue){} catch (NullPointerException npe){ return new ImageIcon(fileName); } catch (Exception ex) {} return null; } }

06-EMMA-GUI 11 Die Klasse EMMA301Util besitzt einen private-Konstruktor und ist als final definiert, damit kein Objekt davon erzeugt und keine Klasse von ihr abgeleitet werden kann. Die Methode getImageIcon dient dem Laden von ImageIcons. Dabei wird unterschieden, ob die Applikation als Applet läuft (besitzt die Methode getCodeBase) oder als Applikation. Falls ein Fehler beim Laden auftritt, wird null zurückgegeben.

06-EMMA-GUI 12 createButton private JButton createButton(Action action) { JButton button = new JButton(action); if ( ((ImageIcon)(action.getValue(Action.SMALL_ICON))).getIconHeight()>0) button.setText(null); button.setMargin(new Insets(0,0,0,0)); return button; }

06-EMMA-GUI 13 createButton ist eine Hilfsmethode zur Erzeugung von Buttons mit bestimmten Eigenschaften. Es wird ein Button mit zugeordneter Action erzeugt. Wenn zu der Action ein Icon gehört, soll der Button keinen Text enthalten. Die Abstände zwischen dem Inhalt des Buttons und den Rändern werden auf 0 gesetzt.

06-EMMA-GUI 14 makeFileBar private JPanel makeFileBar(boolean createExitButton) { JPanel fileBar = new JPanel(); fileBar.setLayout (new BoxLayout(fileBar, BoxLayout.X_AXIS)); if (createExitButton) fileBar.add(createButton(exitAction)); return fileBar; }

06-EMMA-GUI 15 makeFileBar erzeugt die Button-Leiste an der Nord-Seite der Arbeitsfläche. Üblicherweise sind dort Buttons für Dateiarbeit, Drucken, Formate u.s.w. platziert. Da mehrere Buttons enthalten sein sollen empfiehlt sich ein JPanel mit BoxLayout in horizontaler Ausrichtung. Der exit-Button wird nur erzeugt, wenn der Schalter createExitButton true ist.

06-EMMA-GUI 16 makeMenuBar private void makeMenuBar(Container parent, boolean createExitButton) { try { Class parentClass = parent.getClass(); Method getJMenuBar = parentClass.getMethod("getJMenuBar", new Class[]{}); JMenuBar menuBar = (JMenuBar)(getJMenuBar.invoke(parent, new Object[]{})); if (menuBar==null) { menuBar = new JMenuBar(); Method setJMenuBar = parentClass.getMethod("setJMenuBar", new Class[]{JMenuBar.class}); setJMenuBar.invoke(parent, new Object[]{menuBar}); }

06-EMMA-GUI 17 JMenu fileMenu = new JMenu("file"); fileMenu.setMnemonic('f'); menuBar.add(fileMenu); if (createExitButton) fileMenu.add(new JMenuItem(exitAction)); } catch (NoSuchMethodException nsme){} catch (NullPointerException npe){} catch (IllegalAccessException iae){} catch (InvocationTargetException ite){} }

06-EMMA-GUI 18 makeMenuBar erzeugt den Menübalken. Zunächst wird die Klasse bestimmt zu der das Elternobjekt gehört. Es wird das Method-Objekt bestimmt das zu der Methode getJMenuBar gehört. Existiert diese Methode nicht, so wird die Ausnahme NoSuchMethodException ausgeworfen. Die Methode getJMenuBar wird aufgerufen um das aktuelle JMenuBar- Objekt des Elternobjektes bestimmt. Ist das JMenuBar-Objekt null, so existiert beim Elternobjekt noch kein JMenuBar und es wird ein neues erzeugt und dem Elternobjekt als JMenuBar zugeordnet. Es wird ein neues Menü erzeugt und dem JMenuBar hinzugefügt. Danach werden alle JMenuItems erzeugt und JMenus zugeordnet. Falls Ausnahmen auftreten, da z.B. das Elternobjekt die Methoden getJMenuBar bzw. setJMenuBar nicht besitzt wird kein Menü erzeugt und die Methode ohne Aktion verlassen.

06-EMMA-GUI 19 makePopupMenu private JPopupMenu popupMenu = new JPopupMenu(); private void makePopupMenu (Container parent, boolean createExitButton) { if (createExitButton) popupMenu.add( new JMenuItem(exitAction)); addMouseListener(new MouseAdapter(){ public void mousePressed(MouseEvent e) { maybeShowPopup(e); } public void mouseReleased(MouseEvent e) { maybeShowPopup(e); } private void maybeShowPopup(MouseEvent e) { if (e.isPopupTrigger()) popupMenu.show(e.getComponent(), e.getX(), e.getY()); } }); }

06-EMMA-GUI 20 makePopupMenu erzeugt das Popup-Menü. Popup-Menüs sind sehr ähnlich zu normalen Menüs. Sie werden von der Klasse JPopupMenu abgeleitet und enthalten durch die add-Methode hinzugefügt JMenuItems. Das Öffnen des Popup-Menüs wird über den MousListener gesteuert. Beim Drücken bzw. beim Loslassen einer Mouse-Taste kann mit der Methode isPopupTrigger des MouseEvents festgestellt werden, ob das Popup-Menü geöffnet werden soll. Welche Taste bei welcher Betätigung das Popup-Menü öffnen soll, hängt von der Oberfläche (Motif, CDE, Metal) ab.

06-EMMA-GUI 21 JInternalFrames für Graphiken Es sollen mehrere Graphiken gleichzeitig geladen und bearbeitet werden können. Graphiken werden in JInternalFrame-Objekten bearbeitet. Ein derartiges Frame beherbergt genau ein (ggf. komplexes) graphisches Objekt. Die paintComponent-Methode des ContentPanes muss das graphische Objekte darstellen.

06-EMMA-GUI 22 EMMA301PaintFrame class EMMA301PaintFrame extends JInternalFrame { private static final int deltx = 20; private static final int delty = 20; private static int internalFrameNumber = 0; private GraphicalObject graphicalObject = null; public EMMA301PaintFrame(JDesktopPane desktop) { this(desktop, "Noname #"+(++internalFrameNumber)); } public EMMA301PaintFrame(JDesktopPane desktop, String title) { super(title); setPreferredSize(new Dimension(200,200)); setClosable(true); setIconifiable(true); setMaximizable(true); setResizable(true); int posx = deltx*((internalFrameNumber-1)/20+ (internalFrameNumber-1)%20); int posy = delty*((internalFrameNumber-1)%20); setLocation(posx, posy);

06-EMMA-GUI 23 setContentPane(new JPanel() { public void paintComponent(Graphics g) { super.paintComponent(g); paintGraphics((Graphics2D)g); } }); getContentPane().setBackground(Color.yellow); pack(); desktop.add(this); setVisible(true); } public void paintGraphics (Graphics2D g) { if (graphicalObject != null) graphicalObject.paint(g); } }

06-EMMA-GUI 24 posx und posy enthalten die Koordinaten der linken oberen Ecke des zu öffnenden Frames. deltx und delty die Änderungen von posx bzw. posy zwischen zwei Fenstern. internalFrameNumber zählt die geöffneten internen Frames. graphicalObject speichert das graphische Objekt, das in diesem Frame bearbeitet werden soll.

06-EMMA-GUI 25 Datei öffnen Beim Öffnen einer Datei muss zunächst die Datei mit einem FileChooser ausgewählt werden. Für den FileChooser muss ein geeigneter Filter definiert werden. FileFilter vergleichen meistens ein Muster (Pattern) mit dem Filenamen um zu entscheiden ob das File akzeptiert werden soll. Dabei werden ? als ein beliebiges Zeichen und * als eine beliebige Zahl beliebiger Zeichen interpretiert.

06-EMMA-GUI 26 public static boolean searchPattern (String pattern, String text) { return searchPattern(pattern, 0, text, 0); } public static boolean searchPattern (String pattern, int ip, String text, int it) { if (ip>=pattern.length() && it>=text.length()) return true; if (ip>=pattern.length()) return false; if (it>=text.length()) { if (pattern.charAt(ip)=='*') return searchPattern(pattern, ip+1, text, it); return false; }

06-EMMA-GUI 27 if (pattern.charAt(ip)=='?') return searchPattern(pattern, ip+1, text, it+1); if (pattern.charAt(ip)=='*') { for (int i=it;i<=text.length();i++) if (searchPattern(pattern, ip+1, text, i)) return true; return false; } if (pattern.charAt(ip)!=text.charAt(it)) return false; return searchPattern(pattern, ip+1, text, it+1); }

06-EMMA-GUI 28 makeFileFilter public static javax.swing.filechooser.FileFilter makeFileFilter(String description, String [] pattern) { final String [] p = pattern; final String d = description; return new javax.swing.filechooser.FileFilter() { private String [] pat = p; public boolean accept(File file) { if (file.isDirectory()) return true; for (int i=0;i<pat.length;i++) if (searchPattern (pat[i].toUpperCase(), file.getName().toUpperCase())) return true; return false; } public String getDescription() { String des=d+" ("+pat[0]; for (int i=1;i<pat.length;i++) des+=", "+pat[i]; return des+")"; } }; }

06-EMMA-GUI 29 openAction openAction = new AbstractAction ("open", EMMA301Utils.getImageIcon(parent, "pictures/open.gif")){ { putValue(Action.SHORT_DESCRIPTION, "Öffnet eine Datei in einem neuen Fester"); putValue(Action.MNEMONIC_KEY, new Integer('o')); } public void actionPerformed(ActionEvent e) { JFileChooser fileChooser = new JFileChooser(currentDirectory); fileChooser.setAcceptAllFileFilterUsed(false); javax.swing.filechooser.FileFilter ff = EMMA301Utils.makeFileFilter( "EMMA301 Paint", new String[]{"*.emp"}); fileChooser.addChoosableFileFilter(ff); fileChooser.addChoosableFileFilter( EMMA301Utils.makeFileFilter( "EMMA301", new String[]{"*.em*"}));

06-EMMA-GUI 30 fileChooser.addChoosableFileFilter( EMMA301Utils.makeFileFilter( "Pictures", new String[]{"*.jpg", "*.gif", "*.png"})); fileChooser.setAcceptAllFileFilterUsed(true); fileChooser.setFileFilter(ff); if (fileChooser.showOpenDialog(emmaComponent) == JFileChooser.APPROVE_OPTION ) { File openFile = fileChooser.getSelectedFile(); currentDirectory = fileChooser.getCurrentDirectory(); new EMMA301PaintFrame(desktopPane, openFile.getName()); } }};

06-EMMA-GUI 31 Farbe auswählen Zur Auswahl von Farben gibt es die Klasse JColorChooser.

06-EMMA-GUI 32 colorAction colorAction = new AbstractAction( "color", EMMA301Utils.getImageIcon( parent, "pictures/color.gif")){ { putValue(Action.SHORT_DESCRIPTION, "Farbauswahl"); putValue(Action.MNEMONIC_KEY, new Integer('c')); } public void actionPerformed(ActionEvent e) { JColorChooser colorChooser = new JColorChooser(); Color newColor = colorChooser.showDialog( desktopPane, "Farbauswahl", activeColor); if (newColor != null) activeColor=newColor; }};

06-EMMA-GUI 33 Allgemeine Action Klasse private class Action extends AbstractAction { private int typ; Action(Container parent, int typ, String name, String iconFile, String description, char mnemonic) { putValue(NAME, name); putValue(SMALL_ICON, EMMA301Utils.getImageIcon(parent, iconFile)); putValue(SHORT_DESCRIPTION, description); putValue(MNEMONIC_KEY, new Integer(mnemonic)); this.typ=typ; } public void actionPerformed(ActionEvent e) { switch (typ) { case 1: System.exit(0); case 2: new EMMA301PaintFrame(desktopPane); break;

06-EMMA-GUI 34 case 3: JFileChooser fileChooser = new JFileChooser(currentDirectory); fileChooser.setAcceptAllFileFilterUsed(false); javax.swing.filechooser.FileFilter ff = EMMA301Utils.makeFileFilter("EMMA301 Paint", new String[]{"*.emp"}); fileChooser.addChoosableFileFilter(ff); fileChooser.addChoosableFileFilter( EMMA301Utils.makeFileFilter("EMMA301", new String[]{"*.em*"})); fileChooser.addChoosableFileFilter(EMMA301Utils.makeFileFilter ("Pictures", new String[]{"*.jpg", "*.gif", "*.png"})); fileChooser.setAcceptAllFileFilterUsed(true); fileChooser.setFileFilter(ff); if (fileChooser.showOpenDialog(emmaComponent)==JFileChooser.APPROVE_OPTION ) { File openFile = fileChooser.getSelectedFile(); currentDirectory = fileChooser.getCurrentDirectory(); new EMMA301PaintFrame(desktopPane, openFile.getName()); } break; case 4: Color newColor = new JColorChooser().showDialog(emmaComponent, "Farbauswahl", activeColor); if (newColor != null) activeColor=newColor; break;

06-EMMA-GUI 35 case 5: JOptionPane.showMessageDialog (emmaComponent, EMMA301Utils.getInfos(), EMMA301Paint.DESCRIPTION, JOptionPane.PLAIN_MESSAGE); break; case 6: activeFont=FontChooser.showDialog(emmaComponent, activeFont); break; case 7: activeStroke= BasicStrokeChooser.showDialog(emmaComponent, activeStroke); break; case 8: activePaint=PaintChooser.showDialog(emmaComponent, activePaint); break; default: JOptionPane.showMessageDialog(emmaComponent, "Action Nr. "+typ+" unknown!", "Error", OptionPane.ERROR_MESSAGE); } } }

06-EMMA-GUI 36 FontChooser

06-EMMA-GUI 37 public static Font showDialog(Component parent, Font font) { ChooserPanel cp = new ChooserPanel(font); int ret = JOptionPane.showConfirmDialog(parent, cp, "FontChooser", JOptionPane.OK_CANCEL_OPTION, JOptionPane.PLAIN_MESSAGE, null); if (ret==JOptionPane.OK_OPTION) return cp.getNewFont(); return font; } Problem: Vorschaufenster Wird als interne Klasse ChooserPanel extends JPanel implementiert.

06-EMMA-GUI 38 Layout : GridBagLayout Fontauswahl: JComboBox private JComboBox fontCB; GraphicsEnvironment ge = GraphicsEnvironment.getLocalGraphicsEnvironment(); String [] fn = ge.getAvailableFontFamilyNames(); fontCB = new JComboBox(fn); fontCB.setSelectedItem(fontName); fontCB.addActionListener(this); fontCB.setEditable(false);

06-EMMA-GUI 39 Verknüpfung zwischen dem JTextField und JScrollBar für die Auswahl der Größe. private JTextField sizeTF; private JScrollBar sizeSB; sizeTF = new JTextField(""+font.getSize()); sizeTF.addActionListener(this); sizeSB = new JScrollBar(JScrollBar.HORIZONTAL, font.getSize(), 1, 1, 201); sizeSB.addAdjustmentListener(this);

06-EMMA-GUI 40 public void actionPerformed(ActionEvent e) { Object src = e.getSource(); if (src == sizeTF ) { int s=Integer.parseInt(sizeTF.getText()); sizeSB.setValue(s); makeFont(fontName, style, s); } } public void adjustmentValueChanged(AdjustmentEvent e) { int s = sizeSB.getValue(); sizeTF.setText(""+s); makeFont(fontName, style, s); }

06-EMMA-GUI 41 Vorschaubild als in ein JScrollPane eingebettetes JPanel JScrollPane sp = new JScrollPane(new JPanel(){ { setPreferredSize(new Dimension(8000,2000)); setBackground(Color.white); } public void paintComponent(Graphics g) { super.paintComponent(g); p(g); } }); sp.setPreferredSize(new Dimension(600,400));

06-EMMA-GUI 42 public void p(Graphics g) { g.setFont(font); g.drawString(fontName, 20, 2*size); for (int i=0;i<8;i++) for (int j=0;j<32;j++) g.drawString (""+(char)(i*32+j),20+j*size,(i+4)*(size+5)); }