{"id":520,"date":"2018-11-15T14:04:12","date_gmt":"2018-11-15T13:04:12","guid":{"rendered":"https:\/\/freizone.net\/java-einfach-lernen\/?p=520"},"modified":"2020-05-11T19:29:40","modified_gmt":"2020-05-11T17:29:40","slug":"verschoenerungen-i","status":"publish","type":"post","link":"https:\/\/freizone.net\/java-einfach-lernen\/2018\/11\/15\/verschoenerungen-i\/","title":{"rendered":"Versch\u00f6nerungen I"},"content":{"rendered":"<p>Nun haben wir die erste Version unseres Zeichenprogramm fast fertig. Was noch fehlt sind ein paar Optimierungen die das ganze professioneller aussehen lassen.<\/p>\n<p>Anfangen wollen wir mit den beiden Radio-Buttons kreisBtn und quadratBtn. Aus diesen k\u00f6nnen wir, \u00e4hnlich wie pinselBtn und radiererBtn jeweils JToggleButtons daraus machen und in der actionPerformed daf\u00fcr sorgen das sie sich wie Radiobuttons verhalten.<br \/>\nZuerst deklarieren wir die JRadioButtons in JToggleButtons um:<\/p>\n<pre class=\"EnlighterJSRAW\" data-enlighter-language=\"null\">JToggleButton kreisBtn;\r\nJToggleButton quadratBtn;<\/pre>\n<p>dann l\u00f6schen wir die JButtonGroup werkzeugspitzen da wir sie nicht mehr ben\u00f6tigen.<\/p>\n<p>danach setzen wir als Text in den JToggleButtons das entsprechende Unicodezeichen f\u00fcr Kreis (\\u25cf) und leerer Kreis (\\u25cf) ein und f\u00fcgen den ActionListener hinzu:<\/p>\n<pre class=\"EnlighterJSRAW\" data-enlighter-language=\"null\">kreisBtn = new JToggleButton(\"\\u25cf\");\r\nkreisBtn.addActionListener( this );\r\nkreisBtn.setSelected(true);\r\nkreisBtn.setFocusPainted(false);\r\nquadratBtn = new JToggleButton(\"\\u25a0\");\r\nquadratBtn.addActionListener( this );\r\nquadratBtn.setFocusPainted(false);<\/pre>\n<p>setFocusPainted() bewirkt das der Kreis bzw. das Quadrat nicht von einer gepunkteten grauen &#8222;Focus-Linie&#8220; umrandet ist.<br \/>\nBei den Variablen f\u00fcgen wir noch ein\u00a0<code> static Charset       UTF_8;<\/code> ein, damit die Unicodezeichen auch auf allen Systemen korrekt dargestellt werden.<\/p>\n<p>Und schlie\u00dflich erweitern wir die actionPerformed um folgenden Code:<\/p>\n<pre class=\"EnlighterJSRAW\" data-enlighter-language=\"null\">if ( source == kreisBtn ) {\r\n\tkreisBtn.setSelected(true);\r\n\tquadratBtn.setSelected( false );\r\n}\r\n\r\nif ( source == quadratBtn ) {\r\n\tquadratBtn.setSelected(true);\r\n\tkreisBtn.setSelected( false );\r\n}<\/pre>\n<p>Als n\u00e4chstes wollen wir richtige Icons verwenden.<\/p>\n<p>Die neue StartFenster.java w\u00fcrde also so aussehen:<\/p>\n<pre class=\"EnlighterJSRAW\" data-enlighter-language=\"null\">package miniMalprogramm;\r\n\r\nimport java.awt.BorderLayout;\r\nimport java.awt.Color;\r\nimport java.awt.Component;\r\nimport java.awt.Dimension;\r\nimport java.awt.Graphics;\r\nimport java.awt.Graphics2D;\r\nimport java.awt.Insets;\r\nimport java.awt.event.ActionEvent;\r\nimport java.awt.event.ActionListener;\r\nimport java.awt.image.BufferedImage;\r\nimport java.io.File;\r\nimport java.io.IOException;\r\nimport java.nio.charset.Charset;\r\n\r\nimport javax.imageio.ImageIO;\r\nimport javax.swing.BorderFactory;\r\nimport javax.swing.JButton;\r\nimport javax.swing.JCheckBox;\r\nimport javax.swing.JColorChooser;\r\nimport javax.swing.JFileChooser;\r\nimport javax.swing.JFrame;\r\nimport javax.swing.JMenu;\r\nimport javax.swing.JMenuBar;\r\nimport javax.swing.JMenuItem;\r\nimport javax.swing.JSeparator;\r\nimport javax.swing.JSpinner;\r\nimport javax.swing.JToggleButton;\r\nimport javax.swing.JToolBar;\r\nimport javax.swing.SpinnerNumberModel;\r\n\r\npublic class StartFenster extends JFrame implements ActionListener {\r\n  public static void main(String[] s) {\r\n    new StartFenster();\r\n  }\r\n\r\n  static Charset UTF_8;\r\n\r\n  Tafel tafel;\r\n  private JMenuBar menuBar;\r\n  private JMenu menuDatei;\r\n  private JMenuItem mneu, mladen, mspeichern, mBeenden;\r\n\r\n  private JToolBar auswahl;\r\n  private JToolBar seitenleiste;\r\n\r\n  JToggleButton kreisBtn;\r\n  JToggleButton quadratBtn;\r\n  JCheckBox fuellen;\r\n  JSpinner linienstaerke;\r\n  JToggleButton pinselBtn;\r\n  JToggleButton radiererBtn;\r\n  private JButton farbwaehlerIcon;\r\n  private JButton farbwaehlerIconHG;\r\n\r\n  Color vgfarbe = Color.BLACK;\r\n  Color hgfarbe = Color.WHITE;\r\n  Color aktuelleFarbe = Color.BLACK;\r\n\r\n  public StartFenster() {\r\n    initialisiereStartFenster();\r\n  }\r\n\r\n  private void initialisiereStartFenster() {\r\n    this.setDefaultCloseOperation(EXIT_ON_CLOSE);\r\n    this.setBounds(0, 0, 500, 500);\r\n    this.setLocationRelativeTo(null);\r\n    this.setAlwaysOnTop(true);\r\n    this.setBackground(Color.white);\r\n    this.setTitle(\"Tafel\");\r\n    this.setLayout(new BorderLayout());\r\n\r\n    menuBar = new JMenuBar();\r\n    this.setJMenuBar(menuBar);\r\n    menuDatei = new JMenu();\r\n    menuDatei.setText(\"Datei\");\r\n    menuDatei.setMnemonic('d'); \/\/ setzt Tastaturk\u00fcrzel Alt+d\r\n    menuDatei.addActionListener(this);\r\n    menuBar.add(menuDatei);\r\n    mneu = new JMenuItem();\r\n    mneu.setText(\"Neu\");\r\n    mneu.setMnemonic('n');\r\n    mneu.setToolTipText(\"Neues Bild erstellen\");\r\n    mneu.addActionListener(this);\r\n    menuDatei.add(mneu);\r\n    JSeparator sep1 = new JSeparator();\r\n    menuDatei.add(sep1);\r\n    mladen = new JMenuItem();\r\n    mladen.setText(\"Laden\");\r\n    mladen.setMnemonic('l');\r\n    mladen.setToolTipText(\"Datei laden\");\r\n    mladen.addActionListener(this);\r\n    menuDatei.add(mladen);\r\n    mspeichern = new JMenuItem();\r\n    mspeichern.setText(\"Speichern\");\r\n    mspeichern.setMnemonic('s');\r\n    mspeichern.setToolTipText(\"Bild speichern\");\r\n    mspeichern.addActionListener(this);\r\n    menuDatei.add(mspeichern);\r\n    JSeparator sep2 = new JSeparator();\r\n    menuDatei.add(sep2);\r\n    mBeenden = new JMenuItem();\r\n    mBeenden.setText(\"Beenden\");\r\n    mBeenden.setMnemonic('e');\r\n    mBeenden.setToolTipText(\"Programm beenden\");\r\n    mBeenden.addActionListener(this);\r\n    menuDatei.add(mBeenden);\r\n\r\n    auswahl = new JToolBar();\r\n    auswahl.setPreferredSize(new Dimension(300, 30)); \/\/ PreferredSize = bevorzugte Gr\u00f6\u00dfe\r\n    auswahl.setFloatable(false);\r\n\r\n    kreisBtn = new JToggleButton(\"\\u25cf\");\r\n    kreisBtn.addActionListener(this);\r\n    kreisBtn.setSelected(true);\r\n    kreisBtn.setFocusPainted(false);\r\n    quadratBtn = new JToggleButton(\"\\u25a0\");\r\n    quadratBtn.addActionListener(this);\r\n    quadratBtn.setFocusPainted(false);\r\n\r\n    auswahl.add(kreisBtn);\r\n    auswahl.add(quadratBtn);\r\n\r\n    fuellen = new JCheckBox(\"F\u00fcllen\");\r\n    auswahl.add(fuellen);\r\n\r\n    seitenleiste = new JToolBar();\r\n    seitenleiste.setPreferredSize(new Dimension(30, 200)); \/\/ PreferredSize = bevorzugte Gr\u00f6\u00dfe\r\n    seitenleiste.setFloatable(false);\r\n    seitenleiste.setOrientation(JToolBar.VERTICAL);\r\n    Insets nullMargin = new Insets(5, 7, 5, 5);\r\n    seitenleiste.setMargin(nullMargin);\r\n\r\n    pinselBtn = new JToggleButton(\"P\");\r\n    pinselBtn.setPreferredSize(new Dimension(20, 20));\r\n    pinselBtn.setSelected(true);\r\n    pinselBtn.setAlignmentX(CENTER_ALIGNMENT);\r\n    pinselBtn.setBorder(BorderFactory.createEmptyBorder(0, 0, 0, 0));\r\n    pinselBtn.setSelected(true);\r\n    pinselBtn.addActionListener(this);\r\n    radiererBtn = new JToggleButton(\"R\");\r\n    radiererBtn.setPreferredSize(new Dimension(20, 20));\r\n    radiererBtn.setSelected(false);\r\n    radiererBtn.setAlignmentX(CENTER_ALIGNMENT);\r\n    radiererBtn.setBorder(BorderFactory.createEmptyBorder(0, 0, 0, 0));\r\n    radiererBtn.addActionListener(this);\r\n\r\n    farbwaehlerIcon = new JButton() {\r\n      public void paintComponent(Graphics g) {\r\n        super.paintComponent(g);\r\n        g.setColor(vgfarbe);\r\n        g.fillRect(20, 20, 20, 20);\r\n      }\r\n    };\r\n    farbwaehlerIcon.setPreferredSize(new Dimension(20, 20));\r\n    farbwaehlerIcon.addActionListener(this);\r\n    farbwaehlerIcon.setBackground(vgfarbe);\r\n    farbwaehlerIcon.setForeground(vgfarbe);\r\n    farbwaehlerIcon.setAlignmentX(CENTER_ALIGNMENT);\r\n\r\n    farbwaehlerIconHG = new JButton() {\r\n      public void paintComponent(Graphics g) {\r\n        super.paintComponent(g);\r\n        g.setColor(hgfarbe);\r\n        g.fillRect(20, 20, 20, 20);\r\n      }\r\n    };\r\n    farbwaehlerIconHG.setPreferredSize(new Dimension(20, 20));\r\n    farbwaehlerIconHG.addActionListener(this);\r\n    farbwaehlerIconHG.setBackground(hgfarbe);\r\n    farbwaehlerIconHG.setForeground(hgfarbe);\r\n    farbwaehlerIconHG.setAlignmentX(CENTER_ALIGNMENT);\r\n    seitenleiste.add(pinselBtn);\r\n    seitenleiste.add(radiererBtn);\r\n    seitenleiste.addSeparator();\r\n    seitenleiste.add(farbwaehlerIcon);\r\n    seitenleiste.add(farbwaehlerIconHG);\r\n    SpinnerNumberModel nummern = new SpinnerNumberModel(10.0, 1.0, 99.0, 1.0); \/\/ default, Minimum, Maximum,\r\n                                          \/\/ Schrittweite\r\n    linienstaerke = new JSpinner(nummern);\r\n    linienstaerke.setMinimumSize(new Dimension(50, 30)); \/\/ setzt die Mindestgr\u00f6\u00dfe ( Breite, H\u00f6he )\r\n    linienstaerke.setMaximumSize(new Dimension(50, 30)); \/\/ setzt die Maximalgr\u00f6\u00dfe\r\n    auswahl.add(linienstaerke);\r\n    this.add(auswahl, BorderLayout.PAGE_START);\r\n    this.add(seitenleiste, BorderLayout.WEST);\r\n\r\n    tafel = new Tafel(this);\r\n    this.add(tafel);\r\n    sichtbar();\r\n  }\r\n\r\n  private void sichtbar() {\r\n    this.setVisible(true);\r\n  }\r\n\r\n  public double getLinienstaerke() {\r\n    double staerke = (double) this.linienstaerke.getValue();\r\n    return staerke;\r\n  }\r\n\r\n  public Color getFarbe() {\r\n    return this.aktuelleFarbe;\r\n  }\r\n\r\n  @Override\r\n  public void actionPerformed(ActionEvent e) {\r\n    Object source = e.getSource();\r\n    if (source == kreisBtn) {\r\n      kreisBtn.setSelected(true);\r\n      quadratBtn.setSelected(false);\r\n    }\r\n\r\n    if (source == quadratBtn) {\r\n      quadratBtn.setSelected(true);\r\n      kreisBtn.setSelected(false);\r\n    }\r\n\r\n    if (source == farbwaehlerIcon) {\r\n      vgfarbe = JColorChooser.showDialog(this, \"Vordergrundfarbe w\u00e4hlen\", vgfarbe);\r\n      farbwaehlerIcon.setBackground(vgfarbe);\r\n      aktuelleFarbe = vgfarbe;\r\n      farbwaehlerIcon.repaint();\r\n    } else if (source == farbwaehlerIconHG) {\r\n      hgfarbe = JColorChooser.showDialog(this, \"Hintergrundfarbe w\u00e4hlen\", vgfarbe);\r\n      farbwaehlerIconHG.setBackground(hgfarbe);\r\n      aktuelleFarbe = hgfarbe;\r\n      farbwaehlerIconHG.repaint();\r\n    }\r\n    if (source == pinselBtn) {\r\n      pinselBtn.setSelected(true);\r\n      radiererBtn.setSelected(false);\r\n      aktuelleFarbe = vgfarbe;\r\n    }\r\n    if (source == radiererBtn) {\r\n      radiererBtn.setSelected(true);\r\n      pinselBtn.setSelected(false);\r\n      aktuelleFarbe = hgfarbe;\r\n    }\r\n    if (source == mneu)\r\n      tafel.neuesBild();\r\n\r\n    if (source == mladen)\r\n      loadPicture();\r\n\r\n    if (source == mspeichern)\r\n      savePicture(erstelleIMG(tafel));\r\n\r\n    if (source == mBeenden)\r\n      this.dispose();\r\n\r\n  }\r\n\r\n  public BufferedImage erstelleIMG(Component bild) \/\/ gibt ein img der zeichenfl\u00e4che an die Funktion savePicture\r\n                            \/\/ zur\u00fcck\r\n  {\r\n    BufferedImage img = new BufferedImage(bild.getWidth(), bild.getHeight(), BufferedImage.TYPE_INT_RGB);\r\n    Graphics2D g = img.createGraphics();\r\n    bild.paintAll(g);\r\n    g.dispose();\r\n    return img;\r\n  }\r\n\r\n  private void loadPicture() {\r\n    JFileChooser chooser = new JFileChooser();\r\n    chooser.setDialogType(JFileChooser.OPEN_DIALOG);\r\n\r\n    int rueckgabeWert = chooser.showOpenDialog(this);\r\n\r\n    if (rueckgabeWert == JFileChooser.APPROVE_OPTION) {\r\n      File file = chooser.getSelectedFile();\r\n      try {\r\n        tafel.image = ImageIO.read(file);\r\n      } catch (IOException e) {\r\n        e.printStackTrace();\r\n      }\r\n      tafel.bildGeladen = true;\r\n      tafel.repaint();\r\n    }\r\n\r\n  }\r\n\r\n  public void savePicture(BufferedImage img) \/\/\r\n  {\r\n    JFileChooser chooser = new JFileChooser();\r\n    chooser.setDialogType(JFileChooser.SAVE_DIALOG);\r\n\r\n    int rueckgabeWert = chooser.showSaveDialog(this);\r\n\r\n    if (rueckgabeWert == JFileChooser.APPROVE_OPTION) {\r\n      File file = chooser.getSelectedFile();\r\n      try {\r\n        ImageIO.write(img, \"png\", file);\r\n      } catch (IOException e) {\r\n        e.printStackTrace();\r\n      }\r\n    }\r\n  }\r\n\r\n  public void dispose() {\r\n    System.out.println(\"Tsch\u00fc\u00df\");\r\n    System.exit(0);\r\n  }\r\n}<\/pre>\n<p>&nbsp;<\/p>\n","protected":false},"excerpt":{"rendered":"<p>Nun haben wir die erste Version unseres Zeichenprogramm fast fertig. Was noch fehlt sind ein paar Optimierungen die das ganze professioneller aussehen lassen. Anfangen wollen wir mit den beiden Radio-Buttons kreisBtn und quadratBtn. Aus diesen k\u00f6nnen wir, \u00e4hnlich wie pinselBtn und radiererBtn jeweils JToggleButtons daraus machen und in der actionPerformed daf\u00fcr sorgen das sie sich [&hellip;]<\/p>\n","protected":false},"author":1,"featured_media":0,"comment_status":"closed","ping_status":"open","sticky":false,"template":"","format":"standard","meta":[],"categories":[1],"tags":[],"_links":{"self":[{"href":"https:\/\/freizone.net\/java-einfach-lernen\/wp-json\/wp\/v2\/posts\/520"}],"collection":[{"href":"https:\/\/freizone.net\/java-einfach-lernen\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/freizone.net\/java-einfach-lernen\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/freizone.net\/java-einfach-lernen\/wp-json\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/freizone.net\/java-einfach-lernen\/wp-json\/wp\/v2\/comments?post=520"}],"version-history":[{"count":4,"href":"https:\/\/freizone.net\/java-einfach-lernen\/wp-json\/wp\/v2\/posts\/520\/revisions"}],"predecessor-version":[{"id":587,"href":"https:\/\/freizone.net\/java-einfach-lernen\/wp-json\/wp\/v2\/posts\/520\/revisions\/587"}],"wp:attachment":[{"href":"https:\/\/freizone.net\/java-einfach-lernen\/wp-json\/wp\/v2\/media?parent=520"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/freizone.net\/java-einfach-lernen\/wp-json\/wp\/v2\/categories?post=520"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/freizone.net\/java-einfach-lernen\/wp-json\/wp\/v2\/tags?post=520"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}