A więc muszę napisać grę, o której już kiedyś wspominałem i teraz mam problem ze swingiem. Jestem bardzo początkujący w Swingu i nie wiem jak powinno się używać tych komponentów.
Mam JFrame Okno i do niego chcę wrzucić dwa panele: jeden z Buttonami a drugi z planszą. Kombinowałem już na różne sposoby i mam takie problemy:
Plansza się nie wyświetla od razu, tylko dopiero po naciśnięciu Buttona.
Po naciśnięciu Buttona wszystkie Buttony znikają i pojawiają się dopiero po najechaniu kursorem na jakiś.
Mam taki kod, trochę chaotyczny, bo zmieniam co chwilę i kombinuję jak zrobić żeby to działało:
public class Plansza extends JPanel, wrzuce tylko kod do rysowania, bo reszta jest raczej nieważna:
public void paintComponent(Graphics g)
{
super.paintComponent(g);
Graphics2D graph = (Graphics2D) g;
graph.setColor(new Color(10, 10, 10));
graph.fillRect(0, 0, 32*cols+2, 32*rows+2);
graph.setColor(new Color(10, 100, 100));
pola[0].DrawSequence(graph, 0, this);
}
Plansza zawiera tablicę różnych Pól, pola mają swoje funkcje do rysowania.
pola[0].DrawSequence(graph, 0, this)- nie mogę używać instrukcji sterujących, dlatego każde pole rysuje siebie, a później wywołuje funkcje do rysowania na następnym polu itd.
Na końcu każdej funkcji, która modyfikuje planszę wywołuję repaint() i działa to poprawnie.
I teraz klasa Okno która sprawia problemy:
public class Okno extends JFrame
{
private Toolkit toolkit;
private Plansza pl;
public Okno(Plansza p)
{
//-------poczatkowe inicjalizacje--------------
Graphics g=getGraphics();
setTitle("Sokoban");
setSize(1000, 700);
setDefaultCloseOperation(EXIT_ON_CLOSE);
//wyswietlenie okna na srodku ekranu
toolkit = getToolkit();
Dimension screen = toolkit.getScreenSize();
setLocation(screen.width/2 - getWidth()/2,screen.height/2 - getHeight()/2);
JPanel panel = new JPanel();
panel.setLayout(null);
panel.setBounds(0,0,1000,700);
// setLocationRelativeTo(null);
//-----------------------------dodawanie guzikow-------------------------------
//-------------gora---------------------------
JButton gora = new JButton("Góra");
gora.setBounds(750, 400, 80, 50);
gora.addActionListener(new ActionListener()
{
public void actionPerformed(ActionEvent event) {
System.out.print("wGore"); // gora
pl.wGore();
}
});
//---------------------dol-----------------------------
JButton dol = new JButton("Dół");
dol.setBounds(750, 450, 80, 50);
dol.addActionListener(new ActionListener()
{
public void actionPerformed(ActionEvent event) {
pl.wDol();
validate();
}
});
JButton lewo = new JButton("Lewo");
lewo.setBounds(670, 450, 80, 50);
lewo.addActionListener(new ActionListener()
{
public void actionPerformed(ActionEvent event) {
pl.wLewo();
validate();
}
});
JButton prawo = new JButton("Prawo");
prawo.setBounds(830, 450, 80, 50);
prawo.addActionListener(new ActionListener()
{
public void actionPerformed(ActionEvent event) {
pl.wPrawo();
validate();
}
});
pl=p;
pl.setBounds(0,0,600,600);
pl.setVisible(true);
//add(pl);
panel.add(gora);
panel.add(dol);
panel.add(lewo);
panel.add(prawo);
add(panel);
panel.setVisible(true);
validate();
panel.validate();
setVisible(true);
}
Chciałem zrobić coś takiego że do Frame dodaję dwa panele: planszę i panel z guzikami, które wywołują jakieś funkcje na planszy. Ale nie wychodzi mi, bo albo jest pusty Frame, albo są tylko guziki, albo tylko plansza, albo guziki znikają jak teraz i plansza nie wyświetla się od razu.
Co zrobić aby plansza od razu się wyświetliła i co zrobić żeby buttony nie znikały?
Kombinowałem z rożnymi rozmiarami panelu, położeniem itp. i nic nie pomaga. Próbowałem repaint(), validate() ale też nie działa.
Plansza będzie miała zmienny rozmiar, jak zrobić żeby Frame się dostosował do rozmiaru planszy tak aby zmieściła się cała plansza z guzikami po prawej stronie i został jakiś stały margines, np 50 pixeli z każdej strony?