actionPerformed aufteilen

hans-sonny

Bekanntes Mitglied
hi leute,

ich muss mein programm mit sonar validiieren und alle cyclomatischen komplexitäten auf unter 10 bringen

das heißt in einer methode dürfen maximal 10 (if,else,switch,for,||,&&) vorkommen

in meinem actionl istener sind es aber lieder 10 ....

und da werden noch mindestens 4 dazu kommen ....


wie kann das am besten reduzieren ....


Java:
@Override
    public void actionPerformed(final ActionEvent e) {
        // Exit Game
        if (e.getSource().equals(this.item2)) {
            final int n = JOptionPane.showConfirmDialog(this, "Do you realy want to Exit the game?", "Exit game", JOptionPane.YES_NO_OPTION);
            if (n == JOptionPane.YES_OPTION) {
                System.exit(0);
            }
        }

        //Start new Game
        if (e.getSource().equals(this.item1)) {
            final int start = JOptionPane.showConfirmDialog(this, "Do you want to start a new game?", "Start game", JOptionPane.YES_NO_OPTION);
            if (start == JOptionPane.YES_OPTION) {
                try {
                    initGuiGame();
                } catch (InterruptedException ex) {
                    logger.ErrorLog.errorLog("Error while initilalizing game " + ex);
                }
            }
        }

        //About dialog
        if (e.getSource().equals(this.item4)) {
            double version = playlogic.Global_vars.getVersion();
            String string = "Version: " + version;
            JOptionPane.showMessageDialog(this, string, "About", JOptionPane.INFORMATION_MESSAGE);
        }

        //New Card
        if ("newCard".endsWith(e.getActionCommand())) {
            this.newGuigame.newCard(0);
            this.cardsOut(0);
        }

        //Players selection
        if (e.getSource().equals(this.playCard)) {
            int index = userCards.getSelectedIndex();
            //Output for Validate Players Choise
            //JOptionPane.showMessageDialog(this, index, "About", JOptionPane.INFORMATION_MESSAGE);
            this.newGuigame.playersTurn(index, 0);
            try {
                guiPlay();
            } catch (InterruptedException ex) {
                logger.ErrorLog.errorLog("Error: " + ex);
            }
        }

        //Display Rules
        if (e.getSource().equals(this.item3)) {
            try {
                new unogui.GuiRules();
            } catch (IOException ex) {
                logger.ErrorLog.errorLog("Error while loading gui-rules " + ex);
            }
        }
    }
 
G

Gast2

Gast
Schreib nicht einen Listener für alle Buttons sondern für jeden Button einen eigenen. Oder lager die einzelnen Fälle in Methoden aus.
 

njans

Top Contributor
Oder sorge zumindest dafür, dass du nicht einen Listener für alle hast, sondern nur einen Listener für die Buttons einer Componente ;)
Je nachdem, kann das natürlich ziemlich viel werden, also vielleicht jeweils dann ne eigene Klasse.

Was man auch machen könnte:
ActionCommands setzten und dann:

Java:
switch(e.getActionCommand())
{
case "MYACTION1": methodeEins(); break;
case "MYACTION2": methodeZwei(); break;
...
}

Das geht aber nur mit Java 7, ist somit nicht rückwärts kompatibel. Ich persönlich finde es recht übersichtlich.
 

hans-sonny

Bekanntes Mitglied
wenn ich einen zweiten action listener einfügen kommen nur fehler ... wie geht das genau?


-->
actionPerformed(java.awt.event.ActionEvent) is already defined in unogui.Unogui
----
(Alt-Enter shows hints)
 
Zuletzt bearbeitet:

hans-sonny

Bekanntes Mitglied
Fehlermeldung:
actionPerformed(java.awt.event.ActionEvent) is already defined in unogui.Unogui
----
(Alt-Enter shows hints)


Code

Java:
 @Override
    public void actionPerformed(final ActionEvent e) {
        // Exit Game
        if (e.getSource().equals(this.item2)) {
            final int n = JOptionPane.showConfirmDialog(this, "Do you realy want to Exit the game?", "Exit game", JOptionPane.YES_NO_OPTION);
            if (n == JOptionPane.YES_OPTION) {
                System.exit(0);
            }
        }
    }
    
    public void actionPerformed(final ActionEvent a){

        //Start new Game
        if (e.getSource().equals(this.item1)) {..................


so probier ichs
 
G

Gast2

Gast
Du kannst zwei identische Methoden in einer Klasse haben. Mach da zwei Klassen raus und weise jeweils die richtige dem entsprechenden Button zu.
 

hans-sonny

Bekanntes Mitglied
wie jetzt identische methoden oder klassen?

mit klassen muss ich nämlich auf passen ... ich darf keine tangles zwischen den klassen haben also wildes aufrufen ... kruez und quer durch die klassen

mir wär es schon recht wenn ich alles in der klasse lassen könnte



geht es so?
Java:
 public void actionPerformedNewGame(final ActionEvent e){

        //Start new Game
        if (e.getSource().equals(this.item1)) {
            final int start = JOptionPane.showConfirmDialog(this, "Do you want to start a new game?", "Start game", JOptionPane.YES_NO_OPTION);
            if (start == JOptionPane.YES_OPTION) {
                try {
                    initGuiGame();
                } catch (InterruptedException ex) {
                    logger.ErrorLog.errorLog("Error while initilalizing game " + ex);
                }
            }
        }
    }



wie füge ich den dann hinzu?

bisher hatte ich:
Java:
        this.item1.addActionListener(this);
 
Zuletzt bearbeitet:

njans

Top Contributor
Du kannst zwei identische Methoden
EikeB meint, du kannst KEINE (!) zwei identischen Methoden in einer Klasse haben. Deswegen auch dein Fehler.

mit klassen muss ich nämlich auf passen ... ich darf keine tangles zwischen den klassen haben also wildes aufrufen
Das sollst du ja auch nicht. Zwei einzelne Klassen sprechen auch nicht dagegen.

Wenn du ActionListener in eine andere Klasse auslagerst änderst du eben den Aufruf in:
Java:
  this.item1.addActionListener(new AndereKlasseInDerDerActionListenerIst());
 

bERt0r

Top Contributor
Ich schreib dir ein Beispiel:
Java:
JButton button1=new JButton("B1");
button1.addActionListener(new ActionListener()
				{
					@Override
					public void actionPerformed(ActionEvent e)
					{
						System.out.println("B1 gedrückt");
					}
				});

JButton button2=new JButton("B2");
button1.addActionListener(new ActionListener()
				{
					@Override
					public void actionPerformed(ActionEvent e)
					{
						System.out.println("B2 gedrückt");
					}
				});


Ebenfalls möglich
Java:
private class MyActionListener implements ActionListener
{
	String s	
	public MyActionListener(String text)
	{
		s=text;
	}
	
	@Override
	public void actionPerformed(ActionEvent e)
	{
		System.out.println(s);
	}
}

//GUI code

JButton button1=new JButton("B1");
button1.addActionListener(new MyActionListener("B1 gedrückt"));
JButton button1=new JButton("B2");
button1.addActionListener(new MyActionListener("B2 gedrückt"));
 
Zuletzt bearbeitet:
Ähnliche Java Themen
  Titel Forum Antworten Datum
J actionperformed wird nicht aufgerufen/ repaint() AWT, Swing, JavaFX & SWT 6
G lastFocusedComponent in ActionPerformed AWT, Swing, JavaFX & SWT 4
B AWT actionPerformed Method funktioniert nicht AWT, Swing, JavaFX & SWT 12
K Event Handling Mit ActionPerformed und java.io arbeiten AWT, Swing, JavaFX & SWT 3
Q AWT Methodenaufruf aus actionPerformed-Methode AWT, Swing, JavaFX & SWT 4
L ActionPerformed Variable übergeben AWT, Swing, JavaFX & SWT 3
J in actionPerformed() Koordinaten ändern AWT, Swing, JavaFX & SWT 9
C actionPerformed mit mehren Aktionen AWT, Swing, JavaFX & SWT 3
C Actionperformed funktioniert nicht AWT, Swing, JavaFX & SWT 13
G if-bedinung in actionperformed AWT, Swing, JavaFX & SWT 4
P Swing actionPerformed()-Methode funktioniert nicht AWT, Swing, JavaFX & SWT 3
S AWT Java actionPerformed "Ok" Button AWT, Swing, JavaFX & SWT 4
V Labeltext ändert sich nicht in actionPerformed AWT, Swing, JavaFX & SWT 5
M actionPerformed() wird zu oft aufgerufen AWT, Swing, JavaFX & SWT 10
M Arbeiten mit actionPerformed(ActionEvent) oder Alternative AWT, Swing, JavaFX & SWT 7
M Swing Anfängerfrage: ActionPerformed AWT, Swing, JavaFX & SWT 3
B Swing NullPointerException bei actionPerformed() AWT, Swing, JavaFX & SWT 2
B actionPerformed Problem AWT, Swing, JavaFX & SWT 3
D JTree DefaultMutableTreeNode ActionPerformed AWT, Swing, JavaFX & SWT 3
J Aus ActionPerformed ein Plugin starten AWT, Swing, JavaFX & SWT 4
R paintComponent direkt bei actionPerformed aufrufen AWT, Swing, JavaFX & SWT 2
S ActionPerformed Fehler... AWT, Swing, JavaFX & SWT 9
O Button (ActionPerformed) soll neues JFrame erzeugen AWT, Swing, JavaFX & SWT 8
J Action before actionPerformed! AWT, Swing, JavaFX & SWT 4
E ActionListener/actionPerformed() feuert nicht AWT, Swing, JavaFX & SWT 2
E AWT Implementierung einer Anweisung in Methode ActionPerformed AWT, Swing, JavaFX & SWT 2
B Komisches Problem mit actionPerformed() AWT, Swing, JavaFX & SWT 2
K Swing: 2 Buttons und actionPerformed AWT, Swing, JavaFX & SWT 4
B actionPerformed reagiert nicht auf das Canvas-objekt AWT, Swing, JavaFX & SWT 11
B Objekt in "actionPerformed" erzeugen und nutzen AWT, Swing, JavaFX & SWT 3
F actionPerformed und static? AWT, Swing, JavaFX & SWT 20
B Exceptions in actionPerformed() weiterleiten AWT, Swing, JavaFX & SWT 9
S Variablenübergabe bei actionPerformed funktioniet nicht? AWT, Swing, JavaFX & SWT 12
X actionPerformed in einer Klasse Buttons AWT, Swing, JavaFX & SWT 2
T public void actionPerformed(...) ist statisch?? AWT, Swing, JavaFX & SWT 6
K JavaFX in mehrere Controller aufteilen AWT, Swing, JavaFX & SWT 29
K JavaFX in mehrere Controller aufteilen AWT, Swing, JavaFX & SWT 0
K GUI in Komponenten aufteilen (MVC) AWT, Swing, JavaFX & SWT 2
T Bild aufteilen/manipulieren AWT, Swing, JavaFX & SWT 3
M Fenster aufteilen, aber mit welchem LayoutManager? AWT, Swing, JavaFX & SWT 10
A User Interface aufteilen? AWT, Swing, JavaFX & SWT 3
B Eine Spalte in drei verschiedenlange Spalten aufteilen AWT, Swing, JavaFX & SWT 2
EagleEye GUI in mehrere Dateien aufteilen AWT, Swing, JavaFX & SWT 2

Ähnliche Java Themen


Oben