Forum Linux.pl

Programowanie => Java => Wątek zaczęty przez: axlinux w 2009-06-09, 21:47:25

Tytuł: Java i Swing - problem z JPanel i JScrollPane :(
Wiadomość wysłana przez: axlinux w 2009-06-09, 21:47:25
Chciałbym rozwiązać pewien problem. W swoim programie rozszerzam klasę JPanel. W aplikacji chciałbym dodać kilka obiektów mojej klasy do okna, jednak nie potrafię zmusić jego aby w przypadku wielu dodanych paneli było scrollowanie. Mniej więcej obrazuje to kod źródłowy jaki wprowadziłem.

Efektem jego jest ukazanie się okna, które posiada dwa panele jednak brak jest scrolla tak że nie można przewijać zawartości okna. I nie widać całego panelu.

import java.awt.Color;
import javax.swing.*;


public class Okno extends JFrame
{

    public Okno()
    {
        setSize(200,200);
        setResizable(false);
        setUndecorated(true);


        JScrollPane scroll = new JScrollPane();
        scroll.setLayout(null);

        Panel p1 = new Panel();
        p1.setSize(300, 100);
        p1.setLocation(0, 0);

        Panel p2 = new Panel();
        p2.setSize(300, 100);
        p2.setLocation(0, 102);
       
        scroll.add(p1);
        scroll.add(p2);

        this.add(scroll);        

        setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
       
        setLocationRelativeTo(null);

    }


    public static void main(String[] args)
    {
        Okno o = new Okno();
        o.show();
    }

    public class Panel extends JPanel
    {
        public Panel()
        {
            JLabel l = new JLabel("To jest bardzo długi napis i nie mieści się w oknie");
            setBackground(Color.yellow);

            setLayout(null);
            add(l);
            l.setLocation(5, 5);
            l.setSize(300, 20);
        }
    }

}
Dziękuję za zainteresowanie się moim problemem i za wskazanie jak to poprawnie zrobić :)
Tytuł: Java i Swing - problem z JPanel i JScrollPane :(
Wiadomość wysłana przez: jk33 w 2009-06-10, 20:45:29
Szczerze mówiąc, to nie programuję w javie i prawie nie miałem styczności ze swingiem, ale na moje to jest tak, że JScrollPane pobiera dane dane o potrzebnym rozmiarze dla danego kontenera (JPanel w tym przypadku) na podstawie jego układu. Którego u Ciebie nie ma..
http://www.jguru.com/faq/view.jsp?EID=58838
setLayout(null);
Jeśli zamienisz to na jakieś sensowne układy we wszystkich miejscach, to powinno zadziałać. W szczególności pozycjonowania według współrzędnych pikselowych należy raczej unikać, bo przy zmianie rozmiarów czcionek, czy chociaż dpi (inny monitor) może się łatwo rozsypać.
        Panel p2 = new Panel();
        p2.setSize(300, 100);
        p2.setLocation(0, 102);
metoda add dla JScrollPane nie działa tak jak byś chciał.. Nie potrafię Ci wyjaśnić co dokładnie się dzieje, żeby to ogarnąć, to trzeba zobaczyć jak działa JScrollPaneLayout.
Tu jest schemat układu: http://java.sun.com/j2se/1.4.2/docs/api/javax/swing/JScrollPane.html
przykład użycia:
http://forums.devshed.com/java-help-9/jscrollpane-layout-manager-193654.html

Czyli generalnie w scrollpane może siedzieć co najwyżej jeden widget. Zatem potrzebujesz dodatkowego kontenera z jakimś układem, który będzie trzymał te dwa panele.
**
Do tego trzeba coś zrobić z setLauout(null) w konstruktorze Panelu.