Bonjour,
Je cherche à savoir comment adapter la taille de ma JFrame en fonction de la taille de mon JPanel.
Car lors de l'exécution de mon application la taille de mon Jpanel varie beaucoup mais la taille de ma fenêtre reste la même.
merci :)
Version imprimable
Bonjour,
Je cherche à savoir comment adapter la taille de ma JFrame en fonction de la taille de mon JPanel.
Car lors de l'exécution de mon application la taille de mon Jpanel varie beaucoup mais la taille de ma fenêtre reste la même.
merci :)
Quel Layout utilises-tu ?
En fait j'utilise la version GUI Designer de NetBeans pour faire ma mise en forme.
Voici le code généré pour les Layouts
Code:
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 javax.swing.GroupLayout jPanel1Layout = new javax.swing.GroupLayout(jPanel1); jPanel1.setLayout(jPanel1Layout); jPanel1Layout.setHorizontalGroup( jPanel1Layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING) .addGroup(jPanel1Layout.createSequentialGroup() .addContainerGap() .addComponent(jLabel1, javax.swing.GroupLayout.DEFAULT_SIZE, 458, Short.MAX_VALUE) .addGroup(jPanel1Layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING) .addGroup(jPanel1Layout.createSequentialGroup() .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.UNRELATED) .addGroup(jPanel1Layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING) .addComponent(jButton1, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, Short.MAX_VALUE) .addGroup(javax.swing.GroupLayout.Alignment.TRAILING, jPanel1Layout.createSequentialGroup() .addGap(55, 55, 55) .addComponent(jLabel2, javax.swing.GroupLayout.DEFAULT_SIZE, 324, Short.MAX_VALUE) .addGap(34, 34, 34))) .addContainerGap()) .addGroup(jPanel1Layout.createSequentialGroup() .addGap(56, 56, 56) .addGroup(jPanel1Layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING) .addComponent(jLabel5, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, Short.MAX_VALUE) .addComponent(jLabel3, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, Short.MAX_VALUE) .addGroup(jPanel1Layout.createSequentialGroup() .addGap(40, 40, 40) .addGroup(jPanel1Layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING) .addComponent(jLabel4, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, Short.MAX_VALUE) .addComponent(jLabel6, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, Short.MAX_VALUE)))) .addGap(45, 45, 45)))) ); jPanel1Layout.setVerticalGroup( jPanel1Layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING) .addGroup(javax.swing.GroupLayout.Alignment.TRAILING, jPanel1Layout.createSequentialGroup() .addContainerGap() .addGroup(jPanel1Layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING) .addGroup(jPanel1Layout.createSequentialGroup() .addComponent(jLabel2, javax.swing.GroupLayout.DEFAULT_SIZE, 49, Short.MAX_VALUE) .addGap(48, 48, 48) .addComponent(jLabel4, javax.swing.GroupLayout.DEFAULT_SIZE, 48, Short.MAX_VALUE) .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.UNRELATED) .addComponent(jLabel6, javax.swing.GroupLayout.DEFAULT_SIZE, 51, Short.MAX_VALUE) .addGap(18, 18, 18) .addComponent(jLabel5, javax.swing.GroupLayout.DEFAULT_SIZE, 81, Short.MAX_VALUE) .addGap(36, 36, 36) .addComponent(jLabel3, javax.swing.GroupLayout.DEFAULT_SIZE, 89, Short.MAX_VALUE) .addGap(51, 51, 51) .addComponent(jButton1, javax.swing.GroupLayout.DEFAULT_SIZE, 84, Short.MAX_VALUE)) .addComponent(jLabel1, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, Short.MAX_VALUE)) .addContainerGap()) );
Tu as posté le Layout du JPanel. Ce Layout sert pour les composants qui se trouvent DANS le JPanel. Pas pour placer le JPanel.
Il faut regarder ce que tu as comme Layout pour le JFrame.
Je suppose que si tu as placé le JPanel avec le GUI de NB, tu dois avoir dans la méthode "init" :
A quelle occasion ton JPanel change de taille ?Code:
1
2 javax.swing.GroupLayout layout = new javax.swing.GroupLayout(getContentPane()); getContentPane().setLayout(layout);
Ou voilà j'ai bien ce code là :
donc ça c'est bien le Layout de ma JFrame ? :)Code:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16 javax.swing.GroupLayout layout = new javax.swing.GroupLayout(getContentPane()); getContentPane().setLayout(layout); layout.setHorizontalGroup( layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING) .addGroup(layout.createSequentialGroup() .addComponent(jPanel1, javax.swing.GroupLayout.PREFERRED_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.PREFERRED_SIZE) .addGap(0, 0, Short.MAX_VALUE)) ); layout.setVerticalGroup( layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING) .addGroup(layout.createSequentialGroup() .addComponent(jPanel1, javax.swing.GroupLayout.PREFERRED_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.PREFERRED_SIZE) .addGap(0, 0, Short.MAX_VALUE)) ); pack();
Oui c'est le Layout de ta JFrame.
Bon, maintenant, il faut savoir quel évènement fait que ton JPanel change de taille
et du coup, que ta JFrame doit aussi changer de taille ... (par ce que c'est bien ta question ?)
Ah oui,
Alors dans mon application j'ai un JLabel dans mon JPanel.
Dans ce JLabel l'utilisateur peut importer l'image qu'il veut depuis son ordinateur en cliquant sur un bouton "Menu Item".
C'est dans cette ActionListener que j'ai écris le code pour importer une image.
Donc l'image importée peut être de tout type et de toute taille.
Mon Jlabel s'adapte bien à la taille de l'image.
Mon JPanel aussi.
Mais pas la JFrame.
Salut,
Avec ComponentListener on doit pouvoir s'adapter aux changements de taille du panel, quelque soit le layout à priori :
Code:
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 public class DemoJFrameAdaptSize { public static void main(String[] args) { JFrame frame = new JFrame("Démo"); frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); JPanel panel = createResizablePanel(); frame.add(panel); panel.addComponentListener(new ComponentAdapter() { @Override public void componentResized(ComponentEvent e) { resize(frame, panel); } }); frame.pack(); panel.setPreferredSize(panel.getSize()); frame.setLocationRelativeTo(null); frame.setVisible(true); } protected static void resize(JFrame frame, JPanel panel) { Dimension size = panel.getSize(); Insets insets = frame.getInsets(); size.width += insets.left + insets.right; size.height += insets.top + insets.bottom; frame.setSize(size); } private static JPanel createResizablePanel() { JPanel panel = new JPanel(new FlowLayout(FlowLayout.LEFT)); panel.setBorder(BorderFactory.createLineBorder(Color.RED, 3)); panel.setPreferredSize(new Dimension(100,100)); JPanel buttonPanel = new JPanel(new GridBagLayout()); GridBagConstraints gbc = new GridBagConstraints(0, 0, 1, 1, 1, 1, GridBagConstraints.CENTER, GridBagConstraints.NONE, new Insets(3,3,3,3), 0, 0); BasicArrowButton decreaseHeight = new BasicArrowButton(BasicArrowButton.NORTH); decreaseHeight.addActionListener(e-> decreaseHeight(panel)); gbc.gridx=1; buttonPanel.add(decreaseHeight, gbc); BasicArrowButton decreaseWidth = new BasicArrowButton(BasicArrowButton.WEST); decreaseWidth.addActionListener(e-> decreaseWidth(panel)); gbc.gridx=0; gbc.gridy=1; buttonPanel.add(decreaseWidth, gbc); BasicArrowButton increaseWidth = new BasicArrowButton(BasicArrowButton.EAST); increaseWidth.addActionListener(e-> increaseWidth(panel)); gbc.gridx=2; buttonPanel.add(increaseWidth, gbc); BasicArrowButton increaseHeight = new BasicArrowButton(BasicArrowButton.SOUTH); increaseHeight.addActionListener(e-> increaseHeight(panel)); gbc.gridx=1; gbc.gridy=2; buttonPanel.add(increaseHeight, gbc); buttonPanel.setMaximumSize(buttonPanel.getPreferredSize()); panel.add(buttonPanel); return panel; } private static void decreaseHeight(JPanel panel) { Dimension dimension = panel.getSize(); if ( dimension.height>32 ) { dimension.height -= 10; panel.setPreferredSize(dimension); panel.setSize(dimension); panel.revalidate(); } } private static void increaseHeight(JPanel panel) { Dimension dimension = panel.getSize(); if ( dimension.height<1024 ) { dimension.height += 10; panel.setPreferredSize(dimension); panel.setSize(dimension); panel.revalidate(); } } private static void decreaseWidth(JPanel panel) { Dimension dimension = panel.getSize(); if ( dimension.width>32 ) { dimension.width -= 10; panel.setPreferredSize(dimension); panel.setSize(dimension); panel.revalidate(); } } private static void increaseWidth(JPanel panel) { Dimension dimension = panel.getSize(); if ( dimension.width<1024 ) { dimension.width += 10; panel.setPreferredSize(dimension); panel.setSize(dimension); panel.revalidate(); } } }
Après avoir intégré une image, il faut trouver la nouvelle taille du JPanel
soit avec jPanel1.getSize()
soit avec jPanel1.getPreferedSize()
Dans les 2 cas tu récupères un objet Dimension que tu peux appliquer à ton JFrame avec :
monJFrame.setPreferedSize(jPanel1.getPreferedSize());
En principe, ton JFrame devra encore être un peu agrandi à cause des marges.
Super ça marche bien avec JFrame.setPreferedSize(jPanel1.getPreferedSize());
et le décalage des marges est bien c'est plus joli viseuellement.
Merci à tous :)