2017-10-12 6 views
0

Je suis un débutant Java (1 mois d'expérience) mais je l'aime tellement loin!
Je dois implémenter une fonctionnalité sur une application de planification que je n'ai pas créée, je dois faire en sorte que le panneau contenant les jours reste fixe pendant le défilement (en-têtes de type Excel).Comment garder un JPanel fixé lors du défilement dans un JScrollPane en Java?

Alors que la recherche de réponses, je trouve la plupart des méthodes utilisant JTable mais le problème est que je n'utilise que JPanel ou MainPanel, qui s'étend JPanel, contenue dans le WindowPanel (JPanel) avec TopPanel (JPanel) (ne montrant pas dans l'image qui est déjà réparé). J'utilise la méthode setColumnHeaderView() qui semble être la seule à montrer des résultats.

//MainWindow 
    MainPanel mainPanel = new MainPanel(model); 
    mainPanel.init(); //fill the mainPanel 
    windowPanel.add(mainPanel); 

    JViewport blabla = new JViewport(); 
    blabla.setPreferredSize(mainPanel.getPreferredSize()); 
    blabla.setView(mainPanel); 
    //JViewport blabla2 = new JViewport(); 
    //blabla2.setPreferredSize(windowPanel.getPreferredSize()); 

    scroll = new JScrollPane(windowPanel); 
    scroll.setColumnHeaderView(blabla); 


    getContentPane().add(scroll); 
    this.addMouseListener(new FocusSetterListener()); 

    this.pack(); 
    this.setVisible(true); 

Avec cette méthode, je reçois l'en-tête à droite, mais pas scrollbar, et le panneau ci-dessous (ici le WindowPanel) reste juste bleu.

ResultScreenshot1

En fait, à la place du WindowPanel je dois afficher le rempli MainPanel, qui travaille quand je fais ça:

 //MainWindow 
    MainPanel mainPanel = new MainPanel(model); 
    mainPanel.init(); //fill the mainPanel 
    windowPanel.add(mainPanel); 

    JViewport blabla = new JViewport(); 
    blabla.setPreferredSize(mainPanel.getPreferredSize()); 
    blabla.setView(mainPanel); 

    scroll = new JScrollPane(mainPanel); 
    scroll.setColumnHeaderView(blabla); 

    getContentPane().add(scroll); 
    this.addMouseListener(new FocusSetterListener()); 

    this.pack(); 
    this.setVisible(true); 

Mais l'en-tête reste bleu et le Days en-tête est pas fixe, c'est juste en dessous de l'en-tête mais tout le reste se charge bien y compris la barre de défilement (pas si pertinent donc pas dans les images). Pour plus d'informations, le panneau ci-dessous est formé de customPanels appelé cellPanels:

Result Screenshot 2

Result Screenshot 2

Je pense que je suis proche de mon but, mais je testé beaucoup de choses et rien entièrement travaillé. Je cherche quelqu'un pour m'expliquer ce que je fais mal et m'aider à le réparer.

Merci pour votre temps!

Répondre

0

je trouve une solution acceptable,

Je chargé une copie de mon MainPanel et hided derrière le vrai, sauf pour l'en-tête et appliqué un booléen à toutes les caractéristiques pour éviter la double action. Cela a fonctionné mais c'était assez difficile à déboguer car certaines fonctionnalités étaient obligatoires.

Je suis toujours à la recherche d'une meilleure réponse en raison des problèmes d'optimisation de double chargement non désirés, mais au moins cela fonctionne maintenant!