Je travaille actuellement sur un projet d'application bancaire pour l'université et l'interface utilisateur graphique (en utilisant swing ici) se compose de nombreux écrans différents, ayant chacun 2 à 8 boutons, donc à la fin, il revient à disons plus de 50 boutons qui ont tous des fonctionnalités différentes. Tous les composants individuels de l'interface graphique sont sous-traités à une classe différente que j'appelle lorsque l'interface graphique est appelée par le programme principal.Déplacez les Actionlisteners vers une classe distincte
import java.awt.*;
import java.awt.event.*;
import javax.swing.*;
import javax.swing.filechooser.FileNameExtensionFilter;
import javax.swing.text.NumberFormatter;
import java.sql.*;
import java.text.DecimalFormat;
import java.text.NumberFormat;
import java.io.*;
public class Gui extends JFrame {
private JPanel contentPane = new JPanel();
private static Database userData;
private Components components;
public Gui(Database userData) {
components = new Components(this, userData);
ActionListeners al = new ActionListeners(components, this, userData);
for (int i = 0; i < components.accountModels.length; i++) {
initializeSettings(components.accountModels[i]);
}
components.checkingAccSettings = readSettings("Checking Account");
components.dayMoneyAccSettings = readSettings("Day Money Account");
components.depositAccSettings = readSettings("Deposit Account");
components.fixedDepositAccSettings = readSettings("Fixed Deposit Account");
components.robberyAccSettings = readSettings("Robbery Account");
components.loadLookAndFeel();
this.userData = userData;
setIconImage(Toolkit.getDefaultToolkit()
.getImage(Gui.class.getResource("/de/magani/banking/sparkasse_logo_transparent.png")));
Dimension screenSize = Toolkit.getDefaultToolkit().getScreenSize();
double width = screenSize.getWidth();
double height = screenSize.getHeight();
int screenWidth = (int) width;
int screenHeight = (int) height;
setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
setBounds(screenWidth/4, screenHeight/4, screenWidth/2, screenHeight/2);
setResizable(true);
setMinimumSize(new Dimension(960, 608));
getContentPane().setLayout(null);
try {
File file = new File("C:/Program Files/Sparbank/adminCred.sparbank");
BufferedWriter out = new BufferedWriter(new FileWriter(file, true));
BufferedReader in = new BufferedReader(new FileReader(file));
String currentLine = null;
if (file.exists() && ((currentLine = in.readLine()) != null)) {
components.adminPassword = currentLine;
in.close();
out.close();
} else {
file.createNewFile();
components.adminPassword = "123";
out.write(components.adminPassword);
in.close();
out.close();
}
} catch (Exception e) {
e.printStackTrace();
}
// menuScreen
components.btnDisplayBalance.addActionListener(new ActionListener() {
@Override
public void actionPerformed(ActionEvent e) {
try {
displayBalanceScreen();
} catch (SQLException e1) {
e1.printStackTrace();
}
}
});
components.btnWithdraw.addActionListener(new ActionListener() {
@Override
public void actionPerformed(ActionEvent e) {
withdrawScreen();
}
});
components.btnDeposit.addActionListener(new ActionListener() {
@Override
public void actionPerformed(ActionEvent e) {
depositScreen();
}
});
components.btnTransfer.addActionListener(new ActionListener() {
@Override
public void actionPerformed(ActionEvent e) {
if (components.currentAccount.equals("Robbery Account")) {
robberyScreen();
} else {
transferScreen();
}
}
});
Tout fonctionne très bien à ce point et l'application est en fait déjà complètement fait, mais le problème que je suis confronté est maintenant que je ne veux pas rempli mon interface constructeur avec environ 600 lignes de code pour mon ActionListeners, j'ai donc essayé de les déplacer dans une classe différente, en passant les composants et l'interface graphique elle-même en tant que paramètres. Mais lors du lancement du programme, aucun des boutons ne fonctionne. J'ai cherché sur certains sites mais je n'ai pas vraiment trouvé de réponse qui m'a semblé utile.
Toute aide à ce sujet serait très appréciée. Si des échantillons de code ou quelque chose d'autre était nécessaire pour résoudre le problème, n'hésitez pas à me le dire, je ne voulais tout simplement pas spammer ce post avec trop de code inutile.
Pas exactement répondre à votre question: Vous pouvez réduire votre 'addActionListener' code en utilisant [Java 8 expressions lambda] (http://www.codejava.net/java-core/the -java-language/java-8-lambda-listener-exemple). –
Bienvenue sur SO. Il n'y a pas besoin d'autant de code pour démontrer le problème. S'il vous plaît poster [mcve]. – c0der
Utilisez 'Action', pour [exemple] (https://stackoverflow.com/a/37063037/230513), pour encapsuler la fonctionnalité. – trashgod