Bonjour,
je cherche à créer une fenêtre en java, qui contient deux champs de texte, un bouton et une image(un tetravex en fait), de telle sorte que quand j'appuie sur le bouton, l'image change ( dessine un tetravex avec le nombre de case et de couleur que j'aurais entrés dans les champs de texte). J'ai écris le programme suivant:
public class FrameTetravex extends JFrame implements ActionListener{
protected static final String textFieldcolor = "number of color";
protected static final String textFieldsize = "size";
protected static final String buttonString = "launch";
protected static final int tailleCase = JCanvasGenerique.tailleCase;
public static int nombreCase =3;
public static int nombreCouleur = 1;
@SuppressWarnings("deprecation")
public FrameTetravex() {
super("TetravexDemo");
setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
GridLayout grid = new GridLayout(1,2);
JPanel conteneur = new JPanel();
conteneur.setLayout(grid);
//button launch
ImageIcon leftButtonIcon = new ImageIcon();
button = new JButton(buttonString, leftButtonIcon);
button.setVerticalTextPosition(AbstractButton.CENTER);
button.setHorizontalTextPosition(AbstractButton.LEADING);
button.setMnemonic(KeyEvent.VK_D);
button.setActionCommand("launch");
button.addActionListener(this);
button.setToolTipText("Click this button to launch tetravex.");
//add(button);
conteneur.setOpaque(true);
//Create regular text fields.
color = new JTextField(3);
color.setActionCommand(textFieldcolor);
//color.addActionListener(this);
size = new JTextField(3);
size.setActionCommand(textFieldsize);
//size.addActionListener(this);
//Create labels for the fields.
Labelcolor = new JLabel(textFieldcolor + ": ");
Labelcolor.setLabelFor(color);
Labelsize = new JLabel(textFieldsize + ": ");
Labelsize.setLabelFor(size);
//Create a label to put messages during an action event.
actionLabel = new JLabel("complete the fields and press launch.");
actionLabel.setBorder(BorderFactory.createEmptyBorder(10,0,0,0));
//Lay out the text controls and the labels.
JPanel textControlsPane = new JPanel();
GridBagLayout gridbag = new GridBagLayout();
GridBagConstraints c = new GridBagConstraints();
catch(Exception exception2){
System.out.println("erreur dans action performed: conversion entier");
}
}
catch(Exception exception){
System.out.println("erreur dans action performed: label");
}
//finally{
//System.out.println("erreur dans action performed");
//}
}
else {
button.setEnabled(true);
}
}
public void dessinetetravex(int nombreCase, int nombreCouleur){
//affecter nombreCase et nombreCouleur avant new?
System.out.println("on dessine tetravex");
tetravex= new JCanvas();
tetravex.setVisible(true);
System.out.println("le tetravex est cree");
tetravex.setPreferredSize(new Dimension(tailleCase*nombreCase,tailleCase*nombreCase));
//forcer la peinture du tetravex
//tetravex.repaint();
//tetravex.paint(this.getGraphics());
tetravex.setVisible(true);
tetravex.revalidate();
tetravex.repaint();
//comment faire pour redesssiner?
this.pack();
this.setSize(500, 230); // en fonction de nombreCase
this.setVisible(true);
}
/**
* Create the GUI and show it. For thread safety,
* this method should be invoked from the
* event dispatch thread.
* @throws InvocationTargetException
* @throws InterruptedException
*/
public static void main(String[] args) throws InterruptedException, InvocationTargetException {
//Schedule a job for the event dispatching thread:
//creating and showing this application's GUI.
SwingUtilities.invokeLater(new Runnable() {
public void run() {
try{
FrameTetravex frame = new FrameTetravex();
frame.setVisible(true);
System.out.println("appel au run");
}
catch(Exception e){System.out.println("erreur dans le run");}
}
});
}
}
JCanvasGenerique étend JPanel et possède deux sous classe, JCanvas et JCanvasVide, chacune redéfinisant leur paint propre.
Quand j'appuie sur le bouton l'actionPerformed est bien appelé ainsi que le dessinetetravex mais pas le paint de JCanvas, l'image n'est pas modifier dans ma fenêtre.
Savez-vous comment faire pour que le paint soit appelé et l'image modifiée?
Dans ton paint je JCanvas, il faut utiliser drawImage(.... ,ImageObserver);
ImageObserver c'est le JPanel qui est au dessus...
Normalement, ton image devrait se rafraichir !
8 août 2008 à 09:11
merci.