Forum |  HardWare.fr | News | Articles | PC | S'identifier | S'inscrire | Shop Recherche
1267 connectés 

  FORUM HardWare.fr
  Programmation
  Java

  [swing] affichage qui disparait en partie

 


 Mot :   Pseudo :  
 
Bas de page
Auteur Sujet :

[swing] affichage qui disparait en partie

n°1002626
lloyds
Posté le 06-03-2005 à 16:27:31  profilanswer
 

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

mood
Publicité
Posté le 06-03-2005 à 16:27:31  profilanswer
 

n°1009770
lloyds
Posté le 11-03-2005 à 14:18:17  profilanswer
 

up

n°1009804
FlorentG
Unité de Masse
Posté le 11-03-2005 à 14:35:24  profilanswer
 

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

n°1009807
nraynaud
lol
Posté le 11-03-2005 à 14:36:43  profilanswer
 

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


---------------
trainoo.com, c'est fini
n°1018426
xman
branleur
Posté le 19-03-2005 à 16:21:11  profilanswer
 

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 !
n°1018496
lloyds
Posté le 19-03-2005 à 17:27:11  profilanswer
 

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

n°1018625
xman
branleur
Posté le 19-03-2005 à 21:13:57  profilanswer
 

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 !

Aller à :
Ajouter une réponse
  FORUM HardWare.fr
  Programmation
  Java

  [swing] affichage qui disparait en partie

 

Sujets relatifs
[Résolu] [Html] Doctype : meilleur affichage sans !Différence d'affichage entre IE et Firefox avec du XHTML strict
[C#] style de windows qui disparait quand on click dessus :/affichage d'une appli Flash sous Firefox
Problèmes d'affichage avec FFaffichage d'un typedef enum
Problème d'affichagepb de taille d'affichage
Problème d'affichage en PERL sous UNIXAccess 2000 :Mémoire libre insuffisante pour mettre à jour l'affichage
Plus de sujets relatifs à : [swing] affichage qui disparait en partie


Copyright © 1997-2022 Hardware.fr SARL (Signaler un contenu illicite / Données personnelles) / Groupe LDLC / Shop HFR