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 :

[SWING]Dessiner sur un composant


Sujet :

AWT/Swing Java

  1. #21
    Expert confirmé
    Avatar de sinok
    Profil pro
    Inscrit en
    Août 2004
    Messages
    8 765
    Détails du profil
    Informations personnelles :
    Âge : 45
    Localisation : France, Paris (Île de France)

    Informations forums :
    Inscription : Août 2004
    Messages : 8 765
    Par défaut
    EN ce qui concerne les JFrame, pas trop pour les bords arrondis, enfin faut soit tricher (c'est à dire setUndecorated à true, mettre au fond de la JFrame une capture d'écran (et adapter la partie de l'image affichée selon la position/taille de ta JFrame, puis mettre un JComponent au coins arrondis dessus) soit utiliser des libs natives, cad passer par JNA qui eprmet de donner une forme au fenêtres et les rendre transparentes:

    https://jna.dev.java.net/


    Pour les panels au coins arrondis
    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
     
    import java.awt.Color;
    import java.awt.Graphics;
    import java.awt.Graphics2D;
    import java.awt.Insets;
    import java.awt.LayoutManager;
    import java.awt.RenderingHints;
     
    import javax.swing.BorderFactory;
    import javax.swing.JFrame;
    import javax.swing.JPanel;
     
     
    public class RoundCorneredPanel extends JPanel {
     
        public RoundCorneredPanel() {
            // TODO Auto-generated constructor stub
        }
     
        public RoundCorneredPanel(LayoutManager layout) {
            super(layout);
            // TODO Auto-generated constructor stub
        }
     
        public RoundCorneredPanel(boolean isDoubleBuffered) {
            super(isDoubleBuffered);
            // TODO Auto-generated constructor stub
        }
     
        public RoundCorneredPanel(LayoutManager layout, boolean isDoubleBuffered) {
            super(layout, isDoubleBuffered);
            // TODO Auto-generated constructor stub
        }
     
        @Override
        protected void paintComponent(Graphics g) {
            if(isShowing()) {
                Insets insets = getBorder().getBorderInsets(this);
                Graphics2D g2d = (Graphics2D) g;
                g2d.setRenderingHint(RenderingHints.KEY_ANTIALIASING, RenderingHints.VALUE_ANTIALIAS_ON);
                g.setColor(getBackground());
                g.fillRoundRect(0+insets.left, 0+insets.top, getWidth()-insets.right-insets.left, getHeight()-insets.bottom-insets.top, 50, 50);
            }
        }
     
        public static void main(String[] args) {
            JFrame f = new JFrame();
            RoundCorneredPanel p = new RoundCorneredPanel();
            p.setBackground(Color.black);
            p.setBorder(BorderFactory.createEmptyBorder(10, 10, 10, 10));
            f.add(p);
            f.setSize(200, 200);
            f.setDefaultCloseOperation(JFrame.DISPOSE_ON_CLOSE);
            f.setLocationRelativeTo(null);
            f.setVisible(true);
        }
     
    }

  2. #22
    Rédacteur/Modérateur

    Avatar de bouye
    Homme Profil pro
    Information Technologies Specialist (Scientific Computing)
    Inscrit en
    Août 2005
    Messages
    6 911
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 49
    Localisation : Nouvelle-Calédonie

    Informations professionnelles :
    Activité : Information Technologies Specialist (Scientific Computing)
    Secteur : Agroalimentaire - Agriculture

    Informations forums :
    Inscription : Août 2005
    Messages : 6 911
    Billets dans le blog
    54
    Par défaut
    Un petit rectificatif : il manque une surchage de isOpaque() pour renvoyer tout le temps false. En effet, le panel ayant des bords arrondis, sa surface de peinture ne couvre pas toute la surface de dessin (qui est celle de sa boite englobante) : les surfaces contenues a l'exterieur des 4 coins sont transparentes.

    Ensuite, comme tu as pu le voir sur MacOS le fond de la fenetre n'est pas uni mais strie (voir le screen poste en haut de page). J'ignore comment ca marche en detail, si tous les panels sont simplement completements transparents/non-opaque sur cette platforme ou si leur UI ont toutes un TexturePaint particulier.
    Mais bon, ce qu'il vaut peut-etre mieux faire, c'est dessiner un bord rectangulaire arrondit autour du panel pour donner l'illusion que celui-ci a des coins arrondis, donc voir du cote de LineBorder (qui dispose d'un constructeur permettant de specifier des coins arrondis) plutot que de creer une surchage de JPanel.
    Merci de penser au tag quand une réponse a été apportée à votre question. Aucune réponse ne sera donnée à des messages privés portant sur des questions d'ordre technique. Les forums sont là pour que vous y postiez publiquement vos problèmes.

    suivez mon blog sur Développez.

    Programming today is a race between software engineers striving to build bigger and better idiot-proof programs, and the universe trying to produce bigger and better idiots. So far, the universe is winning. ~ Rich Cook

  3. #23
    Membre averti
    Profil pro
    Étudiant
    Inscrit en
    Avril 2005
    Messages
    60
    Détails du profil
    Informations personnelles :
    Âge : 40
    Localisation : France

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Avril 2005
    Messages : 60
    Par défaut
    j'ai essaier ce que tu m'as dit,





    ca se voit pas sur l'image, mais la frame et le Jpanel sont tranparent.

    j'ai juste rajouter une ligne de code
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    WindowUtils.setWindowAlpha(f,0.5f);
    donc du coup, on voit le bord de la frame et le jpanel a l'interieur.

    Je vais aller pencher du coté du LineBorder

    ps : est-ce que ca marcherai et est-ce que c'est plus propre de surcharger la méthode paint pr dessiner "a la main" les bords arrondis de la JFrame ? car je ce que je veux c'est que ma JFrame ai les bords arrondis.

    ps2 : Je tiens le bon bout, grace au JNA on peut appliquer un mask, grace a la fonction WindowUtils.setWindowMask (Window f, Shape s), on peut normalement donner la forme qu'on veut.

Discussions similaires

  1. Réponses: 3
    Dernier message: 27/05/2010, 16h39
  2. Dessiner sur un composant
    Par Panaméen dans le forum Windows Forms
    Réponses: 9
    Dernier message: 18/05/2009, 14h08
  3. Dessiner sur un composant sans Canvas
    Par josse95 dans le forum C++Builder
    Réponses: 10
    Dernier message: 31/03/2007, 19h01
  4. Dessiner sur un composant sans Canvas
    Par bandit boy dans le forum C++Builder
    Réponses: 6
    Dernier message: 08/02/2007, 13h12
  5. dessiner sur un composant picturebox
    Par xantares dans le forum VC++ .NET
    Réponses: 4
    Dernier message: 03/01/2007, 12h05

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