5 pièce(s) jointe(s)
Créer un JPanel scrollable
Hello
Nouveau problème
Les deux images qui suivent montrent les deux aspect que doit avoir la fenêtre de mon projet
Pièce jointe 679155
Pièce jointe 679156
Explication des zones
1. Titre de la fenêtre
2. Barre des menus
3. Zone contenant les fenêtres theWinLayout et theWinGallery, nommée internalDisplayArea, une instance de la classe JPanel
4. Barre d'état
5. Ascenseur vertical
6. Ascenseur horizontal
7. Zone pour les barre des boutons pour la gestion du contour, du réseau, des signaux, du décor
8. Zone d'affichage des paramètres d'un élément du réseau sélectionné
Les composants 4, 7 et 8 sont des JPanel ajoutés à mainDisplayArea
• Composant 4: stateDisplayArea
• Composant 7: un seul est visible à un moment donné
◦ contourButtonsDisplayArea: zone des boutons pour la gestion du contour du réseau
◦ layoutButtonsDisplayArea: zone des boutons pour la gestion du réseau
◦ signalsButtonsDisplayArea: zone des boutons pour la gestion des signaux
◦ scenaryButtonsDisplayArea: zone des boutons pour la gestion du décor
◦ submoduleButtonsDisplayArea: zone des boutons pour la gestion des sous-modules
• Composant 8: parametersDeviceDisplayArea
Une instance JPanel nommée mainDisplayArea contient les zones 3, 4, 7 et 8
On a la hiérarchie suivante :
Pièce jointe 679157
• theWinMain: JFrame, fenêtre principale
• mainDisplayArea: JFrame, zone d'affichage de tous les composants qui s'affiche dans theWinMain
• scrollPane: JScrollPane, pour rendre scrollable internalDisplayArea
• stateDisplayArea, contourDisplayArea, ...: JPanel
• internalDisplayArea: JPanel, contient les fenêtres internes theWinLayout et theWinGallery
• theWinLayout, theWinGallery: WinInternal extends JinternalFrame
Pour le moment je veux juste rendre inernalDisplayArea scrollable
Le code
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 115 116 117 118 119 120 121 122 123 124
| // Classe de la fenêtre principale
public class CdmWin extends JFrame{
// Pour éviter un warning
private static final long serialVersionUID = -6677562836791922873L;
// La fenêtre principale
public static CdmWin theWinMain = null;
// La fenêtre du réseau
public static CdmWin.WinInternal theWinLayout = null;
// La fenêtre de la gallerie des trains
public static CdmWin.WinInternal theWinGallery = null;
// Zone d'affichage des fenêtres internes
private JDesktopPane mainDesktop = new JDesktopPane();
private static byte winNum = 0;
// Constructeur
// ptitle : titre de la fenêtre
public CdmWin(String ptitle) {
// Zone d'affichage de la fenêtre
Rectangle screenBounds = Global.SCREEN_PRIMARY_BOUNDS;
theWinMain = this;
// On place la fenêtre sur le bon écran
this.setBounds(screenBounds.x, screenBounds.y, screenBounds.width, screenBounds.height);
Global.cdmMainWin = this.getBounds();
// Son titre
this.setTitle(ptitle);
// Quitte l'application quand on clique sur le bouton de fermeture de la fenêtre
this.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
// Pour que la fenêtre reste toujours au premier plan
this.setAlwaysOnTop(true);
// Zone d'affichage des éléments ajoutés à la fenêtre
JPanel mainDisplayArea = (JPanel)this.getContentPane();
JPanel internalDisplayArea= new JPanel();
// Couleur de fond de la zone Desktop
mainDesktop.setBackground(Global.mainBackgroundColor);
// Indique que c'est la zone de la fenêtre
this.setContentPane(mainDisplayArea);
// Zone pour les fenêtres internes
// mainDisplayArea.add(mainDesktop, BorderLayout.CENTER);
internalDisplayArea.add(mainDesktop, BorderLayout.CENTER);
JScrollPane scrollPane = new JScrollPane(internalDisplayArea, ScrollPaneConstants.VERTICAL_SCROLLBAR_AS_NEEDED, ScrollPaneConstants.HORIZONTAL_SCROLLBAR_AS_NEEDED);
mainDisplayArea.add(scrollPane);
// Création de la fenêtre du réseau
// Pas visible lors de la création de la fenêtre
mainDesktop.add(theWinLayout = new WinInternal(Global.whichLanguage == Menu.MENU_OPTIONS_LANGUE_FRENCH ? "Le réseau" : "The Layout"));
// Création de la fenêtre de la galerie des trains
// Pas visible lors de la création de la fenêtre
mainDesktop.add(theWinGallery = new WinInternal(Global.whichLanguage == Menu.MENU_OPTIONS_LANGUE_FRENCH ? "La Galerie de trains" : "The Train Gallery"));
// Création du panneau contenant les boutons icnones pour la création et la gestion du contour du réseau
// BarButtons theLayoutContour = new BarButtons();
// Affiche le menu
Menu.CreateMenus(this);
// Maj de l'état de tous les menus
// Affiche la fenêtre
this.setVisible(true);
}
// Classe des fenêtres du réseau et de la gallerie des trains
public class WinInternal extends JInternalFrame {
// Pour éviter un warning
private static final long serialVersionUID = 4993363235763093908L;
// Classe pour la zone d'affichage des composant de la fenêtre interne
public class DisplayArea extends JPanel {
// Pour éviter un warning
private static final long serialVersionUID = -5609983333478303182L;
// Cette fonction est appelée à chaque interraction de l'utilisateur sur la fenêtre
public void paintComponent(Graphics g) {
g.setColor(Color.white);
g.fillOval(20, 20, 75, 75);
}
}
// Constructeur
public WinInternal(String ptitle) {
// Titre de la fenêtre
// Les quatres true indiquent dans l'ordre
// On peut la redimensionner
// On peut la ferner
// On peut la maximiser
// On peut la minimiser (icone)
super(ptitle, true, true, true, true);
// Met à la taille par défaut
this.setSize(Global.cdmMainWin.width - 40, Global.cdmMainWin.height - 120);
// Positionne les fenêtre en les décalant
winNum++;
this.setLocation(winNum * 10, winNum * 10);
// Zone d'affichage des composants ajoutés à la fenêtre
DisplayArea theDisplayArea = new DisplayArea();
// Couleur de fond de la zone d(affichage
theDisplayArea.setBackground(Global.internalBackgroundColor);
// Indique que c'est la zone d(affichage de la fenêtre
this.setContentPane(theDisplayArea);
}
} |
Avec le code en orange et sans le code en rouge cela ne fonctionne pas
J'obtiens cet affichage
Pièce jointe 679159
Le code en rouge sans le code en orange me permet d'avoir ceci comme affichage
Pièce jointe 679160
Merci pour l'aide
Louis