Bonjour.
Je suis en train de faire une petite application qui contient une arborescence à gauche et une fenêtre de détail sur la droite.
Dans le code suivant, le problème est le suivant :
Au chargement, en cliquant sur les étoiles, on peut les faire passer de noir et blanc en couleur (si je clique sur la 4ème, les 4 premièers sont passés en couleur)
Avec clique droit de la souris, un popup apparaît et permet de tout passer en noir et blanc.
Dans l'arborescence, quand je clique sur le dernier noeuds, je rafraîchit la fenêtre de droite avec un nouveau Panel.
Mais à ce moment, l'action avec le clique droit se déroule bien mais les images ne sont pas mises à jour à l'affichage.
Le même comportement se produit quand j'utilise le menu
Où est mon erreur ?
D'avance merci.
Bonne fin de journée
Etienne
Voici le code complet :
Fichier JAppli.java
import java.awt.BorderLayout;
import java.awt.Component;
import java.awt.Container;
import java.awt.event.ActionEvent;
import java.awt.event.WindowAdapter;
import java.awt.event.WindowEvent;
import java.awt.event.WindowListener;
import javax.swing.AbstractAction;
import javax.swing.Action;
import javax.swing.BoxLayout;
import javax.swing.JFrame;
import javax.swing.JMenu;
import javax.swing.JMenuBar;
import javax.swing.JMenuItem;
import javax.swing.JOptionPane;
import javax.swing.JSplitPane;
public class JAppli extends JFrame {
public Container paneRight;
public static void main(String argv[]) {
final JAppli frame = new JAppli();
frame.createMenu();
frame.setDefaultCloseOperation(JFrame.DO_NOTHING_ON_CLOSE);
WindowListener l = new WindowAdapter() {
public void windowClosing(WindowEvent e) {
int confirm = JOptionPane.showOptionDialog(frame,"Really Exit ?", "Exit confirmation", JOptionPane.YES_NO_OPTION, JOptionPane.QUESTION_MESSAGE,null,null,null);
if (confirm==0) {
System.exit(0);
}
}
};
frame.addWindowListener(l);
frame.setVisible(true);
}
public JAppli() {
super("Ma fenêtre");
setSize(800, 600);
getContentPane().setLayout(new BorderLayout());
paneRight = new Container();
paneRight.setLayout( new BoxLayout(paneRight, BoxLayout.Y_AXIS ));
paneRight.add(new PaneEssai("Au chargement"));
Component paneLeft = new TreePanel(paneRight);
JSplitPane splitPanePrinc = new JSplitPane(JSplitPane.HORIZONTAL_SPLIT, paneLeft, paneRight);
splitPanePrinc.setDividerSize(8);
splitPanePrinc.setDividerLocation(200);
splitPanePrinc.setContinuousLayout(true);
splitPanePrinc.setOneTouchExpandable(true);
getContentPane().add(splitPanePrinc, BorderLayout.CENTER);
}
protected void createMenu() {
JMenuBar mBar = new JMenuBar();
JMenu mMenu = new JMenu("Menu");
Action actionConnect = new AbstractAction() {
public void actionPerformed(ActionEvent e) {
paneRight.removeAll();
PaneEssai paneToAdd = new PaneEssai("Depuis Menu");
paneRight.add(paneToAdd);
paneRight.paintAll( paneToAdd.getGraphics() );
}
};
JMenuItem mnuI = new JMenuItem (actionConnect);
mnuI.setText("Essai");
mMenu.add (mnuI);
mBar.add(mMenu);
this.setJMenuBar( mBar );
}
}
Fichier TreePanel.java
import java.awt.Component;
import java.awt.Container;
import java.awt.event.MouseAdapter;
import java.awt.event.MouseEvent;
import javax.swing.BoxLayout;
import javax.swing.JPanel;
import javax.swing.JScrollPane;
import javax.swing.JTree;
import javax.swing.ToolTipManager;
import javax.swing.tree.DefaultMutableTreeNode;
import javax.swing.tree.DefaultTreeCellRenderer;
import javax.swing.tree.DefaultTreeModel;
import javax.swing.tree.TreePath;
import javax.swing.tree.TreeSelectionModel;
public class TreePanel extends JPanel {
class IconCellRenderer extends DefaultTreeCellRenderer {
public IconCellRenderer() {
setLeafIcon(null);
setOpenIcon(null);
}
public Component getTreeCellRendererComponent(JTree tree,
Object value, boolean sel, boolean expanded, boolean leaf,
int row, boolean hasFocus) {
Component result = super.getTreeCellRendererComponent(tree, value, sel, expanded, leaf, row, hasFocus);
setIcon(null);
return result;
}
}
class SelectTrigger extends MouseAdapter {
public void mouseReleased(MouseEvent e) {
int x = e.getX();
int y = e.getY();
TreePath path = m_tree.getPathForLocation(x, y);
if (path == null)
return;
DefaultMutableTreeNode node = getTreeNode(path);
(TreePanel.this).changePanel( new PaneEssai("Depuis Arbo") );
}
}
private Container compTarget;
protected DefaultTreeModel m_model;
protected JTree m_tree;
public TreePanel(Container compTarget_P) {
compTarget = compTarget_P;
DefaultMutableTreeNode top = new DefaultMutableTreeNode(new String("Root"));
DefaultMutableTreeNode parent;
DefaultMutableTreeNode parentI;
DefaultMutableTreeNode node;
DefaultMutableTreeNode nodeHotel;
m_model = new DefaultTreeModel(top);
m_tree = new JTree(m_model) {};
ToolTipManager.sharedInstance().registerComponent(m_tree);
node = new DefaultMutableTreeNode(new String("Section"));
parent = node;
top.add(node);
node = new DefaultMutableTreeNode(new String("Essai"));
parent.add(node);
m_tree.setCellRenderer(new IconCellRenderer() );
m_tree.addMouseListener(new SelectTrigger());
m_tree.getSelectionModel().setSelectionMode( TreeSelectionModel.SINGLE_TREE_SELECTION );
m_tree.setShowsRootHandles(true);
m_tree.setEditable(false);
JScrollPane panePane = new JScrollPane();
panePane.getViewport().add(m_tree);
setLayout(new BoxLayout(this, BoxLayout.Y_AXIS));
add(panePane);
}
public void changePanel(JPanel paneToShow) {
if ( compTarget.getComponentCount() > 0 ) {
compTarget.removeAll();
}
compTarget.add( paneToShow );
compTarget.paintAll( paneToShow.getGraphics() );
}
DefaultMutableTreeNode getTreeNode(TreePath path) {
return (DefaultMutableTreeNode)(path.getLastPathComponent());
}
}
Fichier PaneEssai.java
import java.awt.BorderLayout;
import java.awt.GridBagConstraints;
import java.awt.GridBagLayout;
import java.awt.Insets;
import javax.swing.JLabel;
import javax.swing.JPanel;
import javax.swing.JTextField;
public class PaneEssai extends JPanel {
private PanelStars objPanelStars;
public PaneEssai(String sLib) {
super();
buildPanel(sLib);
}
protected void buildPanel(String sLib) {
JPanel pPanel = new JPanel();
pPanel.setLayout(new GridBagLayout());
GridBagConstraints constraints = new GridBagConstraints();
constraints.insets = new Insets(20,10,0,10);
constraints.weighty = 0.0;
constraints.weightx = 1.0;
constraints.fill = GridBagConstraints.NONE;
constraints.anchor = GridBagConstraints.NORTHWEST ;
constraints.gridx = 0;
constraints.gridy = 0;
pPanel.add(new JLabel("Un label"),constraints);
constraints.gridx = 2;
constraints.gridx = 1;
constraints.gridy = 0;
pPanel.add(new JTextField(sLib, 15) ,constraints);
constraints.gridx = 0;
constraints.gridy = 1;
constraints.gridwidth = 2;
objPanelStars = new PanelStars(0);
pPanel.add(objPanelStars, constraints);
add (pPanel, BorderLayout.NORTH);
}
}
Fichier PanelStars.java
import java.awt.FlowLayout;
import java.awt.event.ActionEvent;
import java.awt.event.MouseEvent;
import java.awt.event.MouseListener;
import java.util.Vector;
import javax.swing.AbstractAction;
import javax.swing.Action;
import javax.swing.ImageIcon;
import javax.swing.JLabel;
import javax.swing.JPanel;
import javax.swing.JPopupMenu;
public class PanelStars extends JPanel {
MouseListener actButtonAction = new MouseListener() {
public void mouseClicked(MouseEvent arg0) {
}
public void mouseEntered(MouseEvent arg0) {
}
public void mouseExited(MouseEvent arg0) {
}
public void mousePressed(MouseEvent arg0) {
}
public void mouseReleased(MouseEvent arg0) {
if (arg0.isPopupTrigger() ) {
if (objPopUp != null) {
int x = arg0.getX();
int y = arg0.getY() + 20;
objPopUp.show((StarLabel) arg0.getSource(), x, y);
}
return;
}
StarLabel objSrc = (StarLabel) arg0.getSource();
int iLim = objSrc.getNum();
refreshNbStars (iLim, false);
}
};
private static JPopupMenu objPopUp = null;
private final static String sCleanLib = "Clean";
private final static ImageIcon imgClean = new ImageIcon("clean.gif");
private int iNbStars;
private Vector vStars;
public PanelStars() {
this(0);
}
public PanelStars(int iNbStarsP) {
super();
buildWindow(iNbStarsP);
if (objPopUp == null) {
objPopUp = new JPopupMenu();
Action a1 = new AbstractAction(sCleanLib, imgClean) {
public void actionPerformed(ActionEvent e) {
refreshNbStars (0, true);
}
};
objPopUp.add(a1);
}
}
private void buildWindow(int iNbStarsP) {
boolean bSet;
setLayout( new FlowLayout(FlowLayout.RIGHT, 10, 10) );
vStars = new Vector(5);
iNbStars = iNbStarsP;
this.add ( new JLabel("Nombre d'étoile : ") );
StarLabel objStar;
for (int iCpt=1; iCpt <= 5; iCpt++ ) {
bSet = (iCpt <= iNbStarsP);
objStar = new StarLabel(iCpt, bSet, actButtonAction);
vStars.add(objStar);
this.add (objStar);
}
objStar = null;
}
public int getNbStars() {
return iNbStars;
}
private void refreshNbStars(int iNbStarsToSet, boolean bForceP) {
int iCpt;
if (!bForceP && iNbStarsToSet == 1 && iNbStars == 1) {
iNbStars = 0;
iNbStarsToSet = -1;
} else {
iNbStars = iNbStarsToSet--;
}
for (iCpt = 0; iCpt <= iNbStarsToSet; iCpt++) {
((StarLabel) vStars.get(iCpt)).setStarStatus(true);
}
for (iCpt = iNbStarsToSet + 1; iCpt < vStars.size(); iCpt++) {
((StarLabel) vStars.get(iCpt)).setStarStatus(false);
}
}
public void setNbStars(int iNbStarsP) {
refreshNbStars (iNbStarsP, true);
}
}
Fichier StarLabel.java
import java.awt.event.MouseListener;
import javax.swing.ImageIcon;
import javax.swing.JLabel;
public class StarLabel extends JLabel {
private final static ImageIcon objStarSet = new ImageIcon("star.gif");
private final static ImageIcon objStarUnSet = new ImageIcon("starbw.gif");
private boolean bSet;
private int iNum;
public StarLabel(int iNumP, boolean bSetP, MouseListener actStarP) {
super();
this.setStarStatus(bSetP);
this.addMouseListener( actStarP );
iNum = iNumP;
}
public int getNum () {
return iNum;
}
public void setStarStatus(boolean bSetP) {
bSet = bSetP;
if (bSet) {
setIcon(objStarSet);
} else {
setIcon(objStarUnSet);
}
}
}