AWT SWING Aufgabe

thor_norsk

Bekanntes Mitglied
Guten Abend,
ich habe eine Aufgabe erhalten und habe versucht Alles nach Vorgaben zu programmieren, aber die Verschiebung nach oben und unten funktioniert nicht.
Vielen Dank für eure Hilfe im Voraus.

Aufgabe)
Erstellen Sie eine Anwendung, in der Sie die Position des Fensters der Anwendung über vier Schaltflächen verändern können.
Eine Schaltfläche soll das Fenster um 10 Pixel nach oben verschieben, eine um 10 Pixel nach unten und die beiden anderen um je 10 Pixel nach links bzw. nach rechts.
Beachten Sie bei der Umsetzung bitte folgenden Vorgaben:
- Erstellen Sie für den Listener eine innere Klasse in der Klasse mit dem Fenster der Anwendung. Der Listener soll die Ereignisse alle vier Schaltflächen verarbeiten können.
- Setzen Sie das Fenster der Anwendung fest auf die Größe 300x300 und positionieren Sie es zunächst einer beliebigen Stelle auf dem Desktop.
- Ordnen Sie die Schaltflächen in einem BorderLayout mit einem Abstand von 25 Pixeln an.
- Stellen Sie sicher, dass das Fenster nicht aus dem Desktop herausgeschoben werden kann. Ermitteln Sie dazu die aktuelle Größe des Desktops und berechnen Sie dann die maximal möglichen Koordinaten für die Verschiebung nach rechts und nach unten. Für die Verschiebung nach links beziehungsweise oben können Sie den Wert 0 als Grenze verwenden.

Mein Code:

Java:
package gui2;

import java.awt.Dimension;
import java.awt.Toolkit;
import java.awt.BorderLayout;
import java.awt.FlowLayout;
import java.awt.GridLayout;
import java.awt.Font;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.awt.event.WindowAdapter;
import java.awt.event.WindowEvent;
import javax.swing.JButton;
import javax.swing.JFrame;
import javax.swing.JLabel;
import javax.swing.JOptionPane;
import javax.swing.BorderFactory;


public class Schaltflaechen extends JFrame {
    
    //die ID wurde automatisch mit Eclipse ergänzt
    private static final long serialVersionUID = 9101793356610287755L;   

    private JButton schaltflaeche1, schaltflaeche2, schaltflaeche3, schaltflaeche4, schaltflaeche5;
    //für die aktuelle Schriftgröße
    private int schriftGroesse;
    
    //Instanzvariablen für horizontale & vertikale Verschiebung
    private int x,y;
        
    //die innere Klasse für den ActionListener
    class SchaltflaechenListener implements ActionListener {
        
        @Override
        public void actionPerformed(ActionEvent e) {
        
            //würde auf NORTH geklickt
            if (e.getActionCommand().equals("NORTH"))
                // 10 Pixeln nach NORTH
                setLocation(x, y+10);
            //würde auf EAST geklickt
            if (e.getActionCommand().equals("EAST"))
                // 10 Pixeln nach Unten
                setLocation(x+10, y);
            //würde auf CENTER geklickt
            if (e.getActionCommand().equals("CENTER"))
                // 10 Pixeln nach CENTER!
                setLocation(x-0,y-0);
            //würde auf SOUTH geklickt
            if (e.getActionCommand().equals("SOUTH"))
                // 10 Pixeln nach SOUTH!
                setLocation(x, y-10);
            //würde auf WEST geklickt
            if (e.getActionCommand().equals("WEST"))
                // 10 Pixeln nach WEST!
                setLocation(x-10, y);
        
                schaltflaeche1.setFont(new Font("Arial", Font.PLAIN, schriftGroesse));
                schaltflaeche2.setFont(new Font("Arial", Font.PLAIN, schriftGroesse));
                schaltflaeche3.setFont(new Font("Arial", Font.PLAIN, schriftGroesse));
                schaltflaeche4.setFont(new Font("Arial", Font.PLAIN, schriftGroesse));
                schaltflaeche5.setFont(new Font("Arial", Font.PLAIN, schriftGroesse));
        }
    }

            //der Konstruktor
            public Schaltflaechen(String titel) {
                
                super(titel);
                // 5 Schaltflächen erzeugen.
                schaltflaeche1 = new JButton("NORTH");
                schaltflaeche2 = new JButton("EAST");
                schaltflaeche3 = new JButton("CENTER");
                schaltflaeche4 = new JButton("SOUTH");
                schaltflaeche5 = new JButton("WEST");
                
                // Erweiterung: Bildschirmtipps
                schaltflaeche1.setToolTipText("NORTH");
                schaltflaeche2.setToolTipText("SOUTH");
                schaltflaeche3.setToolTipText("EAST");
                schaltflaeche4.setToolTipText("WEST");
                schaltflaeche5.setToolTipText("CENTER");
                
                //die Größe für die Schrift setzen
                schriftGroesse = 30;
                // Schriftart und Schriftgröße für die Schaltflächen setzen
                schaltflaeche1.setFont(new Font("Arial",Font.PLAIN, schriftGroesse));
                schaltflaeche2.setFont(new Font("Arial",Font.PLAIN, schriftGroesse));
                schaltflaeche3.setFont(new Font("Arial",Font.PLAIN, schriftGroesse));
                schaltflaeche4.setFont(new Font("Arial",Font.PLAIN, schriftGroesse));
                schaltflaeche5.setFont(new Font("Arial",Font.PLAIN, schriftGroesse));
                
                //ein neues Border-Layout
                setLayout(new BorderLayout(25,25));
                
                add(BorderLayout.NORTH, schaltflaeche1);
                add(BorderLayout.EAST, schaltflaeche2);
                add(BorderLayout.CENTER, schaltflaeche3);
                add(BorderLayout.SOUTH, schaltflaeche4);
                add(BorderLayout.WEST, schaltflaeche5);
                                
                //den Listener verbinden
                schaltflaeche1.addActionListener(new SchaltflaechenListener());
                schaltflaeche2.addActionListener(new SchaltflaechenListener());
                schaltflaeche3.addActionListener(new SchaltflaechenListener());
                schaltflaeche4.addActionListener(new SchaltflaechenListener());
                schaltflaeche5.addActionListener(new SchaltflaechenListener());
                
                //die Fenstergröße setzen
                setSize(300, 300);
                
                //die Standardaktion beim Schließen festlegen
                setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
                                
                Dimension bGroesse = Toolkit.getDefaultToolkit().getScreenSize();
                //das Fenster positionieren
                setLocation((bGroesse.width - getSize().width) / 2, (bGroesse.height - getSize().height) / 2);
                //oder einfach so
                // setLocationByPlatform(true); Aber laut Aufgabestellung falsch?
                
                //das Fenster anzeigen
                setVisible(true);
            }

            public static void main(String[] args) {
                
                new Schaltflaechen("Schaltflächen in verschiedenen Richtungen");
            }
}
 
Ich muss die Variablen x und y mit den momentanen Koordinaten des Fensters füllen, weiß zwar nicht wie?
Allerdings habe ich etwas im Internet gefunden.
Point parloc = this.getLocation(); // soll angeblich die aktuelle Position an den Variablen x, y weiterleiten?

Jetzt weiß ich nicht wie man die in einbaut?

Ansatz: Point parloc = this.getLocation oder parent.getLocation // mit parent ?
Anschließend werte setzen: setBounds(parloc.x+0, parloc.y+10) ???

Java:
@Override
        public void actionPerformed(ActionEvent e) {
            
            //würde auf NORTH geklickt
            if (e.getActionCommand().equals("NORTH"))
                // 10 Pixeln nach NORTH
                Point parloc = parent.getLocation();
                  setBounds(parloc.x + 0, parloc.y + 10, 500, 500);

Kann man damit was machen ?
 
Wieso wechselst Du denn die Methoden, die du nutzt?

Es macht keinen Sinn, im Netz nach irgendwelchen Codes zu suchen, wenn man diese nicht versteht.

Geh den Code doch einmal durch und erkläre mir, was dieser macht. Jeder Aufruf muss verstanden worden sein. Dabei ist mir egal, ob Du den ursprünglichen Code nutzt oder eine neue, angepasste Variante.

Generell hat Dein erster Code ja schon gewisse Dinge gemacht. Da gäbe es also zwei Ansätze:
a) Was läuft falsch? Da wäre also dann zu analysieren, was aus welchem Grund schief läuft.
b) Einfach die Codes an den jeweiligen Stellen neu schreiben und dabei sauber vorgehen:
- Zuerst den Algorithmus in Worten beschreiben / als Kommentare schreiben.
- Dann dies umsetzen.
Das sollte dann zu Code führen, der funktioniert oder der dann zumindest so ist, dass man Fehler einfacher finden kann.
 
a) Nach EAST, WEST, CENTER funktioniert. NORTH und SOUTH nicht. Bei der Analyse gehe ich davon aus, dass die Koordination auf der X- Achse funktioniert und bei der Y-Achse nicht!
Des weiteres habe ich festgestellt, sobald ich SOUTH bzw NORTH betätige landet das Fenster immer oben rechts (Nullpunkt des Koordinatensystem).
Problem: Ich vermute man muss die aktuelle Position beschaffen und nach Wünsch neue setzen, aber wie ?😀
Also irgendwie mit getLocation() Information beschaffen und mit getLocation() neue Koordinate setzen? oder?
 
Generell solltest Du Dir genau überlegen, was Du überhaupt machen willst. Code schreiben ohne zu wissen, was man machen will, führt extrem selten zu einer Lösung.

Also Code sollte man verstehen. Was macht eine Zeile:
Java:
 setLocation((bGroesse.width - getSize().width) / 2, (bGroesse.height - getSize().height) / 2);

Und welchen Wert haben bei Dir x und y wenn Du die nutzt beim setzen einer Position?

Also irgendwie mit getLocation() Information beschaffen und mit getLocation() neue Koordinate setzen? oder?
Hast Du denn man geschaut, ob die Klassen des Frameworks irgendwie evtl. ein bisschen dokumentiert sind? Dann könnte man sowas lesen um heraus zu kriegen, ob getLocation nutzbar ist. setLocation scheint ja zu gehen - das hast Du ja etwas ausprobiert.

Ja, getLocation wäre eine Möglichkeit. Man könnte aber auch die Variablen x/y auch erst einmal nutzen. Falls Du das Fenster an eine Position setzt, dann könnte man diese Position z.B. speichern. Wenn man das Fenster mit den Knöpfen verschiebt, könnte man diese Änderung speichern ...

Man könnte auch die Aufgabe lesen - Wenn da die Rede von "vier Schaltflächen" ist und man davon 5 hat ... wenn man die dann auch noch von 1-5 nummeriert, dann ist es total einfach dem EAST Button den Tooltip SOUTH zu geben ....

Oder das man evtl. als Aufgabe etwas hat wie "positionieren Sie es zunächst einer beliebigen Stelle auf dem Desktop." - was bedeutet dies?
 
Habe die Aufgabe gelöst, und 1 Button entfernt, also 4 Button. und mit SetLocation(...) habe wie Herr Konrad beschrieben hat bzw . die Aufgabe gelöst : Den Inhalt in anderen Variablen gespeichert. Vor Allem x,y ist nicht notwendig.
Vor Allem waren die Bildschirmtipps falsch programmiert bzw . Koordinaten falsch ( EAST, NORTH, usw verwechselt).
 

Neue Themen


Zurück
Oben