Mit der Maus in verschiedene Modi wechseln

Status
Nicht offen für weitere Antworten.

daNny

Aktives Mitglied
Hallo Java-Gemeinde ;)

Ich hätte da mal eine Frage, wie ich das realisieren könnte, eine Art Modus zu realisieren. Was ich damit meine ist folgendes:
Ich möchte mit ein paar Buttons verschiedene Modi festlegen, d.h. wenn ich z.B. auf den ersten Button klicke, dann soll ich mit der Maus per Knopfdruck Spalten aus einer Tabelle markieren können. Wenn ich auf einen anderen Button klicke, soll ich z.B. per Mausklick die Farbe von diversen Komponenten einfärben können usw...

Wie kann ich denn soetwas generell angehen? Lege ich z.B: den aktuellen ActionListener als Attribut fest und wechsel diesen dann, wenn ich einen anderen Button klicke? Mir fehlt da gerade leider irgendwie der Ansatz.
Ich möchte also mit Buttons bestimmten, was bei einem klick meiner Maus genau passieren soll.
 
S

SlaterB

Gast
ich würde bei einem ActionListener bleiben und dann bei jedem Mausklick den aktuellen Systemzustand irgendwo abfragen
und danach unterschiedliche Aktionen ausführen,

wenn du das in mehreren Listenern machen musst,
dann bietet sich eine Basisklasse an,

final actionPerformed() { // oder auch beim MouseListener
// prüfe aktuellen Typ des Events
// Aufruf: eventA();/ eventB(); oder eventC();
}

dann müssen die einzelnen erbenden Klassen die actionPerformed nicht mehr implementieren und die Unterscheidung ausführen,
sondern die drei Unteroperationen a/b/c implementieren
 

Wildcard

Top Contributor
Eine andere Möglichkeit wäre, auf Basis des Events und des aktuellen Zustands einen Request zu formulieren und an den entsprechenden Controller weiterzuleiten. Dieser überlegt wie er den Request verarbeiten kann und macht dann entweder etwas, oder liefert (falls du sowas wie Undo haben willst) ein Command zurück, das du ausführst.
 

daNny

Aktives Mitglied
Danke schonmal für eure antworten... Ich glaube, ich blicks grad noch nicht so ganz. Am besten greife ich mal ein kleines Beispiel auf:

Ich habe einen Frame, in dem sich zwei Buttons befinden. Wenn ich auf den einen Button klicke, dann soll ich mit dem MouseCursor kleines Smileys zeichnen können, wenn der andere gedrückt wurde, dann will ich kleine Quadrate zeichen. Hier mal ein wenig von dem Code:

Code:
public class SmileyFrame extends JFrame {
    
    public SmileyFrame() {
        super("Ein neuer SmileyFrame");
        JPanel pane = new JPanel();
        JButton button1 = new JButton("Smiley");
        JButton button2 = new JButton("Quadrat");
        pane.add(button1);
        pane.add(button2);
        add(pane);
        this.setSize(800, 600);
        this.setVisible(true);
        this.addMouseListener(new SmileyMouseListener());
    }
    
    
    public static void main(String[] args) {
        SmileyFrame frame = new SmileyFrame();
    }
    
}

Und hier der MouseListener, der im Frame registriert ist.
Code:
public class SmileyMouseListener extends MouseAdapter {
    
    @Override
    public void mousePressed(MouseEvent event) {
       
        Graphics g = event.getComponent().getGraphics();
        int x = event.getX();
        int y = event.getY();
        
        // Hier irgendwie entscheiden, welcher Button gedrückt wurde und
        // somit, was gezeichnet werden soll
        
        // if Smiley...
        g.drawOval(x-10, y-10, 20, 20);
        g.fillRect(x-6, y-5, 4, 5);
        g.fillRect(x+3, y-5, 4, 5);
        g.drawArc(x-7, y-7, 14, 14, 225, 100);
        
        // else Quadrat
        // zeichneQuadrat();
    }
    
}

So ungefähr könnte das ja jetzt aussehen. Jetzt muss ich natürlich nur entscheiden können, welcher Button vorher gedrückt wurde.
 

daNny

Aktives Mitglied
Hehe... nein.

Ich will kein Zeichentool basteln. Ich wollte nur ein recht übersichtliches Beispiel bringen das zeigt, was ich genau machen will. Also, dass ich im Listener irgendwie ermitteln muss, welcher Button vorher gedrückt wurde, und was ich somit also machen möchte mit dem Event.

Hätte jetzt genau so ein Beispiel bringen können, was zur folge hat, dass wenn Button1 gedrückt wurde, dass ein klick auf eine Tabellen-Spalte die ganze Spalte grün einfärbt. Wurde dagegen Button 2 gedrückt, wird die Spalte blau gefärbt.

Das mit dem grafischen Background war jetzt nur so dahergenommen.
 
S

SlaterB

Gast
button1 braucht einen Listener und setzt beim drücken 'irgendwo', idealerweise in einem schön sauber eingebauten Controller-Objekt

setSmilyMode(true);


der MouseAdapter muss auch an diese Info rankommen und fragt
if (isSmilyMode()) {
...
} else {
...
}
 

daNny

Aktives Mitglied
Hey Cool! Ich habe das ganze jetzt mal so umgesetzt:

Code:
public class SmileyFrame extends JFrame {
    
    /** Der Controller für den SmileyFrame */
    private SmileyController controller;
    
    /**
     * Erstellt einen neuen SmileyFrame
     */
    public SmileyFrame() {
        super("Ein neuer SmileyFrame");
        this.controller = new SmileyController();
        JPanel pane = new JPanel();
        JButton button1 = new JButton("Smiley");
        button1.addActionListener(new java.awt.event.ActionListener() {
            public void actionPerformed(java.awt.event.ActionEvent evt) {
                controller.setMode(SmileyController.DRAW_MODE_SMILEYS);
            }
        });
        JButton button2 = new JButton("Quadrat");
        button2.addActionListener(new java.awt.event.ActionListener() {
            public void actionPerformed(java.awt.event.ActionEvent evt) {
                controller.setMode(SmileyController.DRAW_MODE_SQUARE);
            }
        });
        this.addMouseListener(new SmileyMouseListener());
        pane.add(button1);
        pane.add(button2);
        add(pane);
        this.setSize(800, 600);
        this.setVisible(true);
        
    };
    
    /**
     * Gibt den SmileyController zurück
     * @return den Controller
     */
    public SmileyController getController() {
        return this.controller;
    }
    
    /**
     * Anwendung starten
     * @param args
     */
    public static void main(String[] args) {
        SmileyFrame frame = new SmileyFrame();
    }
    
}

Code:
public class SmileyMouseListener extends MouseAdapter {
    
    @Override
    public void mousePressed(MouseEvent event) {
        
        Graphics g = event.getComponent().getGraphics(); 
        SmileyController controller = ((SmileyFrame)event.getComponent()).getController();
        
        System.out.println("Modus: " + controller.getMode());
       
        
        int x = event.getX();
        int y = event.getY();
        
        // Hier irgendwie entscheiden, welcher Button gedrückt wurde und
        // somit, was gezeichnet werden soll
        if (controller.getMode() == SmileyController.DRAW_MODE_SMILEYS) {
            g.drawOval(x-10, y-10, 20, 20);
            g.fillRect(x-6, y-5, 4, 5);
            g.fillRect(x+3, y-5, 4, 5);
            g.drawArc(x-7, y-7, 14, 14, 225, 100);
        } else if (controller.getMode() == SmileyController.DRAW_MODE_SQUARE){
            g.drawRect(x, y, 10, 10);
        }
    }
    
}

Code:
public class SmileyController {
    
    /** Konstante zum Zeichnen von Smileys */
    public static final int DRAW_MODE_SMILEYS = 1;
    
    /** Konstante zum Zeichnen von QUadraten */
    public static final int DRAW_MODE_SQUARE = 2;
    
    /** Der aktuell verwendete Modus */
    private int mode = DRAW_MODE_SMILEYS;
    
    /**
     * Gibt den aktuell verwendeten Modus zurück
     * @return aktueller Modus
     */
    public int getMode() {
        return this.mode;
    }
    
    /**
     * Setzt den verwendeten Modus
     * @param mode der neue Modus
     */
    public void setMode(int mode) {
        this.mode = mode;
    }

}

Meintest du das ungefähr so? Also zumindestens tut es das, was ich haben will :)
Kann man in dem Fall eigentlich schon von MVC sprechen? Weil ein Model z.B. habe ich in dem Sinn ja garnicht. Ist das so überhaupt "klug" umgesetzt?

Aber danke schonmal für eure Hilfe! :)
 
S

SlaterB

Gast
den SmileyController solltest du dem MouseListener als Parameter im Konstruktor übergeben und dort auch als Exemplarvariable verfügbar machen,

allgemein zu MVC sag ich nix, in 100 Zeilen-Programmen nach sowas zu suchen ist spitzfindig
 

daNny

Aktives Mitglied
Hat das denn auch noch einen weiteren Vorteil, den Controller als Parameter mit zu übergeben? Also ich spar mir damit auf jeden Fall schonmal das lästige Casten...und schöner siehts auch aus *g*
Sonst gibts aber nichts essentielles, wieso das eleganter ist, oder? Man lernt ja nie aus ;)
 

Wildcard

Top Contributor
Von solchen 'Modes' würde ich mich fern halten, das kann schnell kompliziert werden. Sag dir doch stattdessen, das es immer nur ein aktives Werkzeug (Tool) gibt. Ein Controller kann das gerade aktuelle Tool setzen. Das Tool weiß dann was zu tun ist, wenn du ihm ein Event übergibst.
 

daNny

Aktives Mitglied
Ich versuch das mal umzuformulieren, wie du das evtl. meinst, um zu schauen, dass du es auch so meintest:

Also ich würde eine abstrakte Klasse "Tool" erstellen, und daraus dann z.B. ein SmileyTool und ein SquareTool ableiten.
In dem SmileyController nehme ich ein "Tool" als Attribut auf und erstelle die entsprechende getter- und setter-Methode.

Im Listener hole ich mir dann also das entsprechende Tool, und lasse dann auch dieses die entsprechende Figur zeichnen. Die Logik befindet sich also in der entsprechenden Tool-Klasse.

Reden wir so ungefähr von dem Gleichen?

Aber das Tool müsste dann ja auch irgendwie wissen, wohin die Figur gezeichnet werden soll.
 

Wildcard

Top Contributor
Nun, ich würde das Ding nicht Smiley Controller nennen, weil damit ja nicht nur Smileys gezeichnet werden.
Ausserdem würde ich keine Abstrakte Klasse, sondern ein Interface verwenden.
Ansonsten hast du mich aber wohl richtig verstanden.

Aber das Tool müsste dann ja auch irgendwie wissen, wohin die Figur gezeichnet werden soll.
Wenn du ein Event empfängst das für ein Tool relevant sein könnte, dann rufst du eine Methode auf dem Tool auf und übergibst entweder das Original Event, oder baust ein eigenes zusammen, das alle benötigten Informationen enthält.
 

daNny

Aktives Mitglied
Hm... Okay! Ich glaube das habe ich verstanden! Bzw... das habe ich verstanden! :) Vielen Dank!

Aber ein Punkt habe ich noch: Ich habe auch zuerst gedacht, ein Interface zu erstellen. Allerdings könnte ein Tool ja schon gewisse Grundeigenschaften besitzen wie seinen Namen, einen Counter für seine bisher erstellten Objekte usw...
Wäre an dieser stelle eine Abstrakte Klasse nicht sinnvoller? Diese Eigenschaften hätte ja jedes Tool, und müsste dann nicht andauern neu implementiert werden.

PS: Natürlich! SmileyController ist sehr unglücklich gewählt!
 

Wildcard

Top Contributor
Ich mache gerne ein Interface und dann eine Abstrakte Klasse die selbiges Implementiert.
Das vereint Komfort und Flexibilität.
 
Status
Nicht offen für weitere Antworten.
Ähnliche Java Themen
  Titel Forum Antworten Datum
G Linie mit der Maus auswählen AWT, Swing, JavaFX & SWT 5
B mit maus Objekt bewegen AWT, Swing, JavaFX & SWT 3
R Swing Panel nur bei Maus sichtbar AWT, Swing, JavaFX & SWT 2
B mit Maus verschiebbares Panel AWT, Swing, JavaFX & SWT 2
C JTextField Inhalt mit Maus selektieren wenn disabled AWT, Swing, JavaFX & SWT 2
S JavaFX Fenster aufkommen lassen, wenn mit der Maus über bestimmten Bereich fahren AWT, Swing, JavaFX & SWT 1
F Event wenn Maus eine JList verlässt AWT, Swing, JavaFX & SWT 13
T Timer und GIF Animationen pausieren während Maus sich bewegt AWT, Swing, JavaFX & SWT 4
M Bild in JPanel mit Maus einfügen AWT, Swing, JavaFX & SWT 0
B Swing Form undecorated: Beim Bewegen geht die Maus immer automatisch zur linken Seite. AWT, Swing, JavaFX & SWT 7
L 2D-Grafik Bild in Richtung Maus drehen AWT, Swing, JavaFX & SWT 18
K Swing Maus in Panel einsperren AWT, Swing, JavaFX & SWT 8
D Swing JList keine Selektionsänderung bei "dragged-Maus" AWT, Swing, JavaFX & SWT 4
A JFrame Größenänderung mit Maus und GridLayout AWT, Swing, JavaFX & SWT 10
J Maus "locken" für Menü AWT, Swing, JavaFX & SWT 8
D Grafiken an Maus anhängen AWT, Swing, JavaFX & SWT 2
P Pfeilpolygon per Maus rotierbar machen - Kleine Schwierigkeiten AWT, Swing, JavaFX & SWT 29
P Event Handling Gedrückte Maus Blockiert MausEvents AWT, Swing, JavaFX & SWT 2
R Swing Per Maus JLabel resizen AWT, Swing, JavaFX & SWT 6
F Maus von alleine bewegen! AWT, Swing, JavaFX & SWT 8
G Swing JPanel per Maus verschieben AWT, Swing, JavaFX & SWT 5
A SWT Tooltip soll nicht verschwinden, solange User mit Maus auf Control ist AWT, Swing, JavaFX & SWT 5
C AWT Mausbarriere Maus fangen AWT, Swing, JavaFX & SWT 10
J "Auswahlfenster" mit Maus auf JLabel zeichnen AWT, Swing, JavaFX & SWT 4
W Swing Bild zeichnen wenn Maus an bestimmter Position ist AWT, Swing, JavaFX & SWT 4
J Inaktivität von Maus und Tastatur AWT, Swing, JavaFX & SWT 4
G AWT Images aus Imagearray an die Maus pappen und bewegen AWT, Swing, JavaFX & SWT 4
F Element anzeigen / erstellen. Maus vs Controller AWT, Swing, JavaFX & SWT 7
M 3D-Grafik Bewegung mit der Maus ohne Klicken AWT, Swing, JavaFX & SWT 10
F Swing Objekte mit Maus verschieben AWT, Swing, JavaFX & SWT 8
O Swing JButton werden richtig gewechselt aber die Maus macht die alten wieder Sichtbar?? AWT, Swing, JavaFX & SWT 5
Y AWT Maus Koordinaten abspeichern in eine Textfile AWT, Swing, JavaFX & SWT 3
Weltall 7 AWT Maus-Events werden doppelt ausgeführt AWT, Swing, JavaFX & SWT 12
C permanente aktualisierung der Koordinaten der Maus auf einem Panel AWT, Swing, JavaFX & SWT 8
J maus festlegen AWT, Swing, JavaFX & SWT 6
C paintComponent mit Maus verschieben - wie? AWT, Swing, JavaFX & SWT 2
T Swing JComboBox: Listeneinträge mit der Maus verschieben AWT, Swing, JavaFX & SWT 5
O JSlider - wie unterscheide ich mit Maus verändert und durch setValue verändert. AWT, Swing, JavaFX & SWT 16
W Swing Maus Rastersprung AWT, Swing, JavaFX & SWT 3
S Swing JTable Auswahl mehrerer Zellen mit STRG+Maus AWT, Swing, JavaFX & SWT 3
E Hilfetext anzeigen beim Überfahren mit der Maus AWT, Swing, JavaFX & SWT 3
G Maus über Button AWT, Swing, JavaFX & SWT 3
S Funktion nur ausführen, wenn Maus über Componente ist AWT, Swing, JavaFX & SWT 2
G Listenelemente mit der Maus verschieben AWT, Swing, JavaFX & SWT 4
B kein MouseEvent bei zu schneller Bewegung der Maus AWT, Swing, JavaFX & SWT 7
B JTable - Wechsel der Spalte bei TAB, RETURN oder Maus AWT, Swing, JavaFX & SWT 5
Z Buttons erscheinen erst wenn man mit der Maus drüber geht AWT, Swing, JavaFX & SWT 7
G Elemente erst da wenn mit Maus drüber gefahren bin AWT, Swing, JavaFX & SWT 2
M Kreis mit gedrückter Maus bewegen AWT, Swing, JavaFX & SWT 20
F Größenänderung mittels Maus - selbst implementieren? AWT, Swing, JavaFX & SWT 3
R Einstellen der Maus Rad Geschwindigkeit beim Scrollen AWT, Swing, JavaFX & SWT 3
G Kreis zeichnen und mit Maus ziehen AWT, Swing, JavaFX & SWT 3
W Maus Rahmen zeichnen AWT, Swing, JavaFX & SWT 10
A JFileChooser - Mehrere Dateien per Maus markieren (nokeys) AWT, Swing, JavaFX & SWT 7
V JTable Handling Fokus on Keystroke und Maus Doubleclick AWT, Swing, JavaFX & SWT 9
R JTable: Maus-Click ohne Datensätze AWT, Swing, JavaFX & SWT 9
L Größe von Komponenten im Nulllayout mit der Maus verändern. AWT, Swing, JavaFX & SWT 2
J Context Menü Maus AWT, Swing, JavaFX & SWT 3
G JTable selektion der Zeile bei Fokusieren mit der Maus AWT, Swing, JavaFX & SWT 5
T mousemoved abfrage - aber welches event wenn maus weg? AWT, Swing, JavaFX & SWT 2
lin Frame bei Drücken eines Buttons mit Maus verschieben AWT, Swing, JavaFX & SWT 7
G [AWT] Zeichnungen per Maus auswählen AWT, Swing, JavaFX & SWT 8
D Ne Maus Event Frage AWT, Swing, JavaFX & SWT 4
D Polygon mit der Maus zeichnen AWT, Swing, JavaFX & SWT 2
M Zusätzlichen Maus-Klick erzeugen AWT, Swing, JavaFX & SWT 4
G listener repaint() - verschiedene Darstellung AWT, Swing, JavaFX & SWT 24
E verschiedene Cursor setzen AWT, Swing, JavaFX & SWT 1
I GUI, das verschiedene Panels hat (Von Seite zu Seite navigieren) AWT, Swing, JavaFX & SWT 7
RedEagle JavaFX Verschiedene Bereiche miteinander verknüpfen AWT, Swing, JavaFX & SWT 7
H 3 verschiedene Nachrichten in einer FXML View die Infos kommen aus DB AWT, Swing, JavaFX & SWT 4
E wie fängt man verschiedene Ereignisse ein mit MVC ? AWT, Swing, JavaFX & SWT 42
S JavaFX Optimierung für verschiedene Auflösungen AWT, Swing, JavaFX & SWT 12
Bartertown JTable - Verschiedene Komponenten in einer Spalte unterbringen AWT, Swing, JavaFX & SWT 3
H Verschiedene JPanels aus eigenen Klassen in JFrame einfügen, nur ein Panel sichtbar AWT, Swing, JavaFX & SWT 4
V Swing Nimbus Look And Feel verschiedene Buttons AWT, Swing, JavaFX & SWT 8
W Verschiedene Foreground color in Combo SWT Auswahlliste AWT, Swing, JavaFX & SWT 5
L AWT Window, Dialog und verschiedene Betriebssysteme AWT, Swing, JavaFX & SWT 2
M 3D-Grafik verschiedene Texturen auf einen Würfel mappen AWT, Swing, JavaFX & SWT 15
T Swing verschiedene Auflösungen AWT, Swing, JavaFX & SWT 7
J 3D-Grafik JOGL - Verschiedene Perspektiven darstellen AWT, Swing, JavaFX & SWT 5
R JTree - verschiedene Verzeichnisse AWT, Swing, JavaFX & SWT 3
T AWT verschiedene Oberflächen programmieren AWT, Swing, JavaFX & SWT 5
D verschiedene Zeichenebenen AWT, Swing, JavaFX & SWT 10
M Verschiedene Layouts anzeigen AWT, Swing, JavaFX & SWT 5
Dit_ Verschiedene Icons in einer JTable-Zelle AWT, Swing, JavaFX & SWT 2
H Swing TableCellRenderer für verschiedene Spalten AWT, Swing, JavaFX & SWT 11
N Verschiedene FormLayout in einem Panelbuilder AWT, Swing, JavaFX & SWT 3
D Verschiedene ActionEvents für ein JButton-Array AWT, Swing, JavaFX & SWT 2
M Swing Swing, MVC über verschiedene Panel AWT, Swing, JavaFX & SWT 4
P verschiedene JPanels einblenden je nach auswahl AWT, Swing, JavaFX & SWT 2
L Focus für KeyListener auf verschiedene Panels AWT, Swing, JavaFX & SWT 2
K Verschiedene ComboBoxen in JTable AWT, Swing, JavaFX & SWT 9
D 2 verschiedene Frames mit einem Button schliessen AWT, Swing, JavaFX & SWT 2
I JTable: "GLEICHZEITIG" zwei verschiedene TableMode AWT, Swing, JavaFX & SWT 2
F GridLayout: verschiedene Spaltenbreiten AWT, Swing, JavaFX & SWT 2
S verschiedene Menuleisten AWT, Swing, JavaFX & SWT 2
S In einem button Panel 2 verschiedene TiteledBoarder erzeugen AWT, Swing, JavaFX & SWT 5
T verschiedene Farben in einem Text/Editfeld AWT, Swing, JavaFX & SWT 11
R Fenster in verschiedene Bereiche teilen - aber wie? AWT, Swing, JavaFX & SWT 4
D Mehrere verschiedene Textfelder auslesen? AWT, Swing, JavaFX & SWT 10

Ähnliche Java Themen


Oben