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

Συζητήσεις για γλώσσες προγραμματισμού και θέματα σχετικά με προγραμματισμό.
Post Reply
User avatar
Luke
Gbyte level
Gbyte level
Posts: 1388
Joined: Wed Aug 09, 2006 11:19 am
Academic status: Alumnus/a
Gender:

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

Post by Luke » Fri Feb 15, 2008 8:00 pm

Το πρόβλημά μου είναι 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 επιτυγχάνω ακριβώς το αποτέλεσμα που θέλω αλλά χωρίς τις μπάρες, επομένως λάθος στον κώδικα δεν υπάρχει.
Είμαι ένας μοναχικός cowboy...
StormRider
Gbyte level
Gbyte level
Posts: 1040
Joined: Mon Dec 18, 2006 5:34 pm
Gender:

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

Post by StormRider » Sat Feb 16, 2008 12:16 am

Χμμ, η λύση φαίνεται να είναι η παρακάτω (ανεξάρτητα αν το 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);
    }
}
 
Εδώ, έγινε μια συζήτηση στην οποία έτσι δόθηκε η λύση... Ίσως να υπάρχουν και άλλοι τρόποι...
Image
User avatar
Luke
Gbyte level
Gbyte level
Posts: 1388
Joined: Wed Aug 09, 2006 11:19 am
Academic status: Alumnus/a
Gender:

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

Post by Luke » Sat Feb 16, 2008 1:00 pm

Τελικά ήταν λάθος το συμπέρασμα ότι το JPanel είναι heavyweight.

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

Code: Select all

scrollPanel.setViewportView(myPanel);
Το θέμα είναι ότι με αυτό τον τρόπο χάνει το layout του panel ή ίσως δεν το χρησιμοποιεί καν (είχα χρησιμοποιήσει flow layout) και αντί να κάνει "αναδίπλωση" των components του panel όταν δε χωράνε στην οθόνη και να τα δείχνει στην από κάτω "γραμμή" συνεχίζει και τα δείχνει οριζόντια. Έτσι από τη στιγμή που δεν έχω οριζόντια μπάρα είναι σαν να χάνονται.
Είμαι ένας μοναχικός cowboy...
User avatar
cyberpython
Mbyte level
Mbyte level
Posts: 654
Joined: Wed Nov 21, 2007 8:18 pm
Academic status: Alumnus/a
Gender:
Location: Αθηνα
Contact:

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

Post by cyberpython » Sat Feb 16, 2008 4:02 pm

δοκίμασε να βάλεις για layout το BoxLayout με κάθετη στοίχιση :
<το panel σου>.setLayout(new javax.swing.BoxLayout(<το panel σου>, javax.swing.BoxLayout.Y_AXIS));

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

Return to “Προγραμματισμός”