problem wyświetlaniem grafiki, dla panelu zawartego w innym panelu

Odpowiedz Nowy wątek
2011-09-06 12:17
0

witam,

mam problem z wyświetlaniem grafiki.
Mam ramkę (Ramka), w niej JPanel (panel)i w tym panelu próbuję ustawić inny JPanel (Rysunek) z grafiką (tu dla uproszcznia niech będzie zwykły kwadrat), ale nie działa. Nie działa również, gdy Rysunek to JComponent, ale wyświetla się gdy Rysunek dodaję bezpośrednio do ramki a nie innego panelu.
Zupełnie nie wiem czemu i bardzo proszę o pomoc.

import java.awt.EventQueue;
import java.awt.Graphics;
import java.awt.Graphics2D;
import javax.swing.JFrame;
import javax.swing.JPanel;
 
public class test{
    public static void main(String[] args) {
        EventQueue.invokeLater(new Runnable(){
            public void run(){
                JFrame ramka=new Ramka();
                ramka.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
                ramka.setVisible(true);
            }
        });
    }
}
class Ramka extends JFrame{
    public Ramka(){
        setSize(200,200);
        add(new panel()); // działa jeśli zamienić na: add(new Rysunek());
    }
}
 
class panel extends JPanel{
 
    public panel(){
        add(new Rysunek());
    }
}
 
class Rysunek extends JPanel{
    public Rysunek(){
        setSize(100,100);
    }
    public void paintComponent(Graphics g){
        Graphics2D g2=(Graphics2D)g;
        g2.drawRect(50, 50, 30, 30);
    }
}
 

Pozdrawiam
Tomek

edytowany 3x, ostatnio: Tompey, 2011-09-06 14:39

Pozostało 580 znaków

2011-09-06 14:39
0

To powinno pomóc:

class Ramka extends JFrame{
    public Ramka(){
        setSize(700,600);
        add(new panel(), BorderLayout.NORTH);
    add(new Rysunek(), BorderLayout.CENTER);
    }
} 

Czyli zależy co gdzie dodajesz ;)

edytowany 2x, ostatnio: szypxx, 2011-09-06 14:41

Pozostało 580 znaków

2011-09-06 14:49
0
szypxx napisał(a)

To powinno pomóc:

class Ramka extends JFrame{
public Ramka(){
setSize(700,600);
add(new panel(), BorderLayout.NORTH);
add(new Rysunek(), BorderLayout.CENTER);
}
} 

Czyli zależy co gdzie dodajesz ;)

Dzięki, ale nie o to chodzi. Chcę zawrzeć panel w innym panelu, a Ty dodajesz Rysunek bezpośrednio do ramki

Pozostało 580 znaków

2011-09-06 15:43
0

A teraz ???

class Ramka extends JFrame{
    public Ramka(){
        setSize(700,600);
    panel p = new panel();
    add(p);
        p.add(new Rysunek());
 
    }
} 
edytowany 3x, ostatnio: szypxx, 2011-09-06 15:44
Teraz naszły mnie wątpliwości czy to jednak to :/ - szypxx 2011-09-06 15:46

Pozostało 580 znaków

2011-09-06 17:18
bo
class panel extends JPanel{ 
    public panel(){
        setLayout(new BorderLayout());
        add(new Rysunek()); //możesz wywołać metodą add z drugim argumentem podającym obszar gdzie chcesz umieścić Rysunek
    }
}

Pozostało 580 znaków

2011-09-07 08:02
0
bo napisał(a)
class panel extends JPanel{ 
public panel(){
setLayout(new BorderLayout());
add(new Rysunek()); //możesz wywołać metodą add z drugim argumentem podającym obszar gdzie chcesz umieścić Rysunek
}
}

Świetnie, działa:)
Dziękuję i serdecznie pozdrawiam

Może ktoś obeznany ze Swingiem (np. Olamagato) wyjaśni dlaczego nie działa z domyślnym menadżerem dla JPanel, tzn. z FlowLayout. Dla kilku innych menadżerów sprawdziłem i działa. - bogdans 2011-09-07 08:21
byłem o krok;) Ale brak wiedzy przeszkadza - nie wiedziałem czego nie mogę ustawić rozmiaru panela - szypxx 2011-09-07 15:08

Pozostało 580 znaków

2011-09-07 09:45
0

FlowLayout działa perfekcyjnie. Rysunek też się rysuje.

Przy tym managerze rozmiary i umiejscowienie rysowania wyglądają tak:
Panel: java.awt.Rectangle[x=0,y=0,width=190,height=167]
Rysunek w PaneluRysunku: java.awt.Rectangle[x=90,y=5,width=10,height=10]
Rysowane:java.awt.Rectangle[x=50,y=50,width=30,height=30]

Dla BorderLayout wyglądają tak:
Panel: java.awt.Rectangle[x=0,y=0,width=190,height=167]
Rysunek w PaneluRysunku: java.awt.Rectangle[x=0,y=0,width=190,height=167]
Rysowane:java.awt.Rectangle[x=50,y=50,width=30,height=30]

Proponowałbym zmienić instrukcję rysowania na taką:
g2.drawRect(5, 5, 30, 30);
żeby przekonać się, że kolega próbuje rysować poza znanym kosmosem. :)

Przy używaniu paint w różnych odmianach przydatne jest rysowanie w każdym panelu prostokąta obejmującego całe getBounds() komponentu. Jest to szczególnie niezbędne kiedy używa się arbitralnie wybranych wartości (czyli również absolutnego rozmieszczania komponentów).


Jeżeli ktoś komuś coś, ewentualnie nikt nikomu nic, to właściwie po co...?
edytowany 4x, ostatnio: Olamagato, 2011-09-07 10:06

Pozostało 580 znaków

2011-09-07 10:38
0

Dzięki za odzew. Nie jest dla mnie niestety jasne dlaczego rozmiar panelu zależy od użytego menadżera i dla FlowLayout jest istotnie mniejszy.


To smutne, że głupcy są tak pewni siebie, a ludzie mądrzy - tak pełni wątpliwości. Bertrand Russell

Pozostało 580 znaków

2011-09-07 19:26
0

W przypadku FlowLayout kluczową informacją jest ostatnie zdanie z dokumentacji klasy:
"A flow layout lets each component assume its natural (preferred) size."

I tak na marginesie zawsze mnie zastanawiało po jakiego grzyba uczy się ludzi, że mają używać setSize do ustalenia rozmiaru komponentu, skoro w ogólnym przypadku nie jest to prawdą (jest tylko w szczególnym wypadku gdy odpali się setLayout(null)).
Metoda setSize służy do zmiany aktualnego rozmiaru, a nie do jego inicjowania. Do inicjowania służą metody setMinimumSize, setMaximumSize oraz setPreferredSize, które powinny być używane w konstruktorze każdego komponentu. Generalnie setSize powinno być dostępne wyłącznie dla managerów rozkładu bo pojedynczy komponent nie ma pełnej wiedzy o tym jaki powinien mieć rozmiar. Tę wiedzę mają tylko layout managery.
Tak nie jest dlatego, że rozkład absolutny jest historycznie pierwszym istniejącym rozkładem (nie został wyeliminowany) oraz dlatego, że "setSize", która w JDK 1.0 nazywała się "resize" była wtedy publiczna. Jednak wcześniejsza nazwa moim zdaniem lepiej oddawała właściwy sposób używania tej metody, mimo iż przestała być koszerna w Java Beans. :)


Jeżeli ktoś komuś coś, ewentualnie nikt nikomu nic, to właściwie po co...?

Pozostało 580 znaków

Odpowiedz
Liczba odpowiedzi na stronę

1 użytkowników online, w tym zalogowanych: 0, gości: 1, botów: 0