[swing] affichage qui disparait en partie

affichage qui disparait en partie [swing] - Java - Programmation

Marsh Posté le 06-03-2005 à 16:27:31    

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 :
  1. import java.util.regex.Pattern;
  2. import java.awt.*;
  3. import java.awt.event.*;
  4. import java.io.File;
  5. import java.io.FileInputStream;
  6. import java.io.IOException;
  7. import java.util.Properties;
  8. import java.io.RandomAccessFile;
  9. import java.awt.Point;
  10. import javax.swing.*;
  11. /**
  12. Main file for SerialDemo program. This program illustrates many of the  
  13. abilities of the javax.comm api. This file contains the GUI framework that
  14. the program runs in.
  15. */
  16. public class SerialDemo extends JFrame implements ActionListener {
  17.     final int HEIGHT = 700;
  18.     final int WIDTH  = 1280;
  19.  
  20.     private MenuBar mb;
  21.     private Menu fileMenu;
  22.     private MenuItem openItem;
  23.     private MenuItem closeItem;
  24.     private MenuItem loadItem;
  25.     private MenuItem exitItem;
  26.     private Button openButton;
  27.     private Button closeButton;
  28.     private JPanel buttonPanel;
  29.     private JPanel padPanel;
  30.     //private ConfigurationPanel configurationPanel;
  31.     private SerialParameters parameters;
  32.     private SerialConnection connection;
  33.     private Properties props = null;
  34.    
  35.     private Point [][] coord=new Point[50][1000];
  36.     private Pad [] pastille=new Pad [50000];
  37.    
  38.     /**
  39.     Main method. Checks to see if the command line agrument is requesting
  40.     usage informaition (-h, -help), if it is, display a usage message and
  41.     exit, otherwise create a new <code>SerialDemo</code> and set it visible.
  42.     */
  43.     public static void main(String[] args)
  44.     {
  45. if ((args.length > 0) && (args[0].equals("-h" )|| args[0].equals("-help" )))
  46. {
  47.     System.out.println("usage: java SerialDemo [configuration File]" );
  48.     System.exit(1);
  49. }
  50. SerialDemo serialDemo = new SerialDemo(args);
  51. serialDemo.setVisible(true);
  52. serialDemo.repaint();
  53. }
  54.     /**
  55.     Create new <code>SerialDemo</code> and initilizes it. Parses args to
  56.     find configuration file. If found, initial state it set to parameters
  57.     in configuration file.
  58.     @param args command line arguments used when program was invoked.
  59.     */
  60.     public SerialDemo(String[] args)
  61.     {
  62. super("Percage de carte" );
  63. parameters = new SerialParameters();
  64. padPanel = new JPanel();
  65. getContentPane().add(padPanel,"North" );
  66. // Set up the GUI for the program
  67. addWindowListener(new CloseHandler(this));
  68. mb = new MenuBar();
  69. fileMenu = new Menu("Fichier" );
  70. openItem = new MenuItem("Ouvrir Port Serie" );
  71. openItem.addActionListener(this);
  72. fileMenu.add(openItem);
  73. closeItem = new MenuItem("Fermer Port Serie" );
  74. closeItem.addActionListener(this);
  75. closeItem.setEnabled(false);
  76. fileMenu.add(closeItem);
  77. loadItem = new MenuItem("Charger fichier drill" );
  78. loadItem.addActionListener(this);
  79. fileMenu.add(loadItem);
  80. exitItem = new MenuItem("Sortir" );
  81. exitItem.addActionListener(this);
  82. fileMenu.add(exitItem);
  83. //configurationPanel = new ConfigurationPanel(this);
  84. mb.add(fileMenu);
  85. setMenuBar(mb);
  86. //padPanel = new JPanel(new BorderLayout());
  87. parseArgs(args);
  88. connection = new SerialConnection(this, parameters);
  89. Dimension screenSize = Toolkit.getDefaultToolkit().getScreenSize();
  90. setLocation(screenSize.width/2-WIDTH/2,0);//screenSize.height/2-HEIGHT/2+100);
  91. setSize(WIDTH, HEIGHT);
  92. setResizable(false);
  93. }
  94.     /**
  95.     Responds to the menu items and buttons.
  96.     */
  97.     public void actionPerformed(ActionEvent e)
  98.     {
  99. String cmd = e.getActionCommand();
  100. // Loads a configuration file.
  101. if (cmd.equals("Charger fichier drill" ))
  102. {
  103.  FileDialog fd = new FileDialog(this,
  104.     "Load Port Configuration",FileDialog.LOAD);
  105.  fd.setVisible(true);
  106.  String file = fd.getFile();
  107.  if (file != null)
  108.  {
  109.      String dir = fd.getDirectory();
  110.      File f = new File(dir + file);
  111.     
  112.      try
  113.   {
  114.        RandomAccessFile raf = new RandomAccessFile(f, "r" );
  115.     
  116.        String ligne;
  117.        String [] fichierContenu;
  118.        fichierContenu=new String[50000];
  119.    
  120.        int compteur=0;;
  121.    
  122.        while ( (ligne = raf.readLine()) != null )
  123.          {
  124.         if(compteur>=12)
  125.          fichierContenu[compteur] = ligne; // on enregsitre à partir de la 12eme ligne puisque les lignes d'avant ne nous interessent pas
  126.         compteur++;
  127.          }
  128.       
  129.        int comptage=0;
  130.        double  xInt=0,yInt=0;
  131.        double [] tInt=new double[50000];
  132.        int compte=0;
  133.       
  134.        //Initialisation du tableau de Point
  135.        for(int j=0;j<50;j++)  // valeur arbitraire de 50 differentes tailles de trou
  136.         for(int k=0;k<1000;k++)// valeur arbitraire de 200 trou par taille de trou
  137.             coord[j][k]=new Point();//Creation d'un point en (0,0)
  138.       
  139.        int croute=1;
  140.        String norme="";
  141.        boolean xCon=false,trou=false,yCon=false;
  142.        //On va ranger les points dans le tableau de points
  143.        for (int i=12;i<compteur;++i) //on commence à 12 car les 11 premieres lignes ne nous interessent pas
  144.        {
  145.         trou=false;
  146.         xCon=false;
  147.         yCon=false;
  148.       
  149.        for (int t=17;t<75;t++)//on  boucle sur la ligne on considere maximum 75 caracteres par lignes
  150.        {//et on boucle à partir du 17eme caracteres car les premiers caracteres sont vides
  151.       
  152.         //On recherche les caracteres alphabetiques
  153.       if(trou==false && (Pattern.matches("[a-zA-Z]",fichierContenu[i].substring(t,t+1))
  154.       ||fichierContenu[i].substring(t,t+2).equals(".." )))
  155.    {//La premiere serie correspond à la taille du trou
  156.     
  157. //On crée trop de trous differents il faut crée un trou par taille pour çà qu'on depasse la taille de 50 trous
  158.     
  159.          tInt[croute]=new Float(fichierContenu[i].substring(t-12,t-2).split("[a-zA-Z]" )[0]).doubleValue();
  160.        
  161.        //System.out.println("tInt= "+tInt[croute]);
  162.          croute++;
  163.        
  164.          if(norme!=fichierContenu[i].substring(t, t+2))
  165.             norme=fichierContenu[i].substring(t, t+2);
  166.        
  167.          t=t+2;
  168.          trou=true;
  169.          }
  170.        else if(Pattern.matches("[a-zA-Z]",fichierContenu[i].substring(t,t+1)) && xCon==false)
  171.          {//La deuxieme serie correspond à la position en X
  172.           xInt=new Float(fichierContenu[i].substring(t-9, t-1)).doubleValue();
  173.           t=t+2;
  174.           xCon=true;
  175.          }
  176.          else if(Pattern.matches("[a-zA-Z]",fichierContenu[i].substring(t, t+1)) && yCon==false)
  177.          {//et enfin ici on a la position en Y
  178.           yInt=new Float(fichierContenu[i].substring(t-9, t-1)).doubleValue();
  179.           t=t+2;
  180.           yCon=true;
  181.          }
  182.            }
  183.       
  184.          System.out.println("xInt= "+ xInt);
  185.          System.out.println("yInt= "+ yInt);
  186.       
  187.        coord[compte][comptage].move((int) xInt,(int) yInt);
  188.          //on crée un Point avec les coordonnées trouvées dans le fichier drill
  189.          comptage++;
  190.         }
  191.       
  192.      double xMax=0,yMax=0,xMin=0,yMin=0;
  193.      double tMax=0,tMin=0;
  194.      int compt=0,cpt=0;
  195.      for(int j=0;j<50;j++)
  196.      {
  197.       if(cpt==0 && tInt[j]!=0) //car les numeros de trous commencent à 1
  198.    {//on met tMin  une valeur existante pour que sa valeur  
  199.       //puisse etre modifiée car sinon on ne pourrait jamais  
  200.       //etre inferieur à une valeur d'initialisation de 0
  201.       tMin=tInt[j];
  202.       cpt=1;
  203.       }
  204.     
  205.       if(tInt[j]>tMax && tInt[j]!=0)
  206.        tMax=tInt[j];
  207.     
  208.       if(tInt[j]<tMin && tInt[j]!=0)
  209.        tMin=tInt[j];
  210.       
  211.     
  212.       //il nous faut trouver le y max et min pour xmax ce qui va nous permettre de choisir le point à valider par l'utilisateur
  213.       //donc faut faire une boucle en dessous qui va choisir ces valeurs
  214.       //ensuite on devra faire le meme pour x et valider les points choisis pour faire le vecteur
  215.       //directeur
  216.     
  217.       for(int k=0;k<1000;k++)
  218.         {
  219.          if(coord[j][k].getX()!=0 && coord[j][k].getY()!=0)
  220.           {
  221.           if(compt==0)
  222.            {//on met xMin et yMin a une valeur existante pour que sa valeur  
  223.            //puisse etre modifiée car sinon on ne pourrait jamais  
  224.            //etre inferieur à une valeur d'initialisation de 0
  225.            xMin=(int) coord[j][k].getX();
  226.            xMax=(int) coord[j][k].getX();
  227.            yMin=(int) coord[j][k].getY();
  228.            yMax=(int) coord[j][k].getY();
  229.            compt=1;
  230.            }
  231.           //on enregistre les coordonnées extremes
  232.           if(coord[j][k].getX()>xMax)
  233.            xMax=(int) coord[j][k].getX();
  234.           else if(coord[j][k].getX()<xMin)
  235.            xMin=(int) coord[j][k].getX();
  236.           if(coord[j][k].getY()>yMax)
  237.            yMax=(int) coord[j][k].getY();
  238.           else if(coord[j][k].getY()<yMin)
  239.            yMin=(int) coord[j][k].getY();
  240.           }
  241.         }
  242.      }
  243.     
  244.      double attente=0;
  245.      //on echange les positions maximales et minimales si les coordonnées sont negatives
  246.      if (xMax<-1)
  247.      {
  248.       attente=xMax;
  249.       xMax=xMin;
  250.       xMin=attente;
  251.      }
  252.     
  253.      if (yMax<-1)
  254.      {
  255.       attente=yMax;
  256.       yMax=yMin;
  257.       yMin=attente;
  258.      }
  259.     
  260.      if((xMax<1000 && xMax>10)||(xMax<-10 && xMax>-1000))
  261.      {//on multiplie par 100 les coordonnées qui ton inferieur à 1000
  262.       for(int t=0;t<50;t++)
  263.        for(int u=0;u<1000;u++)
  264.         coord[t][u].move((int) coord[t][u].getX()*100,(int)coord[t][u].getY());
  265.       xMax=xMax*100;
  266.   }
  267.     
  268.      if((yMax<1000 && yMax>10)||(yMax<-10 && yMax>-1000))
  269.      {
  270.       for(int t=0;t<50;t++)
  271.        for(int u=0;u<1000;u++)
  272.      coord[t][u].move((int) coord[t][u].getX(),(int)coord[t][u].getY()*100);
  273.       yMax=yMax*100;
  274.   }
  275.     
  276.      double xEch= 2*xMax/(WIDTH-100),yEch= yMax/(HEIGHT-300);
  277.      double xDepl=0;
  278.     
  279.     
  280.      System.out.println(" xMin ="+xMin);
  281.      System.out.println("xEch= "+xEch+" xMax ="+xMax+" WIDTH= "+WIDTH);
  282.      System.out.println("yEch= "+yEch+" yMax ="+yMax+" HEIGHT= "+HEIGHT);
  283.     
  284.      if(xMin/xEch<500)
  285.       {//on crée un deplacement en X pour ne pas arriver sur le bug graphique
  286.       xDepl=500-xMin/xEch;
  287.       //System.out.println("c inferieur à 400" );
  288.       }
  289.      //else xDepl=50;
  290.     
  291.      for(int t=0;t<50;t++)
  292.       for(int u=0;u<1000;u++)
  293.         {
  294.       if (coord[t][u].getX()!=0 || coord[t][u].getY()!=0)
  295.        {
  296.        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);
  297.        pastille[t*u].dessin(Color.BLACK);
  298.        }
  299.       }
  300.      pastille[2000]=new Pad(getContentPane(),new Point(500,400),50);
  301.   pastille[2000].dessin(Color.RED);
  302.   //pastille[2001]=new Pad(getContentPane(),new Point(850,150),50);
  303.   //pastille[2001].dessin(Color.GREEN);
  304.   //padPanel.repaint();
  305.   }
  306.      catch (IOException e2){System.out.println("erreur dans: " + e2);}}
  307. }
  308. // Calls shutdown, which exits the program.
  309. if (cmd.equals("Sortir" )) {
  310.     shutdown();
  311. }
  312. // Opens a port.
  313. if (cmd.equals("Ouvrir Port Serie" ))
  314. {
  315.  openItem.setEnabled(false);//on active le bouton
  316.     Cursor previousCursor = getCursor();
  317.     setNewCursor(Cursor.getPredefinedCursor(Cursor.WAIT_CURSOR));
  318.     //configurationPanel.setParameters();
  319.    
  320.     try {connection.openConnection();}//on ouvre le port serie  
  321.     catch (SerialConnectionException e2) {
  322.  AlertDialog ad = new AlertDialog(this,"Error Opening Port!",
  323.  "Error opening port,", e2.getMessage() + ".",
  324.  "Select new settings, try again." ); openItem.setEnabled(true);
  325.  setNewCursor(previousCursor);return;}
  326.    
  327.     portOpened();
  328.     setNewCursor(previousCursor);
  329. }
  330. // Closes a port.
  331. if (cmd.equals("Fermer Port Serie" )) {portClosed();}
  332.     }
  333. /**
  334.     Toggles the buttons to an open port state.
  335.     */
  336.     public void portOpened()
  337.     {
  338. openItem.setEnabled(false);
  339. closeItem.setEnabled(true);
  340.     }
  341.     /**
  342.     Calls closeConnection on the SerialConnection and toggles the buttons
  343.     to a closed port state.
  344.     */
  345.     public void portClosed()
  346.     {
  347. connection.closeConnection();
  348. openItem.setEnabled(true);
  349. closeItem.setEnabled(false);
  350.     }
  351.     /**
  352.     Sets the <code>Cursor</code> for the application.
  353.     @param c New <code>Cursor</code>
  354.     */
  355.     private void setNewCursor(Cursor c) {setCursor(c);}
  356.     /**
  357.     Cleanly shuts down the applicaion. first closes any open ports and
  358.     cleans up, then exits.
  359.     */
  360.     private void shutdown()
  361.     {
  362. connection.closeConnection();
  363. System.exit(1);
  364.     }
  365.     /**
  366.     Finds configuration file in arguments and creates a properties object from
  367.     that file.
  368.     */
  369.     private void parseArgs(String[] args)
  370.     {
  371. if (args.length < 1){return;}
  372. File f = new File(args[0]);
  373. if (!f.exists())
  374. {
  375.     f = new File(System.getProperty("user.dir" )
  376.     + System.getProperty("path.separator" )+ args[0]);
  377. }
  378. if (f.exists())
  379. {
  380.     try
  381.  {
  382.      FileInputStream fis = new FileInputStream(f);
  383.      props = new Properties();
  384.      props.load(fis);
  385.      fis.close();
  386.     }
  387.     catch (IOException e) {}
  388. }
  389.     }
  390.     /**
  391.     Handles closing down system. Allows application to be closed with window
  392.     close box.
  393.     */
  394.     class CloseHandler extends WindowAdapter
  395. {
  396. SerialDemo sd;
  397. public CloseHandler(SerialDemo sd)
  398. {
  399.     this.sd = sd;
  400.     sd.repaint();
  401. }
  402. public void windowClosing(WindowEvent e) {sd.shutdown();}
  403.     }
  404. }


 
et voici la pastille à afficher

Code :
  1. /*
  2. * Created on 16 févr. 2005
  3. *
  4. * TODO To change the template for this generated file go to
  5. * Window - Preferences - Java - Code Style - Code Templates
  6. */
  7. /**
  8. * @author Benoit
  9. *
  10. * Cette classe crée une pastille sur la carte
  11. */
  12. import java.awt.*;
  13. public class Pad {
  14. private Graphics gr;
  15. private Color fond;
  16. private Component cadre;
  17. private int x,y,diametre;
  18. /**
  19.  *  
  20.  */
  21. public Pad(Component cad,Point coordonnees,int diam)
  22. {
  23.  super();
  24.  cadre=cad;
  25.  gr=cadre.getGraphics();
  26.  fond=cadre.getBackground();
  27.  x=(int) coordonnees.getX();
  28.  y=(int) coordonnees.getY();
  29.  diametre=diam;
  30.  // TODO Auto-generated constructor stub
  31. }
  32. public void dessin(Color col)
  33. {
  34.  gr.setColor(col);
  35.  gr.fillOval(x,y,diametre,diametre);
  36. }
  37. }


 
Merci de votre aide je sais j'ai posté beaucoup de code mais au moins vous avez toutes les données en mains

Reply

Marsh Posté le 06-03-2005 à 16:27:31   

Reply

Marsh Posté le 11-03-2005 à 14:18:17    

up

Reply

Marsh Posté le 11-03-2005 à 14:35:24    

Ca va être dur de se plonger dans cet ENOOOORME code source :(

Reply

Marsh Posté le 11-03-2005 à 14:36:43    

on peut avoir une capture d'écran avant et après la disparition stp ?


---------------
trainoo.com, c'est fini
Reply

Marsh Posté le 19-03-2005 à 16:21:11    

Ton code est trop long pour que je prenne le temps de le lire.
Tout ce que je peux dire, c'est que lorsque j'ai beaucoup d'affichage à faire dans un JPanel, je préfère les faire dans une BufferedImage et me contenter d'afficher cette image dans la méthode paint du JPanel.


---------------
Bon, puisque presque tout le monde a une signature, ben moi aussi ! Na !
Reply

Marsh Posté le 19-03-2005 à 17:27:11    

Okay je vais essayer ça merci
 
Pour poster avant et après disparition ça va etre impossible puisque c quasiment immediat pas le tps de faire un screenshot

Reply

Marsh Posté le 19-03-2005 à 21:13:57    

Tu peux essayer de rajouter une temporisation à la fin de ton affichage (au pire boucle énorme qui fait rien d'autre que bouffer du temps pour te laisser le temps de capturer l'écran)


---------------
Bon, puisque presque tout le monde a une signature, ben moi aussi ! Na !
Reply

Sujets relatifs:

Leave a Replay

Make sure you enter the(*)required information where indicate.HTML code is not allowed