IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

Langage Java Discussion :

JDesktopPane : traitements synchronisés


Sujet :

Langage Java

  1. #1
    Membre averti

    Profil pro
    Inscrit en
    Janvier 2004
    Messages
    464
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Janvier 2004
    Messages : 464
    Points : 332
    Points
    332
    Par défaut JDesktopPane : traitements synchronisés
    Bonjour,
    J'ai largement remanié un code de bureau étendu que j'ai trouvé sur Internet.
    Mon problème est le suivant.
    Mon bureau étendu est un JScrollPane, le plan de travail du bureau est un JDesktopPane. Le but est de pouvoir utiliser les JScrollbar pour voir les fenêtres internes qui seraient en dehors de l'écran. Jusque là ça marche. Je veux maintenant quand je rajoute une fenêtre interne sur le bureau, redimensionner celui-ci et repositionner la "vue" pour qu'elle soit centrée sur la nouvelle fenêtre (sauf cas pathologique sur les bord du plan de travail).
    J'ai donc une méthode du bureau ajouteUneFenetre qui appelle la méthode équivalente de la classe PlanTravail. Une fois placée la fenêtre doit pour voir redimensionner le bureau et déplacer la vue pour que la fenêtre soir visible et on ne doit pas pouvoir ajouter une nouvelle fenêtre tant que ces actions ne sont pas terminée. Comment utiliser Synchronized ?
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
     
    public class Bureau extends JScrollPane
    {
    .../...
         private PlanTravail plan;
    .../...
         //cette méthode ne doit pas être appelée tant que le redimensionnement 
         //est en cours.
         public void ajouteUneFenetre(Fenetre f)
         {
               this.plan.ajouteUneFenetre(f);
               redimensionnerBureauEtCentrerVue(f); 
     
         }
         public void redimensionnerBureauEtCentrerVue(Fenetre f)
         {
              SwingUtilities.invokeLater(new Runnable() 
              { 
            	public void run()
                    {
                          //redimensionne
                          //centre
                    }
               }
         }
    }
    C'est en respectant les autres que l'on se fait respecter.

  2. #2
    Membre averti

    Profil pro
    Inscrit en
    Janvier 2004
    Messages
    464
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Janvier 2004
    Messages : 464
    Points : 332
    Points
    332
    Par défaut précisions
    Je reviens vers vous car je n'y arrive pas. J'ai essayé de modéliser au plus simple pour reproduire ce que je veux obtenir.
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
    66
    67
    68
    69
    70
    71
    72
    73
    74
    75
    76
    77
    78
    79
    80
    81
    82
    83
    84
    85
    86
    87
    88
    89
    90
    91
    92
    93
    94
    95
     
    public class EssaiScroll extends JFrame
    {
     
    	private JScrollPane jsp;
    	private JPanel jp;
     
    	public EssaiScroll()
    	{
    		// prepare la JFrame
    		super("Essai de Scroll");
    		setSize(800, 600);
    		//on finit l'application en fermant la fenêtre
    		setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
     
    		JMenuBar menuBar = new JMenuBar();
    		JMenu menu = new JMenu("Ajouter Label");
    		menuBar.add(menu);
    		menu.addMouseListener(new MouseAdapter()
    		{
    			public void mousePressed (MouseEvent evt)
    			{
    				clic();
    			}
    		});
     
    		jp = new JPanel();
    		jp.setLayout(null);
    		jp.setBackground(Color.BLUE);
     
    		jsp = new JScrollPane(jp);
            //les deux barres de défilement sont toujours visibles
            jsp.setVerticalScrollBarPolicy(JScrollPane.VERTICAL_SCROLLBAR_ALWAYS);
            jsp.setHorizontalScrollBarPolicy(JScrollPane.HORIZONTAL_SCROLLBAR_ALWAYS);
     
            add(jsp, BorderLayout.CENTER);
    		setJMenuBar(menuBar);
     
    		setVisible(true);
    	}
     
    	protected void clic() 
    	{
    		SwingUtilities.invokeLater(new Runnable() 
    		{
    			public void run()
    			{
    		JViewport v = jsp.getViewport();
     
    		JLabel label = new JLabel("label " + jp.getComponentCount());
    		label.setBackground(Color.GREEN);
    		label.setBorder(BorderFactory.createLineBorder(Color.black,3));
    		int x = (int) (800*Math.random());
    		int y = (int) (600*Math.random());
    		label.setBounds(x, y, 350, 350);
    		jp.add(label);
     
    		int largeur = jp.getWidth(), hauteur = jp.getHeight();
    		int xVue = x + (350 - v.getWidth())/2, 
    	        yVue = y + (350 - v.getHeight())/2;
    		//un booléen pour indiquer qu'on doit redimensionner
    		boolean redim = false;
    		//on redimensionne si nécessaire 
    		if ((x + 350)> largeur) 
    		{
    			redim = true;
    			largeur = x + 350;
    			xVue = largeur;
    		}
    		if ((y + 350)> hauteur)
    		{
    			redim = true;
    			hauteur = y + 350;
    			yVue = hauteur;
    		}
    		jp.setPreferredSize(new Dimension(largeur, hauteur));
    		if (xVue < 0) xVue = 0;
    		if (yVue < 0) yVue = 0;
    		Rectangle r = new Rectangle(xVue, yVue, v.getWidth(), v.getHeight());
    //		jsp.getHorizontalScrollBar().setValue(xVue);
    //		jsp.getVerticalScrollBar().setValue(yVue);
    //		v.setLocation(xVue, yVue);
    		v.scrollRectToVisible(r);
    			}
    		});
    		this.repaint();
     
    	}
     
    	public static void main(String[] args)
    	{
    		new EssaiScroll();
     
    	}
    }
    Donc j'ai un JPanel dans un JScrollPane. J'ai mis le layout du JPanel à null car je veux pouvoir afficher à un endroit précis du JPanel. Un menu permet d'ajouter à un emplacement aléatoire un JLabel dans le JPanel à chaque fois que l'on clique dessus.
    Mon problème c'est que je n'arrive pas centrer ma vue sur le nouveau label.
    J'espère avoir été plus clair.
    C'est en respectant les autres que l'on se fait respecter.

  3. #3
    Membre averti

    Profil pro
    Inscrit en
    Janvier 2004
    Messages
    464
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Janvier 2004
    Messages : 464
    Points : 332
    Points
    332
    Par défaut
    Bon après moultes recherches, j'ai trouvé. En fait c'est un problème lié au fait que le Viewport a besoin de la preferredSize du composant et le composant doit se redimensionner par setSize.
    Voici le code un peu amélioré si l'idée peut servir à d'autres.
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
    66
    67
    68
    69
    70
    71
    72
    73
    74
    75
    76
    77
    78
    79
    80
    81
    82
    83
    84
    85
    86
    87
    88
    89
    90
    91
    92
    93
    94
    95
    96
    97
    98
    99
    100
    101
    102
    103
    104
    105
    106
     
    public class EssaiScroll extends JFrame
    {
     
    	private static int n = 0;
    	private JScrollPane jsp;
    	private JPanel jp;
    	private JLabel jl;
    	public EssaiScroll()
    	{
    		// prepare la JFrame
    		super("Essai de Scroll");
    		setSize(800, 600);
    		//on finit l'application en fermant la fenêtre
    		setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
     
    		JMenuBar menuBar = new JMenuBar();
    		JMenu menu = new JMenu("Ajouter Label");
    		menuBar.add(menu);
    		menu.addMouseListener(new MouseAdapter()
    		{
    			public void mousePressed (MouseEvent evt)
    			{
    				clic();
    			}
    		});
     
    		jp = new JPanel();
    		jp.setLayout(null);
    		jp.setBackground(Color.BLUE);
     
    		jsp = new JScrollPane(jp);
            //les deux barres de défilement sont toujours visibles
            jsp.setVerticalScrollBarPolicy(JScrollPane.VERTICAL_SCROLLBAR_ALWAYS);
            jsp.setHorizontalScrollBarPolicy(JScrollPane.HORIZONTAL_SCROLLBAR_ALWAYS);
     
            add(jsp, BorderLayout.CENTER);
    		setJMenuBar(menuBar);
     
    		setVisible(true);
    		System.out.println(jp);
    		System.out.println(jp.getVisibleRect());
    	}
     
    	protected void clic() 
    	{
     
    		SwingUtilities.invokeLater(new Runnable() 
    		{
    			public void run()
    			{
    				//on retire l'ancien composant à chaque fois
    				if (jp.getComponentCount() > 0)  jp.remove(0);
    				JViewport v = jsp.getViewport();
    				jl = new JLabel("label " + n++);
    				jl.setOpaque(true);
    				jl.setBackground(Color.GREEN);
    				jl.setBorder(BorderFactory.createLineBorder(Color.black,3));
    				int x = (int) (jp.getWidth()*Math.random());
    				int y = (int) (jp.getHeight()*Math.random());
    				jl.setBounds(x, y, 350, 350);
    				jp.add(jl);			
    				int largeur = jp.getWidth(), hauteur = jp.getHeight();
    				int xVue = x + (350 - v.getWidth())/2, 
    					yVue = y + (350 - v.getHeight())/2;
    				//un booléen pour indiquer qu'on doit redimensionner
    				boolean redim = false;
     
    				//on redimensionne si nécessaire 
    				if ((x + 350)> largeur) 
    				{
    					redim = true;
    					largeur = x + 350;
    					xVue = largeur;
    				}
    				if ((y + 350)> hauteur)
    				{
    					redim = true;
    					hauteur = y + 350;
    					yVue = hauteur;
    				}
    				if (redim)
    				{
                                            //il faut les deux l'un pour le composant, l'autre pour le JViewport
    					jp.setPreferredSize(new Dimension(largeur, hauteur));
    					jp.setSize(new Dimension(largeur,hauteur));
    				}
    				if (xVue < 0) xVue = 0;
    				if (yVue < 0) yVue = 0;
    				v.setViewPosition(new Point(xVue,yVue));
    			}
     
    			private String ecrire(Rectangle r) 
    			{
    				return "(gauche = " + r.x + ", haut = " + r.y + ", droite = " + (r.x+r.width) 
    				     + ", bas = " + (r.y+r.height) + ")";
    			}
    		});
    	}
     
    	public static void main(String[] args)
    	{
    		new EssaiScroll();
     
    	}
    }
    C'est en respectant les autres que l'on se fait respecter.

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. Durée d'un traitement temps réel
    Par Almex dans le forum C
    Réponses: 5
    Dernier message: 29/03/2003, 14h15
  2. [directsound] boucle de traitement de son
    Par gargle dans le forum DirectX
    Réponses: 5
    Dernier message: 24/03/2003, 10h47
  3. Traitement d'un char* renvoyé par une DLL en C++
    Par LuluTchab dans le forum Langage
    Réponses: 4
    Dernier message: 22/03/2003, 21h48
  4. Rafraichissement de la fenetre pendant le traitement
    Par Bobx dans le forum Composants VCL
    Réponses: 5
    Dernier message: 20/02/2003, 15h13
  5. Matrice de filtrage ?
    Par gimlithedwarf dans le forum Traitement d'images
    Réponses: 2
    Dernier message: 24/08/2002, 09h44

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo