[Problem] rozmieszczanie przycisków w JPanel

0

Witajcie, to mój pierwszy kontakt z językiem wysokiego poziomu. Utworzyłem osobną klasę JBackgroundPanel, mająca na celu utworzenie JPanelu, którego tłem jest obrazek:

class JBackgroundPanel extends JPanel
{
public JBackgroundPanel(String bg) {
setOpaque(false);
backgroundImage = new ImageIcon(bg);
}
public void paintComponent(Graphics g) {
if (backgroundImage != null) g.drawImage(backgroundImage.getImage(),0,0,getWidth(),getHeight(),null);
super.paintComponent(g);

  										};

private ImageIcon backgroundImage;
}

oraz klasę - okienko z przyciskami class Start:

class Start extends JFrame implements ActionListener
{
private JBackgroundPanel tlo = new JBackgroundPanel("tlo.jpg");
public Start(){
super("Menu");
getContentPane().add(tlo);
setSize(800,600);
setResizable(false);
//setLayout(null);
PanelGlowny();
setVisible(true);
repaint();
}//end public start

public void PanelGlowny()
{
JLabel tekst = new JLabel("Rozróżnianie Kształtów");
tekst.reshape(300,40,300,50);
tekst.setFont(new Font("arial", Font.BOLD, 20));
tlo.add(tekst);
JButton przycisk1 = new JButton("Rozpocznij nową grę");
przycisk1.setBounds(125,150,200,80);
tlo.add(przycisk1);
przycisk1.addActionListener(this);
JButton przycisk2 = new JButton("Wznów grę");
przycisk2.reshape(475,150,200,80);
przycisk2.addActionListener(this);
tlo.add(przycisk2);
JButton przycisk3 = new JButton("POMOC");
przycisk3.reshape(165,300,120,50);
przycisk3.addActionListener(this);
tlo.add(przycisk3);
JButton przycisk4 = new JButton("KONIEC");
przycisk4.reshape(515,300,120,50);
przycisk4.addActionListener(this);
tlo.add(przycisk4);
}

   	public void actionPerformed(ActionEvent e)
  	{
  		String nazwa = e.getActionCommand();
  		if(nazwa.equals("Rozpocznij nową grę"))
  	{	
  	dispose();
  	new OknoGlowne();	
  			
  	}
  		if(nazwa.equals("Wznów grę"))
  	{	
  	dispose();
  	new OknoGlowne();	
  			
  	}
  	}

} //koniec public class start

Problem w tym, że przyciski nie reagują na reshape, ani na setBounds. Gdy stosuję takie cudo jak GridLayout, nie można ustalić ich rozmiaru w pikselach, ani dowolnie ich ustawić (albo raczej jest to niezwykle skomplikowane). Teraz kombinuję coś z containerami, ale wydaje mi się, że to jest zła droga. Zależy mi na tym, by można było dowolnie rozmieszczać przyciski, po prostu podając współrzędne zaczepienia przycisku i jego rozmiar. Męczę się z tym już parę godzin, a rozwiązanie z pewnością jest trywialne, więc gorąco proszę o podpowiedzi.

0

Metoda reshape() jest przestarzała, używaj setBounds(). Jeżeli chcesz rozmieszczać ręcznie, to wyłącz menadżera rozkładu (setLayout(null)).
Co to jest tlo?

tlo.add(tekst);
0

setLayout(null) jest zakomentowany, nie używam go. Tło (tlo), jest nazwą (czy jak to się w programowaniu obiektowym nie nazywa) od klasy JBackgroundPanel dziedziczącej z JPanel.

private JBackgroundPanel tlo = new JBackgroundPanel("tlo.jpg");

tlo.add(tekst); wrzuca mi tekst i przyciski na JPanel.

Dzięki za rady, ale problem jest nadal aktualny.

0

Umiesz czytać ze zrozumieniem?

Jeżeli chcesz rozmieszczać ręcznie, to wyłącz menadżera rozkładu (setLayout(null)).

Ty chcesz rozmieszczać ręcznie, więc musisz użyć setLayout(null).

0

No teraz zrozumiałem, wyłączenie dla mnie = zakomentowanie, nvm. W każdym razie nie mogę wyłączyć menadżera rozkładu, bo wtedy znika mi obrazek z tła. Jest jakiś prosty sposób, na rozłożenie przycisków przy włączonym menadżerze? Chyba, że da się go wyłączyć i sprawić aby tło nie znikało.

0

Jak chcesz rozmieszczać ręcznie, to musisz wyłączyć menadżera rozkładu

class Start extends JFrame implements ActionListener
{
            private JPanel tlo = new JPanel();
            public Start(){            
                super("Menu");
                add(tlo);                                                
                tlo.setPreferredSize(new Dimension(w,h)); //zamiast w i h wpisz rozmiar obrazka, który jest tłem         tlo.setLayout(null);
                setResizable(false);
                PanelGlowny();
                setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
                pack();
                setLocationRelativeTo(null); //żeby okno było na środku
                setVisible(true);
                
}//end public start
                           

                   
public void PanelGlowny()
        {
                JLabel tekst = new JLabel("Rozróżnianie Kształtów");
                tekst.setBounds(300,40,300,50);
                tekst.setFont(new Font("arial", Font.BOLD, 20));
                tlo.add(tekst);
                JButton przycisk1 = new JButton("Rozpocznij nową grę");
                przycisk1.setBounds(125,150,200,80);
                tlo.add(przycisk1);
                przycisk1.addActionListener(this);
                JButton przycisk2 = new JButton("Wznów grę");
                przycisk2.setBounds(475,150,200,80);
                przycisk2.addActionListener(this);
                tlo.add(przycisk2);
                JButton przycisk3 = new JButton("POMOC");
                przycisk3.setBounds(165,300,120,50);
                przycisk3.addActionListener(this);
                tlo.add(przycisk3);
                JButton przycisk4 = new JButton("KONIEC");                                
                przycisk4.setBounds(515,300,120,50);
                przycisk4.addActionListener(this);
                tlo.add(przycisk4);

                JLabel bg=new JLabel(new ImageIcon("tlo.jpg"));
                bg.setOpaque(true);
                bg.setBounds(0,0,w,h); //zamiast w,h wpisz rozmiar obrazka
                tlo.add(bg);
        }

                         public void actionPerformed(ActionEvent e)
                        {
                                String nazwa = e.getActionCommand();
                                if(nazwa.equals("Rozpocznij nową grę"))
                        {        
                        dispose();
                        new OknoGlowne();        
                                       
                        }
                                if(nazwa.equals("Wznów grę"))
                        {        
                        dispose();
                        new OknoGlowne();        
                                       
                        }
                        }

} //koniec public class start
0

Dzięki bardzo! Nie sądziłem, że można to tło zrobić w tak banalnie prosty sposób. Temat niezgodny z tym czym okazał się być w rzeczywistości mój problem, więc raczej do skasowania. Jeszcze raz dzięki, bo, za chęć niesienia pomocy i wyrozumiałość.

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