Nowe posty

xx Problem ze sterownikami. (5)
2024-04-13, 21:25:16
xx Instalacja xfce4 (2)
2024-04-13, 16:20:17
xx Serie kompilacji bez instalacji dla “emerge” w Gentoo (2)
2024-04-08, 18:40:04
xx Plasma 6 w Neonie ssie trochę mniej ... (17)
2024-04-05, 10:03:46
xx Problem z Linux Lite po instalacji (3)
2024-04-03, 14:23:40
xx Jak właczyć num locka przy starcie systemu debian 12? (12)
2024-04-02, 17:43:54
xx Brak dźwieku w systemie. (5)
2024-04-02, 16:13:41
xx Dystrybucja pod HP Omen (7)
2024-03-29, 11:33:05
xx [Poradnik] Wyszukiwanie Sterowników (2)
2024-03-27, 21:08:23
xx Ile pingwinów? (1)
2024-03-27, 08:59:24

Autor Wątek: Java i Swing - problem z JPanel i JScrollPane :(  (Przeczytany 8758 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.