Grafikprogrammierung
 GUIs mit Java 
      
      
        Thorsten Thormählen 
 21. Oktober 2019 
 Teil 2, Kapitel 2
      
        Thorsten Thormählen 
 21. Oktober 2019 
 Teil 2, Kapitel 2
      
            Dies ist die Druck-Ansicht. 
            
             
          
            Weiterschalten der Folien durch die → Taste oder 
 durch das Klicken auf den rechten Folienrand. 
 
             
          
Das Weiterschalten der Folien kann ebenfalls durch das Klicken auf den rechten bzw. linken Folienrand erfolgen.
| API | Funktion | 
|---|---|
| Abstract Window Toolkit (AWT) | Basisklassen für GUI-Komponenten, Events und Layouts | 
| Swing | GUI-Komponenten, veränderbarer Look-and-Feel | 
| Java 2D | Zeichnen von 2D-Elementen | 
| Java Accessibility | Unterstützungstechnologien z.B. für Mensch mit Sehbehinderung | 
| Data Transfer | Cut-and-Paste, Drag-and-Drop | 
javac sourcefile.java
java sourcefile
JFrame als Top-Level-Container
          JLabel
        Quelltext des Beispiels: HelloGUI.java
import javax.swing.*;
class MyGui extends JFrame { // Klasse mit eigenen GUI Komponenten
  ...
}
public class HelloGUI {
  public static void main(String[] args) {
    javax.swing.SwingUtilities.invokeLater(new Runnable() {
      public void run() {
        MyGui myGUI = new MyGui(); // Instanzierung der eigenen Klasse
        myGUI.createGUI();         // im Event Dispatching Thread 
      }
    });
  }
}
      
import javax.swing.*;
class MyGui extends JFrame {
  public void createGUI() {
    setTitle("HelloGUI");
    setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
    setSize(320, 240);
    JLabel label = new JLabel("Hello World");
    getContentPane().add(label);
    setVisible(true);
  }
}
public class HelloGUI {
  ...
}
      
class MyGui extends JFrame {
  public void createGUI() {
    ...
    JMenuBar menuBar = new JMenuBar();
    JMenu menu = new JMenu("File");
    menuBar.add(menu);
    JMenuItem item = new JMenuItem("Open");
    menu.add(item);
    setJMenuBar(menuBar);
    setVisible(true);
  }
}
      
class MyGui extends JFrame {
  public void createGUI() {
    ...
    setLayout(null); // keine automatisches Layout
   
    JLabel label = new JLabel("Hello World");
    label.setBounds(120, 0, 150, 30); // manuelles Positionieren
    getContentPane().add(label);
    
    JButton button = new JButton("Button Text");
    button.setBounds(120, 30, 150, 30);
    getContentPane().add(button);
    ...
  }
}
      
        
        
        AbstractButton
        
public class ActionEvent extends AWTEvent
{
  // constructors
  public ActionEvent(Object source, int id, String command) { ... }
  ...
  // public members
  public String getActionCommand() { ... } 
  public long getWhen() { ... } 
  public int getModifiers() { ... } 
  public String paramString() { ... }
}
      
        ActionListener
        
public interface ActionListener extends EventListener {
  void actionPerformed(ActionEvent event);
}
        AbstractButton
        
public abstract class AbstractButton extends ... {
  ...
  public void addActionListener(ActionListener l) {... }
  public void removeActionListener(ActionListener l) {... }
  public ActionListener[] getActionListeners() {... }
  ...
}
      
        Quelltext des Beispiels: ActionButton
class MyGui extends JFrame implements ActionListener{
  private int counter = 0;
  JLabel label = new JLabel("Hello World");
  
  public void createGUI() {
    ...
    JButton button = new JButton("Increment");
    button.addActionListener(this);
    getContentPane().add(button);
    ...
  }
  public void actionPerformed(ActionEvent event) {
    counter++;
    label.setText("Click #" + Integer.toString(counter));
  }
}
      
class MyGui extends JFrame implements ActionListener{
    ...
    JMenuItem item2 = new JMenuItem("Reset", KeyEvent.VK_R);
    item2.addActionListener(this);
    item2.setActionCommand("ResetCmd");
    menu.add(item2);
    setJMenuBar(menuBar);
    ...
  }
  
  public void actionPerformed(ActionEvent event) {
    counter++;
    if(event.getActionCommand().equals("ResetCmd") ) counter = 0;
    label.setText("Click #" + Integer.toString(counter));
  }
      
public class MouseEvent extends InputEvent {
  ... 
  public int getX() {...}
  public int getY() {...}
  public Point getPoint() {...}
  public int getButton() {...}
  public String paramString() {...}
  ...
}
        
public interface MouseListener extends EventListener {
  void mouseClicked(MouseEvent event);
  void mousePressed(MouseEvent event);
  void mouseReleased(MouseEvent event);
  void mouseEntered(MouseEvent event);
  void mouseExited(MouseEvent event);
}
      JFrame wird die Position des Mauszeigers ausgegeben
          
        Quelltext des Beispiels: MyMouseListener.java
class MyGuiMouseListener implements MouseListener {
  ...
}
class MyGui extends JFrame {
  public void createGUI() {
    ...
    JLabel label = new JLabel("Position: 0, 0");
    label.setBounds(120, 0, 150, 30);
    getContentPane().add(label);
    
    MyGuiMouseListener mouseListener = new MyGuiMouseListener();
    mouseListener.setLabelRef(label);
    addMouseListener(mouseListener);
    ...
  }
}
      
class MyGuiMouseListener implements MouseListener {
  private JLabel labelRef;
  public void setLabelRef(JLabel label) { labelRef= label; }
  
  public void mousePressed(MouseEvent event) {
    labelRef.setText("Position: " + Integer.toString(event.getX()) +
                     ", " + Integer.toString(event.getY()));
  }
  public void mouseClicked(MouseEvent event) {}
  public void mouseReleased(MouseEvent event){}
  public void mouseEntered(MouseEvent event) {}
  public void mouseExited(MouseEvent event) {}
}
       MouseListener) alle Methoden
            vorhanden sein, auch wenn diese nicht benötigt werden
          
class MyGuiMouseAdapter extends MouseAdapter {
  private JLabel labelRef;
  public void setLabelRef(JLabel label) { labelRef= label; }
  public void mousePressed(MouseEvent event) {
    labelRef.setText("Position: " + Integer.toString(event.getX()) +
                     ", " + Integer.toString(event.getY()));
  }
}
class MyGui extends JFrame {
  public void createGUI() {
    ...
    MyGuiMouseAdapter mouseAdapter = new MyGuiMouseAdapter();
    mouseAdapter.setLabelRef(label);
    addMouseListener(mouseAdapter);
  }
}
      
class MyGui extends JFrame {
  public void createGUI() {
    ...
    setLayout(null); // keine automatisches Layout
    setResizeable(false); // Fenstergröße ist nicht veränderbar
    
    JLabel label = new JLabel("Hello World");
    label.setBounds(120, 0, 150, 30); // manuelles Positionieren
    getContentPane().add(label);
  }
}
      
public interface LayoutManager {
  void addLayoutComponent(String name, Component component);
  void removeLayoutComponent(Component component);
  Dimension preferredLayoutSize(Container parent);
  Dimension minimumLayoutSize(Container parent);
  void layoutContainer(Container parent);
} 
      
        JFrame
        Quelltext des Beispiels: MyBorderLayout.java
class MyGui extends JFrame{
  public void createGUI() {
    ...
    Container contentPane = getContentPane();
    contentPane.setLayout(new BorderLayout(0,0));
    contentPane.add(BorderLayout.NORTH, new JButton("North"));
    contentPane.add(BorderLayout.EAST, new JButton("East"));
    contentPane.add(BorderLayout.SOUTH, new JButton("South"));
    contentPane.add(BorderLayout.WEST, new JButton("West"));
    contentPane.add(BorderLayout.CENTER, new JButton("Center"));
    
    setVisible(true);
  }
}
      
        
          
 Quelltext des Beispiels: MyGridLayout.java
        
class MyGui extends JFrame{
  public void createGUI() {
    ...
    Container contentPane = getContentPane();
    // 3 Zeilen mit Abstand 15, und 2 Spalten mit Abstand 5
    contentPane.setLayout(new GridLayout(3, 2, 5, 15));
    contentPane.add(new JButton("Button 1"));
    contentPane.add(new JButton("Button 2"));
    contentPane.add(new JButton("Button 3"));
    contentPane.add(new JButton("Button 4"));
    contentPane.add(new JButton("Button 5"));
    contentPane.add(new JButton("Button 6"));
    
    setVisible(true);
  }
}
      
          
 Quelltext des Beispiels: 
 MySpringLayout.java, SpringUtilities.java
        
public void createGUI() { ...
  String[] labels = {"Firstname: ", "Lastname: ", 
                     "Student ID: ", "Enrolled since: "};
  Container cp = getContentPane();
  cp.setLayout(new SpringLayout());
  for (int i = 0; i < labels.length; i++) {
    JLabel label = new JLabel(labels[i], JLabel.TRAILING);
    cp.add(label);
    JTextField textField = new JTextField(10);
    label.setLabelFor(textField);
    cp.add(textField);
  }
  SpringUtilities.makeCompactGrid(cp, labels.length, 2, 5, 5, 5, 5);
  pack(); // dense packing
  setVisible(true);
}
      JButton startet eine lange Berechnung
          JProgressBar angezeigt
          
        Quelltext des Beispiels: MyProgressBar.java
class MyGui extends JFrame implements ActionListener {
  final JProgressBar progressBar = new JProgressBar(0, 100);
  final JButton button = new JButton("Compute");
  boolean userStopped = false, threadAlive = false;
  int percent;
  Runnable updateUI = new Runnable() { ... }; // for UI update
  Runnable workerThread = new Runnable() { ... }; // for computation
  
  public void createGUI() {... }
  public void actionPerformed(ActionEvent event) { // button pressed
    if(!threadAlive) {
      threadAlive = true; userStopped = false;
      new Thread(workerThread).start(); 
    } 
    else userStopped = true;
  }
}
      
  Runnable workerThread = new Runnable() { // for computation
    public void run() {
      for (int i=0; i < 100 && !userStopped; i++) {
        try {
          Thread.sleep(50); // compute something here
          percent = i;
          // run updateUI in the Event Dispatching Thread
          SwingUtilities.invokeLater(updateUI); 
        } catch (InterruptedException e) {}
      }
      percent = 100;
      SwingUtilities.invokeLater(updateUI);
      threadAlive = false;
    }
  };
      
  Runnable updateUI = new Runnable() { // for UI update
    public void run() {
      if(percent < 100) {
        progressBar.setString("Computing " + percent + "%");
        button.setText("Stop");
      }else{
        progressBar.setString("Done");
        button.setText("Compute");
      }
      progressBar.setValue(percent);
    }
  };
      JFrame) modifiziert, indem deren paint() Methode überschrieben
            wird
          
        Quelltext des Beispiels: LineRectCircle.java
class MyGui extends JFrame {
  public void createGUI() {...}
  public void paint(Graphics g) {
    super.paint(g);
    Graphics2D g2d = (Graphics2D) g; // cast to Graphics2D
    Line2D.Double line = new Line2D.Double(20.0, 50.0, 
                                           50.0, 200.0);
    g2d.draw(line); 
    Rectangle2D.Double rect = new Rectangle2D.Double(100.0, 50.0, 
                                                      60.0, 80.0);
    g2d.draw(rect); // also try g2d.fill(rect);
    Ellipse2D.Double circle = new Ellipse2D.Double(200.0, 100.0, 
                                                   80.0, 80.0);
    g2d.draw(circle); // also try g2d.fill(circle); 
  }
}
      GeneralPath Klasse
          
        Quelltext des Beispiels: MyGeneralPath.java
  public void paint(Graphics g) {
    super.paint(g);
    Graphics2D g2d = (Graphics2D) g; // cast to Graphics2D
    GeneralPath gp = new GeneralPath(); 
    gp.moveTo( 50,  50); // start here
    gp.lineTo( 50,  70); // going down
    gp.lineTo(100,  70); // going right
    gp.lineTo(100, 180); // going down
    gp.lineTo(120, 180); // going right
    gp.lineTo(120,  70); // going up
    gp.lineTo(170,  70); // going right
    gp.lineTo(170,  50); // going up
    gp.lineTo( 50,  50); // going left (back to start)
    
    g2d.draw(gp); // also try g2d.fill(gp); 
  }
      
        Anregungen oder Verbesserungsvorschläge können auch gerne per E-mail an mich gesendet werden: Kontakt