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

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

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 ;)

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

0

A teraz ???

class Ramka extends JFrame{
    public Ramka(){
        setSize(700,600);
	panel p = new panel();
	add(p);
        p.add(new Rysunek());
	
    }
} 
1
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
    }
}
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

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).

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.

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. :)

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