Page 1 of 1

προσθήκη JPanel σε JScrollPane

Posted: Fri Feb 15, 2008 8:00 pm
by Luke
Το πρόβλημά μου είναι to εξής:
Θέλω να έχω ένα panel το οποίο να είναι scrollable (δηλαδή να περιέχεται σε ένα JScrollPane) και να περιέχει κάποια components (JButtons πιο συγκεκριμένα). Το θέμα είναι ότι με τον κλασσικό τρόπο που προσθέτεις ένα component σε ένα scrollPane δεν εμφανίζονται τα περιεχόμενα του JPanel.

Διάβασα στο api του JScrollPane το εξής:
Provides a scrollable view of a lightweight component.
...
Note that JScrollPane does not support heavyweight components.
που αν κατάλαβα καλά (σε συνδυασμό με παρόμοιες απορίες στα forums της sun) δεν υποστηρίζονται άμεσα containers αντικείμενα (αυτά που αναφέρει ως "heavyweight") όπως το JPanel και το JFrame.

Μήπως υπάρχει καμιά ιδέα για το πώς να επιτύχω το αποτέλεσμα που θέλω με κάποιον άλλο τρόπο;
Να σημειώσω ότι χωρίς τη χρήση του JScrollPane επιτυγχάνω ακριβώς το αποτέλεσμα που θέλω αλλά χωρίς τις μπάρες, επομένως λάθος στον κώδικα δεν υπάρχει.

Re: προσθήκη JPanel σε JScrollPane

Posted: Sat Feb 16, 2008 12:16 am
by StormRider
Χμμ, η λύση φαίνεται να είναι η παρακάτω (ανεξάρτητα αν το JPanel θεωρείται heavyweight):

Αντί για setSize(); στο JPanel σου βάλε setPreferredSize();

π.χ.

Code: Select all

import java.awt.*;
import javax.swing.*;
public class Test1
{
    public static void main(String[] args)
    {
        JFrame frame;
        JPanel panel;
        frame=new JFrame("blah");
        frame.setLayout(null);
        frame.setDefaultCloseOperation( JFrame.EXIT_ON_CLOSE);
 
        panel=new JPanel();
        panel.setBackground(Color.cyan);
        panel.setPreferredSize(new Dimension(200, 200));
        panel.setVisible(true);
        panel.setLocation(0,0);
        panel.setBorder(BorderFactory.createLineBorder(Color.red));
 
        JScrollPane scroll=new JScrollPane(panel);
        scroll.setSize(100,100);
        frame.getContentPane().add(scroll);
        frame.pack();
        frame.setSize(300,300);
        frame.setVisible(true);
    }
}
 
Εδώ, έγινε μια συζήτηση στην οποία έτσι δόθηκε η λύση... Ίσως να υπάρχουν και άλλοι τρόποι...

Re: προσθήκη JPanel σε JScrollPane

Posted: Sat Feb 16, 2008 1:00 pm
by Luke
Τελικά ήταν λάθος το συμπέρασμα ότι το JPanel είναι heavyweight.

Τη συγκεκριμένη δημοσίευση την είχα δει κι εγώ κι έκανα κάτι παρόμοιο αλλά δε βοήθησε σε κάτι. Τελικά το πρόβλημα λύθηκε (εν μέρει) με μία και μόνο γραμμή κώδικα, σαν αυτή:

Code: Select all

scrollPanel.setViewportView(myPanel);
Το θέμα είναι ότι με αυτό τον τρόπο χάνει το layout του panel ή ίσως δεν το χρησιμοποιεί καν (είχα χρησιμοποιήσει flow layout) και αντί να κάνει "αναδίπλωση" των components του panel όταν δε χωράνε στην οθόνη και να τα δείχνει στην από κάτω "γραμμή" συνεχίζει και τα δείχνει οριζόντια. Έτσι από τη στιγμή που δεν έχω οριζόντια μπάρα είναι σαν να χάνονται.

Re: προσθήκη JPanel σε JScrollPane

Posted: Sat Feb 16, 2008 4:02 pm
by cyberpython
δοκίμασε να βάλεις για layout το BoxLayout με κάθετη στοίχιση :
<το panel σου>.setLayout(new javax.swing.BoxLayout(<το panel σου>, javax.swing.BoxLayout.Y_AXIS));

Άν έχεις πολλά components σε κάθε σειρά, τότε δοκίμασε να τα βάλεις σε διαφορετικά panels και μετά βάλε τα panels στο αρχικό panel που είναι το view του JScrollPane.