E cosa è (e serve) questa variabile i ? Perché è uno "stato" esterno alla gestione del actionPerformed ... quindi come viene (e da chi) gestito? La questione è lì ...
Tutti i componenti hanno setVisible(boolean)
Il action command è una stringa ... ovviamente NON ha un setVisible !
Tutti gli oggetti XyzEvent hanno:
public Object getSource()
Il source è fornito come Object ma se l'evento l'ha originato un JButton, quel source è il riferimento appunto a quel JButton. Quindi si può usare il source se il listener non deve sapere nulla di specifico.
Se scrivi esattamente "North" sì, sono equivalenti come risultato.
Ma c'è una differenza IMPORTANTISSIMA.
Se ti sbagli a scrivere es. "Nirth" e non te ne accorgi, il sorgente compila ma poi la applicazione NON ti funziona o NON si presenta correttamente.
Se ti sbagli a scrivere es. BorderLayout.NIRTH, allora NON ti compila proprio, perché non esiste quella costante!
Quindi, USA i nomi di costanti già definite ... NON usare costanti String letterali in questi casi. E' un "controllo" in più a-gratis che il compilatore ti fa.