Twitter iPhone pliant OnePlus 11 PS5 Disney+ Orange Livebox Windows 11

bip bip j'ai comme un pb

8 réponses
Avatar
remy
bonjour
il doit y avoir surement une raison valable mais pourquoi je ne peux pas
mettre de
pointeur ref obj identique dans un obj container

parce que mon nouveau type de menu avec lien dynamique
il a comme un pb :-) j'ai des menus qui disparaissent


import javax.swing.*;
import java.awt.*;
import java.awt.event.*;
import javax.swing.event.*;
import java.awt.*;
import java.util.*;


public class test
{
public static void main(String args[])
{
JButton s=new JButton();
Vector v=new Vector ();
v.add(s);
v.add(s);
System.out.println(v.size());
Container c=new Container();
c.add(s);
c.add(s);
System.out.println(c.getComponentCount());
}
}

sortie ecran
2
1

merci a+ remy

8 réponses

Avatar
Xavier Tarrago
On ne peut pas mettre un Component dans plusieurs Containers. En effet, le
Component garde une référence sur son père pour diverses raisons.

La solution pour avoir plusieurs menus identiques est l'Action (cf
AbstractAction). On peut mettre une Action dans un menu ou un bouton. Une
Action a (optionnellement) un label et iune icône. Elle peut être active ou
non. Les menus gardent un lien avec l'Action, et les changements sur
l'Action sont visibles dans tous les menus ou boutons.

Exemple: Une Action fermerFichier sera attachée à une entrée du menu et à un
bouton de toolbox. Les deux actions de l'utilisateur (menu ou bouton)
entrînent l'exécution de la méthode actionPerformed de l'Action. Si l'Action
est désactivée, l'entrée du menu et le bouton deviendront tous les deux
inactifs, ...

"remy" a écrit dans le message de
news:417372e6$0$7189$
bonjour
il doit y avoir surement une raison valable mais pourquoi je ne peux pas
mettre de
pointeur ref obj identique dans un obj container

parce que mon nouveau type de menu avec lien dynamique
il a comme un pb :-) j'ai des menus qui disparaissent


import javax.swing.*;
import java.awt.*;
import java.awt.event.*;
import javax.swing.event.*;
import java.awt.*;
import java.util.*;


public class test
{
public static void main(String args[])
{
JButton s=new JButton();
Vector v=new Vector ();
v.add(s);
v.add(s);
System.out.println(v.size());
Container c=new Container();
c.add(s);
c.add(s);
System.out.println(c.getComponentCount());
}
}

sortie ecran
2
1

merci a+ remy




Avatar
Thibaut Desmarest
remy wrote:
bonjour
il doit y avoir surement une raison valable mais pourquoi je ne peux pas
mettre de
pointeur ref obj identique dans un obj container

parce que mon nouveau type de menu avec lien dynamique
il a comme un pb :-) j'ai des menus qui disparaissent


import javax.swing.*;
import java.awt.*;
import java.awt.event.*;
import javax.swing.event.*;
import java.awt.*;
import java.util.*;


public class test
{
public static void main(String args[])
{
JButton s=new JButton();
Vector v=new Vector ();
v.add(s);
v.add(s);
System.out.println(v.size());
Container c=new Container();
c.add(s);
c.add(s);
System.out.println(c.getComponentCount());
}
}

sortie ecran
2
1

merci a+ remy




Je pense que quand tu fais v.add(s) tu ne crées pas de "copie" de ton
objet s. Tu as mis donc deux références vers le même objets dans le même
vecteur. Celà ne gène pas le vecteur, qui compte bien deux elements.
En revanche peut etre qu'il n'est pas possible d'ajouter deux fois le
même objet (même référence mémoire) dans un container.

Thibaut

Avatar
remy
merci

mais ce n'est pas vraiment cela que je veux faire
le but du jeu c'est de creer un rappel du menu "click"
en gros

teste le code que j'ai poste un peu plus bas et imagine que
ton menu n'a pas disparu

Re: bigo nouveau type de menu code sous GPL
dans le fil
un solution simple ?

pour que cette solution soit exploitable
l'on peut tout faire sauf toucher
aux obj MenuItem les actions peuvent etre utilisees
par celui qui a code le programme
la seule solution que je voie c'est d'encapsuler l'obj JmenuItem
mais c'est lourd a coder


merci a+ remy
Avatar
remy
Je pense que quand tu fais v.add(s) tu ne crées pas de "copie" de ton
objet s. Tu as mis donc deux références vers le même objets dans le même
vecteur. Celà ne gène pas le vecteur, qui compte bien deux elements.
En revanche peut etre qu'il n'est pas possible d'ajouter deux fois le
même objet (même référence mémoire) dans un container.


cela depend peut etre de la version
sun 1.4.2-05.b04 c

ibm sont peut etre meilleur

a+ remy

Avatar
ventolin
Thibaut Desmarest wrote:
remy wrote:


Je pense que quand tu fais v.add(s) tu ne crées pas de "copie" de ton
objet s. Tu as mis donc deux références vers le même objets dans le même
vecteur. Celà ne gène pas le vecteur, qui compte bien deux elements.
En revanche peut etre qu'il n'est pas possible d'ajouter deux fois le
même objet (même référence mémoire) dans un container.

Thibaut



D'ailleurs quelle est la différence entre Object et Component ?
Dans le premier cas, on ajoute un object (vector.add())
dans le second cas, on ajoute un component jbutton.add()).

Peut-être que la réponse au problème est dans cette question débile :-)

Avatar
remy
la seule solution que je voie c'est d'encapsuler l'obj JmenuItem
mais c'est lourd a coder
je me reponds

meme cette solution n'est pas jouable
parce que si le programmeur
fait un truc du style

class MyItem exdents JMenuItem
{
...
}

et que plus tard il teste l'instance

if(e.getSource()instanceof MyItem )
{
...
}

l'encapsulage ne fonctionnera pas
la seule solution c'est 2 ref identiques dans un container
c'est dommage j'etais pret a faire des modifs dans eclipse
donc j'ai envie de dire qu'il y a un bug dans le jsk :-)
et que sun n'a pas encore depose un brevet sur ce type de menu

by remy

ps:si vous aver des lien sur le toolkit de QT en francais je suis preneur

Avatar
remy
bonjour

il solution qui fct a teste eventuellement
code toujour sous GPL

a+ remy

import javax.swing.*;
import java.awt.*;
import java.awt.event.*;
import javax.swing.event.*;
import java.awt.*;
import java.util.*;


public class Ihm1
{



public static void main(String args[])
{



MaFenetre f=new MaFenetre("coucou");

}

}

class MyJMenuItem extends JMenuItem
{
JMenuItem m=null;

MyJMenuItem()
{
this.setText("-> ...");
}
public void setItem(JMenuItem m)
{
this.m=m;
this.setText("-> "+m.getText());
this.repaint();
}
public JMenuItem getItem()
{
return m;
}

}


class MyJMenuBar extends JMenuBar
{
MyJMenuItem Myitem;
JMenuItem item;
JMenu jm;


public JMenu add(JMenu jm)
{


JSeparator s=new JSeparator();
jm.add(s);
Myitem = new MyJMenuItem ();
jm.add(Myitem);

return super.add(jm);
}

public void menuSelectionChanged(boolean isIncluded)
{



AWTEvent e=get().getCurrentEvent();
if(e.getSource()instanceof JMenu)
{
jm=(JMenu)e.getSource();
return;
}
if(e.getSource()instanceof JMenuItem)
{
item=(JMenuItem)e.getSource();
jm.remove(jm.getItemCount()-1);
MyJMenuItem my=new MyJMenuItem();
my.setItem(item);
jm.insert(my,jm.getItemCount());

}
if(e.getSource()instanceof MyJMenuItem)
{
MyJMenuItem item1=((MyJMenuItem)e.getSource());
JMenuItem it=item1.getItem();
e.setSource(it);
EventQueue event=get();
event.postEvent(e);


}

}

public EventQueue get()
{
EventQueue retValue;
try
{
retValue = Toolkit.getDefaultToolkit().getSystemEventQueue();
}
catch (SecurityException se)
{
retValue = null;
}
return retValue;
}



}

class MaFenetre extends JFrame
{

MaFenetre(String titre)
{
super(titre);
MyJMenuBar mb = new MyJMenuBar();
//JMenuBar mb = new JMenuBar();
mb.add(getMenu());
mb.add(getMenu());
setJMenuBar(mb);
this.setSize(getToolkit().getScreenSize());
this.setVisible(true);
}
JMenu getMenu()
{


JMenuItem item;
JMenu item0,item1,item2,item3;
JMenu fileMenu= new JMenu("test");
item0 = new JMenu("niveaux0");
for(int j=0;j<5;j++)
{
item = new JMenuItem("test"+j);
fileMenu.add(item);
}
JMenuItem it1 = new JMenuItem("test Action");
it1.setAction(new AbstractAction("essai") {
public void actionPerformed(ActionEvent ae) {

System.out.println("coucou");
}
});
fileMenu.add(it1);



for(int j=0;j<5;j++)
{
item = new JMenuItem("test"+j);
item0.add(item);
}
item1 = new JMenu("niveaux1");
item0.add(item1);
for(int j=0;j<5;j++)
{
item = new JMenuItem("test"+j);
item1.add(item);
}
item2 = new JMenu("niveaux2");
item1.add(item2);
for(int j=0;j<5;j++)
{
item = new JMenuItem("test"+j);
item2.add(item);
}
item3 = new JMenu("niveaux3");
item2.add(item3);
for(int j=0;j<5;j++)
{
item = new JMenuItem("test"+j);
item3.add(item);
}
fileMenu.add(item0);

return fileMenu;

}

}
Avatar
remy
re

savais vous ou je peut trouver les sources d'eclipse
http://www.eclipse.org/downloads/index.php
ou

http://eclipse.objectweb.org/downloads/

je ne voie rien
merci remy