Nowe posty

xx Dystrybucja pod HP Omen (6)
2024-03-27, 23:30:08
xx [Poradnik] Wyszukiwanie Sterowników (2)
2024-03-27, 21:08:23
lamp Problem z Linux Lite po instalacji (0)
2024-03-27, 19:50:30
xx Ile pingwinów? (1)
2024-03-27, 08:59:24
xx konfiguracja pale moon (0)
2024-03-24, 21:53:42
xx Plasma 6 w Neonie ssie trochę mniej ... (10)
2024-03-23, 02:38:11
xx problem z instalacja sterowników do karty sieciowej (3)
2024-03-18, 18:10:16
xx Plik abc.001 (1)
2024-03-17, 17:48:27
xx Zlecę dopracowanie programu w MatLab (0)
2024-03-13, 15:28:40
xx Linux Mint 21.3 XFCE brak dźwieku po paru minutach (karta muzyczna zintegrowana) (5)
2024-03-12, 23:07:01

Autor Wątek: Java i Swing - problem z JPanel i JScrollPane :(  (Przeczytany 8745 razy)

axlinux

  • Gość
Java i Swing - problem z JPanel i JScrollPane :(
« dnia: 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ć :)

jk33

  • Gość
Java i Swing - problem z JPanel i JScrollPane :(
« Odpowiedź #1 dnia: 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.