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);
            }
        }
    }
 
Schreib nicht einen Listener für alle Buttons sondern für jeden Button einen eigenen. Oder lager die einzelnen Fälle in Methoden aus.
 
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.
 
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:
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
 
Du kannst zwei identische Methoden in einer Klasse haben. Mach da zwei Klassen raus und weise jeweils die richtige dem entsprechenden Button zu.
 
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:
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());
 
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:

Zurück
Oben