Probleme d'appel à paint en Java

Fermé
lou - 1 mai 2008 à 12:31
 lou - 8 août 2008 à 09:11
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:

import java.awt.*;
import java.awt.event.*;
import java.io.IOException;
import java.lang.reflect.InvocationTargetException;

import javax.swing.*;
import javax.swing.text.*;


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;


protected JLabel actionLabel;
protected JButton button;
protected JTextField color;
protected JTextField size;
protected JLabel Labelcolor;
protected JLabel Labelsize;
protected JCanvasGenerique tetravex;


@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();

textControlsPane.setLayout(gridbag);

JLabel[] labels = {Labelcolor, Labelsize };
JTextField[] textFields = {color, size};
addLabelTextRows(labels, textFields, gridbag, textControlsPane);
textControlsPane.add(button);
c.gridwidth = GridBagConstraints.REMAINDER; //last
c.anchor = GridBagConstraints.WEST;
c.weightx = 1.0;
textControlsPane.add(actionLabel, c);
textControlsPane.setBorder(
BorderFactory.createCompoundBorder(
BorderFactory.createTitledBorder("Parameters"),
BorderFactory.createEmptyBorder(5,5,5,5)));



//creer un tetravex vide, taille par defaut.

tetravex = new JCanvasVide();
tetravex.setBackground(Color.WHITE);
tetravex.setVisible(true);
//tetravex.setAlignmentY(Component.CENTER_ALIGNMENT);
//tetravex.setAlignmentX(Component.CENTER_ALIGNMENT);

JPanel tetravexContainer = new JPanel();
tetravexContainer.setLayout(new GridLayout(1,1));
tetravexContainer.setBorder(
BorderFactory.createCompoundBorder(
BorderFactory.createTitledBorder("Tetravex"),
BorderFactory.createEmptyBorder(5,5,5,5)));
tetravexContainer.setOpaque(false);
tetravexContainer.add(tetravex);


JPanel rightPane = new JPanel(new BorderLayout());
rightPane.add(tetravexContainer,
BorderLayout.CENTER);
//rightPane.setAlignmentY(Component.CENTER_ALIGNMENT);


//Put everything together.


JPanel leftPane = new JPanel(new BorderLayout());
leftPane.add(textControlsPane,
BorderLayout.PAGE_END);
//leftPane.setAlignmentY(Component.CENTER_ALIGNMENT);
conteneur.add(rightPane);
conteneur.add(leftPane);
//tetravex.reshape(20, 20, 30, 30);
//Display the window.
add(conteneur);
pack();
//set size manualy: how to do this diferently?
setSize(500, 230);
setVisible(true);




}

private void addLabelTextRows(JLabel[] labels,
JTextField[] textFields,
GridBagLayout gridbag,
Container container) {
GridBagConstraints c = new GridBagConstraints();
c.anchor = GridBagConstraints.EAST;
int numLabels = labels.length;

for (int i = 0; i < numLabels; i++) {
c.gridwidth = GridBagConstraints.RELATIVE; //next-to-last
c.fill = GridBagConstraints.NONE; //reset to default
c.weightx = 0.0; //reset to default
container.add(labels[i], c);

c.gridwidth = GridBagConstraints.REMAINDER; //end row
c.fill = GridBagConstraints.HORIZONTAL;
c.weightx = 1.0;
container.add(textFields[i], c);
}
}

public void actionPerformed(ActionEvent e) {
if ("launch".equals(e.getActionCommand())) {
button.setEnabled(false);
//System.out.println(color.getText());
//System.out.println(size.getText());
try{
String couleur = color.getText();
System.out.println("color contient:" +couleur);
String taille = size.getText();
System.out.println("size contient:" +taille);
try{
nombreCase = Integer.parseInt(taille.trim());
System.out.print("nombreCase contient:");
System.out.println(nombreCase);
nombreCouleur = Integer.parseInt(couleur.trim());
System.out.print("nombreCouleur contient:");
System.out.println(nombreCouleur);
try{
dessinetetravex(nombreCase,nombreCouleur);
button.setEnabled(true);
}
catch(Exception exception1){
System.out.println("erreur dans action performed: dessiner tetravex");
}
}

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?
A voir également:

1 réponse

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 !
0
merci mais j'ai déjà résolu de problème en enlevant la structure en héritage de Jcanvas qui n'était pas adapté en fait!
merci.
0