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 :

Ne pas avoir la même fenêtre basique de Java


Sujet :

AWT/Swing Java

  1. #1
    Nouveau Candidat au Club
    Homme Profil pro
    Lycéen
    Inscrit en
    Janvier 2020
    Messages
    1
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Finistère (Bretagne)

    Informations professionnelles :
    Activité : Lycéen

    Informations forums :
    Inscription : Janvier 2020
    Messages : 1
    Points : 1
    Points
    1
    Par défaut Ne pas avoir la même fenêtre basique de Java
    Bonjour, je suis entrain de programmé en Java et entrain de m'entrainer à faire des interfaces graphiques.

    J'ai regardé un logiciel du nom de "ProRealTime", le logiciel est développé en Java mais pourtant le logiciel n'a pas la même fenêtre basique comme celle la : http://prntscr.com/qqyyjv .

    J'aimerais donc bien savoir comment nous pouvons avoir des fenêtres "customisés" comme le logiciel, merci !

  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,

    Le titre d'une JFrame est géré/affiché par l'OS, pas par Java. On a un contrôle très limité en Java sur les fenêtres (le titre et l'icône).

    Pour changer le titre d'une JFrame :

    1. soit on passe par une API qui donne l'accès au système (JNI/JNA), mais ça oblige à avoir un code spécifique pour chaque OS
    2. soit on désactive l'affichage du titre et on passe par une décoration Java, reposant sur un look and feel. Ce qui veut dire que soit on trouve un look and feel qui ressemble à celui de l'OS, soit on l'adapte pour, soit on se tape un look and feel différent et pas forcément très beau. Genre par exemple le MetalLookAndFeel standard de Java avec ses boutons affreux, et les grips dans la barre de titre (on peut les virer avec une grosse bidouille bien pourrie) :

      Nom : Capture.JPG
Affichages : 82
Taille : 18,2 Ko
      le code...

      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
      JFrame frame = new JFrame();
      		frame.setDefaultCloseOperation(JFrame.DISPOSE_ON_CLOSE);
      		frame.setSize(300, 300);
      		frame.setLocationRelativeTo(null);
       
      		frame.setUndecorated(true); 
      		frame.getRootPane().setWindowDecorationStyle(JRootPane.FRAME);
       
      		frame.getContentPane().setBackground(Color.WHITE);
       
      		DefaultMetalTheme theme = new DefaultMetalTheme() {
       
      			public ColorUIResource getWindowTitleInactiveBackground() {
      				return new ColorUIResource(java.awt.Color.LIGHT_GRAY);
      			}
       
      			public ColorUIResource getWindowTitleBackground() {
      				return new ColorUIResource(java.awt.Color.ORANGE);
      			}
       
      			public ColorUIResource getPrimaryControlHighlight() {
      				return new ColorUIResource(java.awt.Color.ORANGE.brighter());
      			}
       
      			public ColorUIResource getPrimaryControlDarkShadow() {
      				return new ColorUIResource(java.awt.Color.ORANGE.darker());
      			}
       
      			public ColorUIResource getPrimaryControl() {
      				return new ColorUIResource(java.awt.Color.ORANGE);
      			} 
       
      			public ColorUIResource getControlHighlight() {
      				return new ColorUIResource(java.awt.Color.ORANGE.brighter());
      			}
       
      			public ColorUIResource getControlDarkShadow() {
      				return new ColorUIResource(java.awt.Color.ORANGE.darker());
      			}
       
      			public ColorUIResource getControl() {
      				return new ColorUIResource(java.awt.Color.ORANGE);
      			} 
       
      			@Override
      			public ColorUIResource getMenuBackground() {
      				return new ColorUIResource(java.awt.Color.WHITE);
      			}
       
      			@Override
      			public ColorUIResource getMenuSelectedBackground() { 
      				return new ColorUIResource(java.awt.Color.ORANGE);
      			}
       
      			@Override
      			public ColorUIResource getWindowBackground() {
      				return new ColorUIResource(java.awt.Color.WHITE);
      			}
       
      		};
       
      		MetalLookAndFeel.setCurrentTheme(theme); 
      		UIManager.setLookAndFeel(new MetalLookAndFeel());
       
      		SwingUtilities.updateComponentTreeUI(frame);
       
      		frame.setVisible(true);

    3. soit on désactive l'affichage de la barre de titre (ou on utilise directement une JWindow au lieu d'une JFrame) et on gère soi-même (on simule) une barre de titre mais ça veut dire qu'il faut penser à tout gérer (l'affichage, les évenements, les boutons pour fermer, réduire, le menu contextuel etc). On peut aller très loin, y compris avoir des fenêtres non rectangulaire, transparente... on peut faire des affichages très personnalisés. Mais c'est du boulot.

      Un exemple de fenêtre personnalisée :
      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
      158
      159
      160
      161
      162
      163
      164
      165
      166
      167
      168
      169
      170
      import java.awt.BasicStroke;
      import java.awt.Color;
      import java.awt.Graphics;
      import java.awt.Graphics2D;
      import java.awt.MouseInfo;
      import java.awt.Point;
      import java.awt.RenderingHints;
      import java.awt.event.MouseAdapter;
      import java.awt.event.MouseEvent;
      import java.awt.geom.AffineTransform;
      import java.awt.geom.Area;
      import java.awt.geom.Ellipse2D;
      import java.awt.geom.Point2D;
      import java.awt.image.BufferStrategy;
      import java.util.Objects;
       
      import javax.swing.JWindow;
      import javax.swing.SwingUtilities;
      import javax.swing.Timer;
       
      public class Bouboule {
       
      	/*
      	private static final int SIZE = 100;
      	private static final int EYE_SIZE = 20;
      	private static final int PUPIL_SIZE = 10;
      	*/
       
      	private static final int SIZE = 500;
      	private static final int EYE_SIZE = 100;
      	private static final int PUPIL_SIZE = 30;
       
      	public static void main(String[] args) {
       
      		class BoubouleEyes {
       
      			private Point mousepoint;
       
      			public boolean setMouse(Point location) {
      				if ( Objects.equals(location, mousepoint) ) return false;
      				mousepoint = location;
      				return true;
      			}
       
      			public void drawEye(Graphics2D g2d, int x, int y, int d) {
      				g2d.setColor(Color.CYAN);
      				g2d.fillOval(x, y, d, d);
      				g2d.setColor(Color.BLACK);
      				g2d.drawOval(x, y, d, d);
       
      				double r = d/2d;
      				double xc = x+r;
      				double yc = y+r;
       
      				double xd = mousepoint.x - xc;
      				double yd = mousepoint.y - yc;
       
      				double dist = mousepoint.distance(new Point2D.Double(xc,yc));
       
      				double cos = dist==0?1:xd/dist; 
      				double sin = dist==0?0:yd/dist; 
       
      				g2d.setColor(Color.BLACK);
      				double rr = Math.min(dist, Math.max(0, r-PUPIL_SIZE/2));
      				double xe = xc + cos * rr - PUPIL_SIZE/2;
      				double ye = yc + sin * rr - PUPIL_SIZE/2;
      				g2d.fillOval((int)xe, (int)ye, PUPIL_SIZE, PUPIL_SIZE);
       
       
       
      			}
       
      		}
       
      		BoubouleEyes boubouleEyes = new BoubouleEyes() {
       
      		};
       
      		Area mouth = new Area(new Ellipse2D.Double(0,0,SIZE/3d,SIZE/5d));
      		double dec = SIZE/20d;
      		mouth.subtract(new Area(new Ellipse2D.Double(0,-dec,SIZE/3d-dec,SIZE/5d-dec)));
      		AffineTransform mouthPosition = AffineTransform.getTranslateInstance((SIZE-mouth.getBounds().getWidth())/2, SIZE-mouth.getBounds().getHeight()*2);
       
      		Area nose = new Area(new Ellipse2D.Double(0,0,SIZE/10d,SIZE/12d));
      		dec = SIZE/80d;
      		nose.subtract(new Area(new Ellipse2D.Double(0,-dec,SIZE/10d,SIZE/12d-dec)));
      		AffineTransform nosePosition = AffineTransform.getTranslateInstance((SIZE-nose.getBounds().getWidth())/2, SIZE/2d+nose.getBounds2D().getHeight()/4);
       
      		JWindow window = new JWindow() {
       
      			private static final int E4 = EYE_SIZE/4;
       
      			@Override
      			public void paint(Graphics g) {
       
      				Graphics2D g2d = (Graphics2D) g;
       
      				g2d.setRenderingHint(RenderingHints.KEY_ANTIALIASING, RenderingHints.VALUE_ANTIALIAS_ON);
       
      				g.setColor(Color.RED);
      				g.fillOval(0, 0, SIZE, SIZE);
       
      				int y = getHeight()/2-EYE_SIZE;
      				boubouleEyes.drawEye(g2d, E4, y, EYE_SIZE);
      				boubouleEyes.drawEye(g2d, getWidth()-E4-EYE_SIZE, y, EYE_SIZE);
       
       
       
      				g2d.setStroke(new BasicStroke(5));
      				g.setColor(Color.BLACK);
      				g.drawOval(0, 0, SIZE, SIZE);
       
      				AffineTransform transform = g2d.getTransform();
      				g2d.transform(nosePosition);
      				g2d.fill(nose);
      				g2d.setTransform(transform);
       
       
      				g2d.transform(mouthPosition);
       
      				g2d.draw(mouth);
       
      			}
       
       
      		};
      		Area windowShape = new Area(new Ellipse2D.Double(0,0,SIZE,SIZE));
      		windowShape.subtract(new Area(mouthPosition.createTransformedShape(mouth)));
      		window.setShape(windowShape);
      		window.setOpacity(0.5f);
      		window.setSize(SIZE,SIZE);
      		window.setAlwaysOnTop(true);
      		window.setLocationRelativeTo(null);
       
      		window.addMouseListener(new MouseAdapter() {
      			@Override
      			public void mousePressed(MouseEvent e) {
      				System.exit(0);
      			}
      		});
       
      		boubouleEyes.setMouse(MouseInfo.getPointerInfo().getLocation());
       
       
       
      		window.setVisible(true);
      		window.createBufferStrategy(2);
      		 BufferStrategy strategy = window.getBufferStrategy(); 
       
      			Timer timer = new Timer(33, e-> {
      				Point point = MouseInfo.getPointerInfo().getLocation();
      				SwingUtilities.convertPointFromScreen(point, window);
      				if ( boubouleEyes.setMouse(point) ) {
      					do {
      			             Graphics graphics = strategy.getDrawGraphics();
       
      							window.paint(graphics);
       
      			             graphics.dispose();
      			         } while (strategy.contentsRestored());
       
      					strategy.show();
      				}
      			});
      			timer.start();
       
       
      	}
       
      }
    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.

Discussions similaires

  1. Réponses: 4
    Dernier message: 30/03/2013, 06h32
  2. Réponses: 6
    Dernier message: 06/02/2013, 12h49
  3. [AC-2003] Pas de données même après avoir effectué un Requery ?
    Par [ZiP] dans le forum VBA Access
    Réponses: 1
    Dernier message: 28/01/2010, 15h33
  4. Ne pas avoir deux fois la même valeurs
    Par diki38 dans le forum Débuter avec Java
    Réponses: 2
    Dernier message: 11/01/2010, 11h45

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