lloyds | Bonjour à tous,
Je développe un outil en java qui doit permettre d'afficher les points de perçage d'une carte électronique à partir d'un fichier de perçage.
Je fais la lecture du fichier et l'affichage dans un JPanel qui est dans un JFrame. Or lors de l'affichage de mes points, l'affichage se fait correctement mais immediatement après tous les points que j'affiche dans des coordonnées se trouvant à peu prés dans les x<400 et les y<400 disparait et donc j'ai une partie de l'affichage qui disparait.
Cela me pose beaucoup de problème j'ai pour l'instant détourné le problème en n'ecrivant pas dans cette partie mais je ne trouve pas cela tres propre.
Ci joint mon code d'affichage
Code :
- import java.util.regex.Pattern;
- import java.awt.*;
- import java.awt.event.*;
- import java.io.File;
- import java.io.FileInputStream;
- import java.io.IOException;
- import java.util.Properties;
- import java.io.RandomAccessFile;
- import java.awt.Point;
- import javax.swing.*;
- /**
- Main file for SerialDemo program. This program illustrates many of the
- abilities of the javax.comm api. This file contains the GUI framework that
- the program runs in.
- */
- public class SerialDemo extends JFrame implements ActionListener {
- final int HEIGHT = 700;
- final int WIDTH = 1280;
-
- private MenuBar mb;
- private Menu fileMenu;
- private MenuItem openItem;
- private MenuItem closeItem;
- private MenuItem loadItem;
- private MenuItem exitItem;
- private Button openButton;
- private Button closeButton;
- private JPanel buttonPanel;
- private JPanel padPanel;
- //private ConfigurationPanel configurationPanel;
- private SerialParameters parameters;
- private SerialConnection connection;
- private Properties props = null;
-
- private Point [][] coord=new Point[50][1000];
- private Pad [] pastille=new Pad [50000];
-
- /**
- Main method. Checks to see if the command line agrument is requesting
- usage informaition (-h, -help), if it is, display a usage message and
- exit, otherwise create a new <code>SerialDemo</code> and set it visible.
- */
- public static void main(String[] args)
- {
- if ((args.length > 0) && (args[0].equals("-h" )|| args[0].equals("-help" )))
- {
- System.out.println("usage: java SerialDemo [configuration File]" );
- System.exit(1);
- }
- SerialDemo serialDemo = new SerialDemo(args);
- serialDemo.setVisible(true);
- serialDemo.repaint();
- }
- /**
- Create new <code>SerialDemo</code> and initilizes it. Parses args to
- find configuration file. If found, initial state it set to parameters
- in configuration file.
-
- @param args command line arguments used when program was invoked.
- */
- public SerialDemo(String[] args)
- {
- super("Percage de carte" );
- parameters = new SerialParameters();
- padPanel = new JPanel();
- getContentPane().add(padPanel,"North" );
- // Set up the GUI for the program
- addWindowListener(new CloseHandler(this));
- mb = new MenuBar();
- fileMenu = new Menu("Fichier" );
- openItem = new MenuItem("Ouvrir Port Serie" );
- openItem.addActionListener(this);
- fileMenu.add(openItem);
- closeItem = new MenuItem("Fermer Port Serie" );
- closeItem.addActionListener(this);
- closeItem.setEnabled(false);
- fileMenu.add(closeItem);
- loadItem = new MenuItem("Charger fichier drill" );
- loadItem.addActionListener(this);
- fileMenu.add(loadItem);
- exitItem = new MenuItem("Sortir" );
- exitItem.addActionListener(this);
- fileMenu.add(exitItem);
- //configurationPanel = new ConfigurationPanel(this);
- mb.add(fileMenu);
- setMenuBar(mb);
- //padPanel = new JPanel(new BorderLayout());
- parseArgs(args);
- connection = new SerialConnection(this, parameters);
- Dimension screenSize = Toolkit.getDefaultToolkit().getScreenSize();
- setLocation(screenSize.width/2-WIDTH/2,0);//screenSize.height/2-HEIGHT/2+100);
- setSize(WIDTH, HEIGHT);
- setResizable(false);
- }
- /**
- Responds to the menu items and buttons.
- */
- public void actionPerformed(ActionEvent e)
- {
- String cmd = e.getActionCommand();
- // Loads a configuration file.
- if (cmd.equals("Charger fichier drill" ))
- {
- FileDialog fd = new FileDialog(this,
- "Load Port Configuration",FileDialog.LOAD);
- fd.setVisible(true);
- String file = fd.getFile();
- if (file != null)
- {
- String dir = fd.getDirectory();
- File f = new File(dir + file);
-
- try
- {
- RandomAccessFile raf = new RandomAccessFile(f, "r" );
-
- String ligne;
- String [] fichierContenu;
- fichierContenu=new String[50000];
-
- int compteur=0;;
-
- while ( (ligne = raf.readLine()) != null )
- {
- if(compteur>=12)
- fichierContenu[compteur] = ligne; // on enregsitre à partir de la 12eme ligne puisque les lignes d'avant ne nous interessent pas
- compteur++;
- }
-
- int comptage=0;
- double xInt=0,yInt=0;
- double [] tInt=new double[50000];
- int compte=0;
-
- //Initialisation du tableau de Point
- for(int j=0;j<50;j++) // valeur arbitraire de 50 differentes tailles de trou
- for(int k=0;k<1000;k++)// valeur arbitraire de 200 trou par taille de trou
- coord[j][k]=new Point();//Creation d'un point en (0,0)
-
- int croute=1;
- String norme="";
- boolean xCon=false,trou=false,yCon=false;
- //On va ranger les points dans le tableau de points
- for (int i=12;i<compteur;++i) //on commence à 12 car les 11 premieres lignes ne nous interessent pas
- {
- trou=false;
- xCon=false;
- yCon=false;
-
- for (int t=17;t<75;t++)//on boucle sur la ligne on considere maximum 75 caracteres par lignes
- {//et on boucle à partir du 17eme caracteres car les premiers caracteres sont vides
-
- //On recherche les caracteres alphabetiques
- if(trou==false && (Pattern.matches("[a-zA-Z]",fichierContenu[i].substring(t,t+1))
- ||fichierContenu[i].substring(t,t+2).equals(".." )))
- {//La premiere serie correspond à la taille du trou
-
- //On crée trop de trous differents il faut crée un trou par taille pour çà qu'on depasse la taille de 50 trous
-
- tInt[croute]=new Float(fichierContenu[i].substring(t-12,t-2).split("[a-zA-Z]" )[0]).doubleValue();
-
- //System.out.println("tInt= "+tInt[croute]);
- croute++;
-
- if(norme!=fichierContenu[i].substring(t, t+2))
- norme=fichierContenu[i].substring(t, t+2);
-
- t=t+2;
- trou=true;
- }
- else if(Pattern.matches("[a-zA-Z]",fichierContenu[i].substring(t,t+1)) && xCon==false)
- {//La deuxieme serie correspond à la position en X
- xInt=new Float(fichierContenu[i].substring(t-9, t-1)).doubleValue();
- t=t+2;
- xCon=true;
- }
- else if(Pattern.matches("[a-zA-Z]",fichierContenu[i].substring(t, t+1)) && yCon==false)
- {//et enfin ici on a la position en Y
- yInt=new Float(fichierContenu[i].substring(t-9, t-1)).doubleValue();
- t=t+2;
- yCon=true;
- }
- }
-
- System.out.println("xInt= "+ xInt);
- System.out.println("yInt= "+ yInt);
-
- coord[compte][comptage].move((int) xInt,(int) yInt);
- //on crée un Point avec les coordonnées trouvées dans le fichier drill
- comptage++;
- }
-
- double xMax=0,yMax=0,xMin=0,yMin=0;
- double tMax=0,tMin=0;
- int compt=0,cpt=0;
- for(int j=0;j<50;j++)
- {
- if(cpt==0 && tInt[j]!=0) //car les numeros de trous commencent à 1
- {//on met tMin une valeur existante pour que sa valeur
- //puisse etre modifiée car sinon on ne pourrait jamais
- //etre inferieur à une valeur d'initialisation de 0
- tMin=tInt[j];
- cpt=1;
- }
-
- if(tInt[j]>tMax && tInt[j]!=0)
- tMax=tInt[j];
-
- if(tInt[j]<tMin && tInt[j]!=0)
- tMin=tInt[j];
-
-
- //il nous faut trouver le y max et min pour xmax ce qui va nous permettre de choisir le point à valider par l'utilisateur
- //donc faut faire une boucle en dessous qui va choisir ces valeurs
- //ensuite on devra faire le meme pour x et valider les points choisis pour faire le vecteur
- //directeur
-
- for(int k=0;k<1000;k++)
- {
- if(coord[j][k].getX()!=0 && coord[j][k].getY()!=0)
- {
- if(compt==0)
- {//on met xMin et yMin a une valeur existante pour que sa valeur
- //puisse etre modifiée car sinon on ne pourrait jamais
- //etre inferieur à une valeur d'initialisation de 0
- xMin=(int) coord[j][k].getX();
- xMax=(int) coord[j][k].getX();
- yMin=(int) coord[j][k].getY();
- yMax=(int) coord[j][k].getY();
- compt=1;
- }
- //on enregistre les coordonnées extremes
- if(coord[j][k].getX()>xMax)
- xMax=(int) coord[j][k].getX();
- else if(coord[j][k].getX()<xMin)
- xMin=(int) coord[j][k].getX();
- if(coord[j][k].getY()>yMax)
- yMax=(int) coord[j][k].getY();
- else if(coord[j][k].getY()<yMin)
- yMin=(int) coord[j][k].getY();
- }
- }
- }
-
- double attente=0;
- //on echange les positions maximales et minimales si les coordonnées sont negatives
- if (xMax<-1)
- {
- attente=xMax;
- xMax=xMin;
- xMin=attente;
- }
-
- if (yMax<-1)
- {
- attente=yMax;
- yMax=yMin;
- yMin=attente;
- }
-
- if((xMax<1000 && xMax>10)||(xMax<-10 && xMax>-1000))
- {//on multiplie par 100 les coordonnées qui ton inferieur à 1000
- for(int t=0;t<50;t++)
- for(int u=0;u<1000;u++)
- coord[t][u].move((int) coord[t][u].getX()*100,(int)coord[t][u].getY());
- xMax=xMax*100;
- }
-
- if((yMax<1000 && yMax>10)||(yMax<-10 && yMax>-1000))
- {
- for(int t=0;t<50;t++)
- for(int u=0;u<1000;u++)
- coord[t][u].move((int) coord[t][u].getX(),(int)coord[t][u].getY()*100);
- yMax=yMax*100;
- }
-
- double xEch= 2*xMax/(WIDTH-100),yEch= yMax/(HEIGHT-300);
- double xDepl=0;
-
-
- System.out.println(" xMin ="+xMin);
- System.out.println("xEch= "+xEch+" xMax ="+xMax+" WIDTH= "+WIDTH);
- System.out.println("yEch= "+yEch+" yMax ="+yMax+" HEIGHT= "+HEIGHT);
-
- if(xMin/xEch<500)
- {//on crée un deplacement en X pour ne pas arriver sur le bug graphique
- xDepl=500-xMin/xEch;
- //System.out.println("c inferieur à 400" );
- }
- //else xDepl=50;
-
- for(int t=0;t<50;t++)
- for(int u=0;u<1000;u++)
- {
- if (coord[t][u].getX()!=0 || coord[t][u].getY()!=0)
- {
- pastille[t*u]=new Pad(getContentPane(),new Point((int) xDepl + (int) coord[t][u].getX()/(int) xEch,50+ (int) coord[t][u].getY()/(int) yEch),4);
- pastille[t*u].dessin(Color.BLACK);
- }
- }
- pastille[2000]=new Pad(getContentPane(),new Point(500,400),50);
- pastille[2000].dessin(Color.RED);
- //pastille[2001]=new Pad(getContentPane(),new Point(850,150),50);
- //pastille[2001].dessin(Color.GREEN);
- //padPanel.repaint();
- }
- catch (IOException e2){System.out.println("erreur dans: " + e2);}}
- }
- // Calls shutdown, which exits the program.
- if (cmd.equals("Sortir" )) {
- shutdown();
- }
- // Opens a port.
- if (cmd.equals("Ouvrir Port Serie" ))
- {
- openItem.setEnabled(false);//on active le bouton
- Cursor previousCursor = getCursor();
- setNewCursor(Cursor.getPredefinedCursor(Cursor.WAIT_CURSOR));
- //configurationPanel.setParameters();
-
- try {connection.openConnection();}//on ouvre le port serie
- catch (SerialConnectionException e2) {
- AlertDialog ad = new AlertDialog(this,"Error Opening Port!",
- "Error opening port,", e2.getMessage() + ".",
- "Select new settings, try again." ); openItem.setEnabled(true);
- setNewCursor(previousCursor);return;}
-
- portOpened();
- setNewCursor(previousCursor);
- }
- // Closes a port.
- if (cmd.equals("Fermer Port Serie" )) {portClosed();}
- }
- /**
- Toggles the buttons to an open port state.
- */
- public void portOpened()
- {
- openItem.setEnabled(false);
- closeItem.setEnabled(true);
- }
- /**
- Calls closeConnection on the SerialConnection and toggles the buttons
- to a closed port state.
- */
- public void portClosed()
- {
- connection.closeConnection();
- openItem.setEnabled(true);
- closeItem.setEnabled(false);
- }
- /**
- Sets the <code>Cursor</code> for the application.
- @param c New <code>Cursor</code>
- */
- private void setNewCursor(Cursor c) {setCursor(c);}
- /**
- Cleanly shuts down the applicaion. first closes any open ports and
- cleans up, then exits.
- */
- private void shutdown()
- {
- connection.closeConnection();
- System.exit(1);
- }
- /**
- Finds configuration file in arguments and creates a properties object from
- that file.
- */
- private void parseArgs(String[] args)
- {
- if (args.length < 1){return;}
- File f = new File(args[0]);
- if (!f.exists())
- {
- f = new File(System.getProperty("user.dir" )
- + System.getProperty("path.separator" )+ args[0]);
- }
- if (f.exists())
- {
- try
- {
- FileInputStream fis = new FileInputStream(f);
- props = new Properties();
- props.load(fis);
- fis.close();
- }
- catch (IOException e) {}
- }
- }
- /**
- Handles closing down system. Allows application to be closed with window
- close box.
- */
- class CloseHandler extends WindowAdapter
- {
- SerialDemo sd;
- public CloseHandler(SerialDemo sd)
- {
- this.sd = sd;
- sd.repaint();
- }
- public void windowClosing(WindowEvent e) {sd.shutdown();}
- }
- }
|
et voici la pastille à afficher
Code :
- /*
- * Created on 16 févr. 2005
- *
- * TODO To change the template for this generated file go to
- * Window - Preferences - Java - Code Style - Code Templates
- */
- /**
- * @author Benoit
- *
- * Cette classe crée une pastille sur la carte
- */
- import java.awt.*;
- public class Pad {
- private Graphics gr;
- private Color fond;
- private Component cadre;
- private int x,y,diametre;
- /**
- *
- */
- public Pad(Component cad,Point coordonnees,int diam)
- {
- super();
- cadre=cad;
- gr=cadre.getGraphics();
- fond=cadre.getBackground();
- x=(int) coordonnees.getX();
- y=(int) coordonnees.getY();
- diametre=diam;
- // TODO Auto-generated constructor stub
- }
- public void dessin(Color col)
- {
- gr.setColor(col);
- gr.fillOval(x,y,diametre,diametre);
- }
- }
|
Merci de votre aide je sais j'ai posté beaucoup de code mais au moins vous avez toutes les données en mains |