A voir également:
- Exception system java
- Waptrick java football - Télécharger - Jeux vidéo
- Jeux java itel football - Télécharger - Jeux vidéo
- Reboot system now - Guide
- Java apk - Télécharger - Langages
- A java exception has occurred - Forum Minecraft
2 réponses
KX
Messages postés
16752
Date d'inscription
samedi 31 mai 2008
Statut
Modérateur
Dernière intervention
31 août 2024
3 018
24 juin 2012 à 00:59
24 juin 2012 à 00:59
Et bien ! Ça fait un moment que tu es sur ce projet, le moins que l'on puisse dire c'est que tu en es toujours plus ou moins au même point...
Déjà tu as une erreur ici : if(if(Meth.getParameterTypes()[i].isEnum())
Mais je vais mettre ça sur le coup du copier/coller dans le forum.
Les informations que tu donnes ne sont pas suffisantes pour identifier l'erreur.
J'ai fait un code de test, mais il ne plante pas, donc difficile de t'aider davantage...
Regarde quelles peuvent être les différences avec ton code (pour identifier les mots clés "public static" qui manquent par exemple)
Déjà tu as une erreur ici : if(if(Meth.getParameterTypes()[i].isEnum())
Mais je vais mettre ça sur le coup du copier/coller dans le forum.
Les informations que tu donnes ne sont pas suffisantes pour identifier l'erreur.
J'ai fait un code de test, mais il ne plante pas, donc difficile de t'aider davantage...
Regarde quelles peuvent être les différences avec ton code (pour identifier les mots clés "public static" qui manquent par exemple)
import java.awt.GridLayout; import java.lang.reflect.InvocationTargetException; import java.lang.reflect.Method; import javax.swing.JComboBox; import javax.swing.JComponent; import javax.swing.JFrame; import javax.swing.JLabel; enum DefaultUser { MsrX(""), MsrY(""), MsrZ(""); private final String linkName; private DefaultUser(String linkName) { this.linkName = linkName; } public String getLinkName() { return linkName; } } enum Saison {Printemps,Ete,Automne,Hiver}; public class Test { public static void bidon(DefaultUser user, int n, Saison saison) { } public static void main(String...args) throws NoSuchMethodException, SecurityException, IllegalAccessException, IllegalArgumentException, InvocationTargetException { // Début Test Method meth = Test.class.getDeclaredMethod("bidon", DefaultUser.class, int.class, Saison.class); // Code méthode Class<?>[] params = meth.getParameterTypes(); int nbParams = params.length; final JComponent[] components = new JComponent[nbParams]; for(int i=0; i<nbParams; i++) { if (meth.getParameterTypes()[i].isEnum()) { Class<? extends Enum<?>> enumParam = (Class<? extends Enum<?>>) params[i]; Method getValues = enumParam.getMethod("values"); Object[] values = (Object[]) getValues.invoke(enumParam); components[i] = new JComboBox<>(values); } else { components[i]=new JLabel(params[i].getName(),JLabel.CENTER); // TODO } } // Fin Test JFrame frame = new JFrame(); frame.setLayout(new GridLayout(1,nbParams)); for (JComponent comp : components) frame.add(comp); frame.pack(); frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); frame.setVisible(true); } }
KX
Messages postés
16752
Date d'inscription
samedi 31 mai 2008
Statut
Modérateur
Dernière intervention
31 août 2024
3 018
24 juin 2012 à 15:10
24 juin 2012 à 15:10
Le problème, c'est que tu ne peux pas mettre plusieurs fois le même composants dans un même affichage, lorsque tu appuies sur ton bouton, tu dois recréer de nouveaux composants, et donc par exemple, refaire ta méthode de filtrage.
Voici une manière de faire :
Voici une manière de faire :
public class Test { public static void addMethod(final JFrame frame, final GridLayout layout, final Method method) throws Exception { Class<?>[] params = method.getParameterTypes(); int nbParams = params.length; final JComponent[] components = new JComponent[nbParams]; for (int i=0; i<nbParams; i++) { if (params[i].isEnum()) { Class<? extends Enum<?>> enumParam = (Class<? extends Enum<?>>) params[i]; Method getValues = enumParam.getMethod("values"); Object[] values = (Object[]) getValues.invoke(enumParam); components[i] = new JComboBox<>(values); } else { components[i]=new JLabel(params[i].getName(),JLabel.CENTER); // TODO } } JButton button = new JButton("+"); button.addActionListener(new ActionListener() { @Override public void actionPerformed(ActionEvent arg0) { try { addMethod(frame,layout,method); } catch (Exception e) { e.printStackTrace(); } } }); for (int i=0; i<nbParams; i++) frame.add(components[i]); for (int i=nbParams; i<layout.getColumns(); i++) frame.add(new JLabel()); frame.add(button); frame.pack(); layout.setRows(layout.getRows()+1); } public static void bidon(DefaultUser user) {} public static void bidon(DefaultUser user, int n) {} public static void bidon(DefaultUser user, int n, Saison saison) {} public static final int MAX_COL = 4; // TODO public static void main(String...args) throws Exception { JFrame frame = new JFrame(); GridLayout layout = new GridLayout(1,MAX_COL); frame.setLayout(layout); addMethod(frame,layout,Test.class.getDeclaredMethod("bidon", DefaultUser.class)); addMethod(frame,layout,Test.class.getDeclaredMethod("bidon", DefaultUser.class, int.class)); addMethod(frame,layout,Test.class.getDeclaredMethod("bidon", DefaultUser.class, int.class, Saison.class)); frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); frame.setVisible(true); }
KX
Messages postés
16752
Date d'inscription
samedi 31 mai 2008
Statut
Modérateur
Dernière intervention
31 août 2024
3 018
25 juin 2012 à 14:30
25 juin 2012 à 14:30
getDeclaredMethod prend en argument en tableau d'objets Class.
Or int est un type de données, et c'est int.class l'objet de type Class associé.
C'est exactement comme pour DefaultUser dont on passe l'objet DefaultUser.class en argument.
Or int est un type de données, et c'est int.class l'objet de type Class associé.
C'est exactement comme pour DefaultUser dont on passe l'objet DefaultUser.class en argument.
L'idée est de remplir un combo des toutes les méthodes d'un fichier .jar et c'est fait
2. afficher les paramètres de la méthode sélectionnée et c'est fait aussi.
3. calculer la class target d'une méthode sélectionné ( la classe qui est la valeur de retour de la méthode sélectionné) et c'est fait. depuis la classe target je veux répéter le même processus en cliquant sur le bouton ajouter... j'ai bien compris votre code concernant l'ajout d'un ensemble des composant dans la ligne layer suivante en cliquant sur le bouton d'ajout mais j'ai trouvé des difficulté a l'intégrer au niveau de mon code. merci de me guider vers la réponse.
public class View extends JFrame implements ActionListener {
public JPanel container = new JPanel();
private JComboBox<Object> combo = new JComboBox<Object>();
private JLabel label = new JLabel(" Available Methods are:");
public int k;
public ArrayList<Class> list;
public List<Method> list2;
public int j1;
public Method index;
public String PackageName;
public RoundButton button2;
public View(){
this.setTitle("Welcome ");
this.setSize(1200, 150);
final String K= "C:\\Users\\acer\\Desktop\\eclipse\\test.jar"; // le path du fichier.jar
list=ImportClassesOfJar.FindClasses(K); //ici ma méthode qui retourne toutes las classes des le fichier jar
for(int k=0;k<list.size();k++)
{
list2=Busniss.getMethods(list.get(k)); // chercher toutes les méthodes ds les class trouvé ds le fichier.jar
for(int j=0;j<list2.size();j++) // remlipr un combo par les méthodes trouvés
{
Method m=list2.get(j);
combo.addItem(list2.get(j).getName());
}
list2.removeAll(list2);
}
this.setResizable(false);//set the actual frame size.
this.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
combo.addActionListener(new ItemAction());
button2 = new RoundButton("+");
ActionListener action = new ActionListener()
{
public void actionPerformed(ActionEvent e)
{
//
}
};
button2.addActionListener(action);
combo.setPreferredSize(new Dimension(150, 25));
final JButton bouton= new JButton("Test");
bouton.addActionListener(this);
container.add(label);
container.add(combo);
this.setContentPane(container);
this.setVisible(true);
}
}
class ItemAction implements ActionListener{ // l'action sur le combo: on vas choisir une //méthode, aaficher ses paramétres, puis calculer la class target et enfin affchicher le meme //container audessous du premier avec les nouvelles méthodes de la class target.
public void actionPerformed(ActionEvent e) {
ch=(String) combo.getSelectedItem();
combo.setVisible(true);
label.setVisible(true);
container.removeAll(); // pour vider le container des pamarétres pour chaque choix d'une méthode
container.add(label);//have to return the label and the combo
container.add(combo); // ajouter le combo de choix des méthodes
for(int k=0;k<list.size();k++)
{
list2=Busniss.getMethods(list.get(k));
for(int j=0;j<list2.size();j++)
{
int m=list2.get(j).getName().lastIndexOf(".");
String MethName=list2.get(j).getName().substring(m+1);
if(MethName.compareTo(ch)==0) //chercher le nom de la méthode //sélectionné en type string
{
index=list2.get(j); // le nom de la méthode sélectionné
j1=Busniss.parametersNumber(index); // le nombre de ses paramètres
}
}
}
Class<?>[] params = index.getParameterTypes();
final int nbParams = params.length;
final Class<?>[] type = index.getParameterTypes();
final JComponent[] comp = new JComponent[nbParams];
if(nbParams !=0) // si la méthode a des paramètres on va afficher l'enum ds un combo et le param de type String dans un JTextField
{
for(int i=0;i<nbParams ;i++)
{
if(index.getParameterTypes()[i].isEnum())
{
try {
Class<? extends Enum<?>> enumParam = (Class<? extends Enum<?>>) params[i];
Method getValues = enumParam.getMethod("values");
Object[] values = (Object[]) getValues.invoke(enumParam);
comp[i] = new JComboBox<>(values);
}
else{
JTextField MonLabel=new JTextField();
comp[i]=MonLabel;
comp[i].setPreferredSize(new Dimension(150,20));
comp[i].setForeground(Color.red.brighter());
comp[i].setSize(50, 70);
comp[i].setForeground(Color.red);
comp[i].setSize(120,20);
container.add(MonLabel);
String text = ((JTextField) comp[i]).getText();
}
catch (Exception e1)
{e1.printStackTrace(); }
}
}
}
}
}
2. afficher les paramètres de la méthode sélectionnée et c'est fait aussi.
3. calculer la class target d'une méthode sélectionné ( la classe qui est la valeur de retour de la méthode sélectionné) et c'est fait. depuis la classe target je veux répéter le même processus en cliquant sur le bouton ajouter... j'ai bien compris votre code concernant l'ajout d'un ensemble des composant dans la ligne layer suivante en cliquant sur le bouton d'ajout mais j'ai trouvé des difficulté a l'intégrer au niveau de mon code. merci de me guider vers la réponse.
public class View extends JFrame implements ActionListener {
public JPanel container = new JPanel();
private JComboBox<Object> combo = new JComboBox<Object>();
private JLabel label = new JLabel(" Available Methods are:");
public int k;
public ArrayList<Class> list;
public List<Method> list2;
public int j1;
public Method index;
public String PackageName;
public RoundButton button2;
public View(){
this.setTitle("Welcome ");
this.setSize(1200, 150);
final String K= "C:\\Users\\acer\\Desktop\\eclipse\\test.jar"; // le path du fichier.jar
list=ImportClassesOfJar.FindClasses(K); //ici ma méthode qui retourne toutes las classes des le fichier jar
for(int k=0;k<list.size();k++)
{
list2=Busniss.getMethods(list.get(k)); // chercher toutes les méthodes ds les class trouvé ds le fichier.jar
for(int j=0;j<list2.size();j++) // remlipr un combo par les méthodes trouvés
{
Method m=list2.get(j);
combo.addItem(list2.get(j).getName());
}
list2.removeAll(list2);
}
this.setResizable(false);//set the actual frame size.
this.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
combo.addActionListener(new ItemAction());
button2 = new RoundButton("+");
ActionListener action = new ActionListener()
{
public void actionPerformed(ActionEvent e)
{
//
}
};
button2.addActionListener(action);
combo.setPreferredSize(new Dimension(150, 25));
final JButton bouton= new JButton("Test");
bouton.addActionListener(this);
container.add(label);
container.add(combo);
this.setContentPane(container);
this.setVisible(true);
}
}
class ItemAction implements ActionListener{ // l'action sur le combo: on vas choisir une //méthode, aaficher ses paramétres, puis calculer la class target et enfin affchicher le meme //container audessous du premier avec les nouvelles méthodes de la class target.
public void actionPerformed(ActionEvent e) {
ch=(String) combo.getSelectedItem();
combo.setVisible(true);
label.setVisible(true);
container.removeAll(); // pour vider le container des pamarétres pour chaque choix d'une méthode
container.add(label);//have to return the label and the combo
container.add(combo); // ajouter le combo de choix des méthodes
for(int k=0;k<list.size();k++)
{
list2=Busniss.getMethods(list.get(k));
for(int j=0;j<list2.size();j++)
{
int m=list2.get(j).getName().lastIndexOf(".");
String MethName=list2.get(j).getName().substring(m+1);
if(MethName.compareTo(ch)==0) //chercher le nom de la méthode //sélectionné en type string
{
index=list2.get(j); // le nom de la méthode sélectionné
j1=Busniss.parametersNumber(index); // le nombre de ses paramètres
}
}
}
Class<?>[] params = index.getParameterTypes();
final int nbParams = params.length;
final Class<?>[] type = index.getParameterTypes();
final JComponent[] comp = new JComponent[nbParams];
if(nbParams !=0) // si la méthode a des paramètres on va afficher l'enum ds un combo et le param de type String dans un JTextField
{
for(int i=0;i<nbParams ;i++)
{
if(index.getParameterTypes()[i].isEnum())
{
try {
Class<? extends Enum<?>> enumParam = (Class<? extends Enum<?>>) params[i];
Method getValues = enumParam.getMethod("values");
Object[] values = (Object[]) getValues.invoke(enumParam);
comp[i] = new JComboBox<>(values);
}
else{
JTextField MonLabel=new JTextField();
comp[i]=MonLabel;
comp[i].setPreferredSize(new Dimension(150,20));
comp[i].setForeground(Color.red.brighter());
comp[i].setSize(50, 70);
comp[i].setForeground(Color.red);
comp[i].setSize(120,20);
container.add(MonLabel);
String text = ((JTextField) comp[i]).getText();
}
catch (Exception e1)
{e1.printStackTrace(); }
}
}
}
}
}
KX
Messages postés
16752
Date d'inscription
samedi 31 mai 2008
Statut
Modérateur
Dernière intervention
31 août 2024
3 018
26 juin 2012 à 18:45
26 juin 2012 à 18:45
Deux fautes énormissimes !
La classe View implémente ActionListener mais tu n'as pas défini la méthode actionPerformed puisque tu l'as mis dans la classe ItemAction qui utilise les membres de View alors qu'elle ne lui est pas interne.
Il faudrait fusionner ces deux classes pour avoir l'actionPerformed directement dans View.
La deuxième erreur qui saute immédiatement aux yeux, c'est ton instruction "if try else catch".
Soit tu fais "try if else catch", soit tu fais "if try catch else", mais tu ne peux pas mélanger les mots-clés n'importe comment...
Après, il y a d'autres erreurs, variables non-déclarées (String ch par exemple), ou alors déclarées comme champs de la classe alors que d'autres variables de même noms sont utilisées (int k)
Ensuite, tout est en public, non final, etc... il y a de sérieux points à revoir !
La classe View implémente ActionListener mais tu n'as pas défini la méthode actionPerformed puisque tu l'as mis dans la classe ItemAction qui utilise les membres de View alors qu'elle ne lui est pas interne.
Il faudrait fusionner ces deux classes pour avoir l'actionPerformed directement dans View.
La deuxième erreur qui saute immédiatement aux yeux, c'est ton instruction "if try else catch".
Soit tu fais "try if else catch", soit tu fais "if try catch else", mais tu ne peux pas mélanger les mots-clés n'importe comment...
Après, il y a d'autres erreurs, variables non-déclarées (String ch par exemple), ou alors déclarées comme champs de la classe alors que d'autres variables de même noms sont utilisées (int k)
Ensuite, tout est en public, non final, etc... il y a de sérieux points à revoir !
24 juin 2012 à 01:53
merci pr votre code je l'ai exporter en.jar et mon code fonctionne avec il affiche tt comme il faut donc le problème n'est pas donc le code d'affichage mais plutôt dans mon fichier.jar.
mon fichier.jar est un package est ce que cela change qql chose? ( un package contenant des class java)
voilà ma classe elle parait juste mais..?(cette classe est ds un package sous forme d'un fichier.jar)
enum DefaultUser{
MsrX(""),
MsrY(""),
MsrZ("");
private final String linkName;
private DefaultUser(String linkName) {
this.linkName = linkName;
}
public String getLinkName() {
return linkName;
}
}
@State(StateName = "LoginPage") // ma classe est annoté
public class LoginPage
{
@Action(ActionName = "login") // mes méthodes sont annotés
public static void login(
@paramAnnotation(Name="Username") // mes paramètres sont annotés
DefaultUser username,
@paramAnnotation(Name="Password")
String password
){
}
}
est ce que les annotations qui sont définit en dehors du fichier.jar sont la cause? j'ai les pris en considérations avec isAnnotationPresent (je ne considère que les paramètres annotés des méthodes annotés ds les classe annotés de fichier.jar)
24 juin 2012 à 01:59
24 juin 2012 à 02:05
Remarque : il est important que tu apprennes à indenter correctement ton code !
Il ne s'agit pas forcément d'utiliser toujours les mêmes idiotismes, mais d'adapter le code pour qu'il soit lisible, surtout dans ton cas où les annotations alourdissent la lecture...
24 juin 2012 à 02:08
pr ton code il saffiche des composant ds une ligne si j'ajoute un bouton suivant a la fin de la ligne comment faire pr que le click ajoute la même ligne des composant ds la ligne dessous de la même fenêtre?( comme si a chaque choix d'une méthode je peux passer a un autre choix.. j'ai échoué de coder le listener du bouton "ajouter")
24 juin 2012 à 02:14