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

AWT/Swing Java Discussion :

Ajouter des cadres sur une interface graphique


Sujet :

AWT/Swing Java

  1. #1
    Candidat au Club
    Homme Profil pro
    Étudiant
    Inscrit en
    Juillet 2015
    Messages
    15
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Rhône (Rhône Alpes)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Juillet 2015
    Messages : 15
    Points : 4
    Points
    4
    Par défaut Ajouter des cadres sur une interface graphique
    Bonjour tout le monde ,

    Je cherche à améliorer une application en ajoutant des cadres pour plus de lisibilité, la partie Design d´Eclipse ne marchant pas, je galère un peu...
    Voilà les cadres que je voudrais obtenir:
    Nom : Capture.PNG
Affichages : 2732
Taille : 16,7 Ko

    Merci par avance pour vos pistes

  2. #2
    Modérateur
    Avatar de joel.drigo
    Homme Profil pro
    Ingénieur R&D - Développeur Java
    Inscrit en
    Septembre 2009
    Messages
    12 430
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 54
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Ingénieur R&D - Développeur Java
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Septembre 2009
    Messages : 12 430
    Points : 29 131
    Points
    29 131
    Billets dans le blog
    2
    Par défaut
    Salut,

    Visiblement, ton UI est sous Swing (fabriquée avec le pluigin WindowBuilder de Eclipse). La notion de "cadre" comme tu dis s'appelle, sous Swing, border (bordure).

    1. Toute classe de composants a une méthode setBorder() qui permet d'affecter une bordure
    2. il y a différents type de bordure, implémentés par diverses classes. Un moyen d'acceder facilement à tous ces types et d'utiliser BorderFactory.


    Exemple :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    JLabel label = new JLabel("Toto");
    label.setBorder( BorderFactory.createLineBorder(Color.RED) ); // ajoute une bordure de type ligne rouge
    Nom : toto.PNG
Affichages : 1430
Taille : 1,9 Ko


    Plus de détails ici.
    L'expression "ça marche pas" ne veut rien dire. Indiquez l'erreur, et/ou les comportements attendus et obtenus, et donnez un Exemple Complet Minimal qui permet de reproduire le problème.
    La plupart des réponses à vos questions sont déjà dans les FAQs ou les Tutoriels, ou peut-être dans une autre discussion : utilisez la recherche interne.
    Des questions sur Java : consultez le Forum Java. Des questions sur l'EDI Eclipse ou la plateforme Eclipse RCP : consultez le Forum Eclipse.
    Une question correctement posée et rédigée et vous aurez plus de chances de réponses adaptées et rapides.
    N'oubliez pas de mettre vos extraits de code entre balises CODE (Voir Mode d'emploi de l'éditeur de messages).
    Nouveau sur le forum ? Consultez Les Règles du Club.

  3. #3
    Candidat au Club
    Homme Profil pro
    Étudiant
    Inscrit en
    Juillet 2015
    Messages
    15
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Rhône (Rhône Alpes)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Juillet 2015
    Messages : 15
    Points : 4
    Points
    4
    Par défaut
    Merci pour cette réponse rapide mais j´ai essayé d´utiliser les Border mais le problème est qu´il encadre juste mon texte ou la JPanel entière mais ne permet pas d´encadrer ce que je veux...
    J´ai réussi à faire ca (mais ca ne me va pas...)
    Nom : cadre.PNG
Affichages : 1661
Taille : 10,4 Ko

    L´interface a bien été faite sous Swing

  4. #4
    Modérateur
    Avatar de joel.drigo
    Homme Profil pro
    Ingénieur R&D - Développeur Java
    Inscrit en
    Septembre 2009
    Messages
    12 430
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 54
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Ingénieur R&D - Développeur Java
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Septembre 2009
    Messages : 12 430
    Points : 29 131
    Points
    29 131
    Billets dans le blog
    2
    Par défaut
    A la base les bordures sont faites pour être en bordure des composants, pas pour entourer une partie des composants. Pour faire ça il va falloir le faire "à la main", c'est à dire dessiner par dessus les composants, et au bon endroit. Sinon, il faut organiser si possible l'interface pour pouvoir utiliser les bordures. C'est quoi le but au juste ?

    Dessiner par dessus un composant poser déjà un problème en soit : soit on le fait en redéfinissant paint(), ou paintComponent(), ce qui oblige à rédéfinir la classe (faire son propre JPanel). Autre solution le JLayer.

    Au bon endroit, demander soit d'avoir une interface statique (les composants ne bougent pas, et ne changent pas de taille), soit d'avoir un interface dynamique et d'écouter les modification. En outre, ce n'est pas si simple (sans être non plus spécialement complexe) si tu n'as jamais fait ça.

    Voici un exemple à base de JLayer :

    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
    107
    108
    109
    110
    111
    112
    113
    114
    115
    116
    117
    118
    119
    120
    121
    122
    123
    124
    125
    126
    127
    128
    129
    130
    131
    132
    133
    134
    135
    136
    137
    138
    139
    140
    141
    142
    143
    144
    145
    146
    147
    148
    149
    150
    151
    152
    153
    154
    155
    156
    157
    public class BorderDrawerComponent extends LayerUI<JComponent> {
     
    	/**
             * 
             */
    	private static final long serialVersionUID = 1L;
     
     
    	private final List<BorderDrawComponentGroup> groups;
     
    	public BorderDrawerComponent() {
    		this.groups=new ArrayList<>();
    	}
     
    	public void addGroup(BorderDrawComponentGroup group) {
    		if ( !groups.contains(group) ) {
    			groups.add(group); 
    		}
    	}
     
    	@Override
    	public void installUI(JComponent c) {
    		super.installUI(c);
    		@SuppressWarnings("unchecked")
    		JLayer<? extends JComponent> l = (JLayer<? extends JComponent>) c;
    		update(l);
    		l.addComponentListener(new ComponentAdapter() {
    		     @Override
    		     	public void componentResized(ComponentEvent e) {
    		    	     update(l);
    		    	     l.repaint();
    		     	}	
    		});
    	}
     
    	/*@Override
    	public void doLayout(JLayer<? extends JComponent> l) {
    		super.doLayout(l);
    		update(l);
    	}*/
     
    	private void update(JLayer<? extends JComponent> l) { 
    		Map<JComponent, Rectangle> bounds = new HashMap<>();
    		getInnerComponents(l.getView(), l.getView(), bounds);
    		for(BorderDrawComponentGroup group : groups) {
    			group.setBounds( bounds );
    		} 
    	}
     
    	private void getInnerComponents(JComponent root,
    			JComponent component, Map<JComponent, Rectangle> bounds) {
    		bounds.put( component, getBoundsInRoot(root, component)); 
    		for(Component child : component.getComponents()) {
    			if ( child instanceof JComponent ) {
    				getInnerComponents(root, (JComponent) child, bounds);
    			}
    		}
    	}
     
    	private Rectangle getBoundsInRoot(JComponent root, JComponent component) {
    		Rectangle bounds =  SwingUtilities.convertRectangle(component.getParent(), component.getBounds(), root); 
    		return bounds;
    	}
     
    	@Override
    	public void paint(Graphics g, JComponent c) { 
    		super.paint(g, c);
    		for(BorderDrawComponentGroup group : groups) {
    			group.draw(g, c);
    		}
    	}
     
    	public static class BorderDrawComponentGroup {
     
    		private final JComponent[] components;
    		private final Border border;
    		private final int margin;
    		private Rectangle bounds;
     
    		public BorderDrawComponentGroup(Border border, int margin, JComponent...components) {
    			Objects.requireNonNull(components);
    			Objects.requireNonNull(border);
    			this.components = Arrays.copyOf(components, components.length);
    			this.border = border;
    			this.margin = margin;
    		}
     
    		public void draw(Graphics g, JComponent c) {
    			if ( bounds!=null ) {  
    				border.paintBorder(c, g, bounds.x, bounds.y, bounds.width, bounds.height);
    			}
    		}
     
    		private void setBounds(Map<JComponent, Rectangle> bounds) {
    			this.bounds = null;
    			for(JComponent component : components ) {
    				Rectangle componentBounds = bounds.get(component);
    				if ( componentBounds!=null ) {  
    					this.bounds = this.bounds==null?componentBounds:this.bounds.union(componentBounds);
    				}
    			}
    			if ( this.bounds!=null ) {
    				this.bounds.x-=margin;
    				this.bounds.y-=margin;
    				this.bounds.width+=margin+margin;
    				this.bounds.height+=margin+margin;
    			}
    		}
     
    	}
     
    	public static void main(String[] args) {
     
    		JFrame frame = new JFrame("Démo");
     
     
    		JPanel panel = new JPanel(new GridBagLayout());
     
     
    		JComponent[] components = new JComponent[4];
    		int componentIndex=0;
    		JComponent[] component2s = new JComponent[4];
    		int component2Index=0;
    		for(int i=0; i<25; i++ ) {
     
    			int x= i/5;
    			int y = i%5;
    			JLabel label = new JLabel("Exemple " + i);
    			panel.add(label, new GridBagConstraints(x,y,1,1,0,0,GridBagConstraints.CENTER,GridBagConstraints.NONE, new Insets(5, 5, 5, 5),0, 0));
     
    			if ( x>=2 && x<=3 && y>=2 && y<=3 ) { 
    				components[componentIndex++]=label;
    			}
     
    			if ( x>=3 && x<=5 && y>=3 && y<=4 ) { 
    				component2s[component2Index++]=label;
    			}
     
    		}
     
    		BorderDrawerComponent layerUI = new BorderDrawerComponent();
    		JLayer<JComponent> jlayer = new JLayer<JComponent>(panel, layerUI);
     
     
    		layerUI.addGroup(new BorderDrawComponentGroup(BorderFactory.createLineBorder(Color.RED), 5, components));
    		layerUI.addGroup(new BorderDrawComponentGroup(BorderFactory.createDashedBorder(Color.BLUE, 5, 5), 1, component2s));
     
    		frame.getContentPane().add(jlayer);
     
     
    		frame.setSize(600, 400);
    		frame.setVisible(true);
     
     
    	}
     
    }
    Ici j'utilise toujours Border/BorderFactory, mais on peut utiliser ce qu'on veut. Je me base également sur les bounds des composants, avec juste une marge pour pouvoir plus facilement encadrer sans être contre, mais on peut enrichir au besoin.
    L'expression "ça marche pas" ne veut rien dire. Indiquez l'erreur, et/ou les comportements attendus et obtenus, et donnez un Exemple Complet Minimal qui permet de reproduire le problème.
    La plupart des réponses à vos questions sont déjà dans les FAQs ou les Tutoriels, ou peut-être dans une autre discussion : utilisez la recherche interne.
    Des questions sur Java : consultez le Forum Java. Des questions sur l'EDI Eclipse ou la plateforme Eclipse RCP : consultez le Forum Eclipse.
    Une question correctement posée et rédigée et vous aurez plus de chances de réponses adaptées et rapides.
    N'oubliez pas de mettre vos extraits de code entre balises CODE (Voir Mode d'emploi de l'éditeur de messages).
    Nouveau sur le forum ? Consultez Les Règles du Club.

  5. #5
    Candidat au Club
    Homme Profil pro
    Étudiant
    Inscrit en
    Juillet 2015
    Messages
    15
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Rhône (Rhône Alpes)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Juillet 2015
    Messages : 15
    Points : 4
    Points
    4
    Par défaut
    J´ai essayé la solution proposée dans les balises, mais sans succès, trop difficile pour mon niveau.
    Le but était de rendre plus lisible l´interface en montrant ce qui va ensemble, je vais donc la réagencer en me contentant de JPanel .
    Merci pour ton aide.

Discussions similaires

  1. affichage des Metadata DICOM sur une interface graphique
    Par asma18 dans le forum Interfaces Graphiques
    Réponses: 1
    Dernier message: 25/04/2012, 14h37
  2. [GD] Ajouter un cadre sur une image
    Par koKoTis dans le forum Bibliothèques et frameworks
    Réponses: 1
    Dernier message: 13/10/2008, 09h22
  3. Réponses: 0
    Dernier message: 18/07/2008, 11h19
  4. [Débutant] Comment enregistrer un graphe affiche sur une interface graphique ?
    Par tonio70140 dans le forum Interfaces Graphiques
    Réponses: 9
    Dernier message: 05/07/2007, 15h08
  5. Intégrer des programmes dans une interface graphique avec GUIDE
    Par maserati222e dans le forum Interfaces Graphiques
    Réponses: 3
    Dernier message: 24/05/2007, 11h30

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