Border simulant une fenêtre (barre de titre avec icon et / ou text + contour)

Soyez le premier à donner votre avis sur cette source.

Vue 7 405 fois - Téléchargée 808 fois

Description

Une implementation de la class javax.swing.border.Border qui simule une fenêtre. La barre de titre est personnalisable (icon, texte et position du texte, police). Le contour est aussi modifiable (couleur et largeur).

Source / Exemple :


package org.swingExtension.border;

import java.awt.Color;
import java.awt.Component;
import java.awt.Font;
import java.awt.FontMetrics;
import java.awt.Graphics;
import java.awt.Insets;

import javax.swing.Icon;
import javax.swing.SwingConstants;
import javax.swing.UIManager;
import javax.swing.border.Border;

/**

  • @author gbillard
  • /
public class TitleBarBorder implements Border { private String text; private Icon icon; private int textAlignment = SwingConstants.LEFT; private Color background = Color.BLUE; private Color foreground = UIManager.getColor("Label.foreground"); private Color borderColor = Color.GRAY; private Font font = UIManager.getFont("Label.font"); private int borderWidth = 1; private int iconTextGap = 4; private int vGap = 2; private int hGap = 2; public TitleBarBorder() { this(null); } public TitleBarBorder(String title) { setText(title); } public TitleBarBorder(String title, Icon icon) { setText(title); setIcon(icon); } public TitleBarBorder(String title, Icon icon, int textAlignment) { setText(title); setIcon(icon); setTextAlignment(textAlignment); } /**
  • @see javax.swing.border.Border#getBorderInsets(java.awt.Component)
  • /
public Insets getBorderInsets(Component c) { return new Insets(borderWidth + getTitleBarHeight(c) + vGap, borderWidth, borderWidth, borderWidth); } private int getTitleBarHeight(Component c) { int h = 0; if (text != null) { h = c.getFontMetrics(font).getHeight(); } if (icon != null) { h = Math.max(icon.getIconHeight(), h); } return h; } /**
  • @see javax.swing.border.Border#isBorderOpaque()
  • /
public boolean isBorderOpaque() { return false; } /**
  • @see javax.swing.border.Border#paintBorder(java.awt.Component, java.awt.Graphics, int, int, int, int)
  • /
public void paintBorder(Component c, Graphics g, int x, int y, int width, int height) { Color oldColor = g.getColor(); Font oldFont = g.getFont(); int h = getTitleBarHeight(c); g.setColor(background); g.fillRect(x + borderWidth, y + borderWidth, width - borderWidth - borderWidth, h + vGap + vGap); int x2 = x + hGap + borderWidth; int y2 = y + vGap + borderWidth; if (icon != null) { y2 = (h + vGap + vGap) / 2 - icon.getIconHeight() / 2 + borderWidth; icon.paintIcon(c, g, x2, y2); x2 += icon.getIconWidth() + iconTextGap; } if (text != null) { g.setFont(font); g.setColor(foreground); FontMetrics fm = g.getFontMetrics(); y2 = y + vGap + borderWidth; int h2 = (h - fm.getHeight()) / 2; if (textAlignment != SwingConstants.LEFT) { if (textAlignment == SwingConstants.RIGHT) { x2 = x + width - hGap - borderWidth - fm.stringWidth(text); } else if (textAlignment == SwingConstants.CENTER) { x2 = (x + width - borderWidth - borderWidth - hGap - hGap) / 2 - fm.stringWidth(text) / 2; } } g.drawString(text, x2, y2 + h - h2 - fm.getDescent()); } g.setColor(borderColor); for (int i = 0; i < borderWidth; i++) { g.drawRect(x + i, y + i, width - 1 - (2 * i), height - 1 - (2 * i)); } g.setColor(oldColor); g.setFont(oldFont); } /**
  • @return the text
  • /
public String getText() { return text; } /**
  • @param text the text to set
  • /
public void setText(String text) { this.text = text; } /**
  • @param color the backgroundColor to set
  • /
public void setBackground(Color color) { this.background = color; } /**
  • @param borderWidth the borderWidth to set
  • /
public void setBorderWidth(int borderWidth) { this.borderWidth = borderWidth; } /**
  • @param gap the hGap to set
  • /
public void setHGap(int gap) { hGap = gap; } /**
  • @param icon the icon to set
  • /
public void setIcon(Icon icon) { this.icon = icon; } /**
  • @param textAlignment the textAlignment to set
  • /
public void setTextAlignment(int textAlignment) { this.textAlignment = textAlignment; } /**
  • @param gap the vGap to set
  • /
public void setVGap(int gap) { vGap = gap; } /**
  • @param borderColor the borderColor to set
  • /
public void setBorderColor(Color borderColor) { this.borderColor = borderColor; } /**
  • @param color the foregroundColor to set
  • /
public void setForeground(Color color) { foreground = color; } /**
  • @param iconTextGap the iconTextGap to set
  • /
public void setIconTextGap(int iconTextGap) { this.iconTextGap = iconTextGap; } /**
  • @param font the font to set
  • /
public void setFont(Font font) { this.font = font; } }

Conclusion :


Renommer le .zip en .jar et lancer: java -jar TitleBarBorder.jar

Codes Sources

A voir également

Ajouter un commentaire

Commentaires

Messages postés
4
Date d'inscription
jeudi 8 juillet 2004
Statut
Membre
Dernière intervention
7 mars 2007

Réponse à Tulipo : si je l'ai fait c'est que j'en avais besoin. Bien sûr ça s'inscrit dans un ensemble plus important de gestion de fenêtre. Le besoin étatnt de type rendu visuel bien entendu. Et svp arrête de ne penser que pour toi et réfléchi avant de dire des ânneries de cette sorte. Rends toi compte que la quasi totalité des éléments de rendu visuels n'ont aucune fonction autre que celle de rendre agréable à regarder une interface graphique...

Réponse à Mahrez_dev : relis l'explication qui est donnée dans la zone "Explication finale"...
Messages postés
4
Date d'inscription
mercredi 8 novembre 2006
Statut
Membre
Dernière intervention
13 février 2009

mais comment tester cette source.
Messages postés
52
Date d'inscription
vendredi 16 juillet 2004
Statut
Membre
Dernière intervention
18 juin 2008

Vraiment null ton truc, excuse moi mais ça sert strictement à rien, ton code est propre et t'as l'air d'un bon programeur alors utilise ça dans des trucs qui servent a qq choses
Amicalement biensur
Messages postés
4
Date d'inscription
jeudi 8 juillet 2004
Statut
Membre
Dernière intervention
7 mars 2007

Après réflexion, je n'ajouterai pas de gestion d'événement sur ce border car je ne pense pas que cela soit très « propre ». Techniquement, c'est possible mais pour pouvoir faire disparaître / apparaître le contenu par exemple, ce n'est pas bon du tout. Mon objectif n'étant pas d'écrire un framework de docking. Cette classe restera en l'état car elle fait très bien ce pour quoi je l'ai écrite. Je compte développer un type de panel (type XP) avec des sous panneau rétractable en étendant JPanel.
Messages postés
5351
Date d'inscription
dimanche 4 mai 2003
Statut
Modérateur
Dernière intervention
17 août 2020
97
Salut,

si tu veux le code pour bouger la fenêtre fais signe je te l'envoi par MP.
Afficher les 8 commentaires

Vous n'êtes pas encore membre ?

inscrivez-vous, c'est gratuit et ça prend moins d'une minute !

Les membres obtiennent plus de réponses que les utilisateurs anonymes.

Le fait d'être membre vous permet d'avoir un suivi détaillé de vos demandes et codes sources.

Le fait d'être membre vous permet d'avoir des options supplémentaires.