wyswietlenie kawadratu po zmianie okna

0

Witam,
mam problem z wyświetleniem kwadratu, który ma zmieniać swoją pozycję. Normalnie nie ma z tym problemu, ale ja chciałbym, żeby to wszystko było wyświetlane kiedy nacisnę przycisk "Nowa gra". Oto kod:

 import java.awt.BorderLayout;
import java.awt.FlowLayout;
import java.awt.Toolkit;
import java.util.Timer;
import java.util.TimerTask;
import java.util.*;
import java.awt.*;
import java.awt.Color;
import java.awt.Graphics;
import java.awt.Graphics2D;
import java.awt.event.*;
import javax.swing.JFrame;
import javax.swing.JPanel;
import javax.swing.JTextField;
import javax.swing.*;
 


public class panele extends JFrame {
	int x = 0, y = 0;
 
    JPanel basic = new JPanel();
    JPanel panelmenu = new JPanel();
    JPanel panelprzyciskow = new JPanel();
    JPanel paneldrugi = new JPanel();
    
    JButton nowagra = new JButton("Nowa Gra");
    
    boolean ch = false;
    boolean ach = false;
    boolean bch = false;
    boolean cch = false;
 
    public panele() {
        super("window"); 
        
        setLayout(new BorderLayout());
        basic.setLayout(new BorderLayout());
        add(basic);   
        basic.setBackground(Color.black);
        panelmenu.setBackground(Color.red);
        panelprzyciskow.setBackground(Color.blue);
        paneldrugi.setBackground(Color.yellow);
        
        basic.add("Center", panelmenu);
        basic.add("East",panelprzyciskow);
        panelprzyciskow.add(nowagra);
        
        
        
        
        nowagra.addActionListener(new nowagra());
    }
 
    
    
    class xxx implements ActionListener {
   	 
        public void actionPerformed(ActionEvent e) {
        	if (!ach)
            {
            	basic.removeAll();
                basic.revalidate();
                repaint();
            } else {
            	basic.removeAll();
                basic.add(paneldrugi);
                basic.revalidate();
                repaint();
            }
        	ach = !ach;
    }
    }
    class nowagra implements ActionListener {
   	 
        public void actionPerformed(ActionEvent e) {
        	if (!bch)
            {
            	basic.removeAll();
                basic.add(paneldrugi);
                basic.revalidate();
                repaint();
            } else {
            	basic.removeAll();
                basic.add(panelmenu);
                basic.revalidate();
                repaint();
            }
        	bch = !bch;
        	
    }
    }
    class gra extends JPanel implements KeyListener 
	{
		public void paint (Graphics o)
		{
			
			o.setColor(Color.green);
			o.fillRect(x,y,50,50);
			
			
		}
		public void keyTyped(KeyEvent e){

	    }
		public void keyReleased(KeyEvent e){

	    }

	    public void keyPressed(KeyEvent e){

	            int keyCode = e.getKeyCode();

	            if (keyCode == KeyEvent.VK_D)
	            {
	            	x = x + 50;          	
	            		            	
	            }
	            this.repaint();
	       
	    }
	}
    public static void main(String[] args) {
        SwingUtilities.invokeLater(new Runnable() {
 
            public void run() {
                JFrame fr = new panele();
                fr.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
                fr.setSize(200, 200);
                fr.setVisible(true);
                fr.setResizable(true);
            }
        });
    }
}
 

Póki co nie jest to ni jak połączone ze sobą (okno główne z klasą gra). Próbowałem łączyć to na wiele sposobów, ale to tylko zaśmiecało kod. Może mi ktoś wyjaśnić jak to zrobić, żeby zaczęło działać?
Z góry dzięki.

0
 
import java.awt.*;
import java.awt.event.*;
import javax.swing.*;
import java.awt.Color;
import java.awt.geom.*;

public class Gra
{
	public static void main(String[] args)
	{
		RamkaGry ramka = new RamkaGry();
		ramka.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
		
		ramka.setVisible(true);
	}
}

class RamkaGry extends JFrame
{
	public RamkaGry()
	{
		setTitle("Gra");
		setSize(256,256);
		setResizable(false);
		
		PanelGry panel = new PanelGry();
		Container zawartosc = getContentPane();
		zawartosc.add(panel);
	}
}

class PanelGry extends JPanel
{
	public PanelGry()
	{
		przyciskGra = new JButton("Nowa Gra");
		
		przyciskGra.addActionListener(new
			ActionListener()
			{
				public void actionPerformed(ActionEvent e)
				{
				
					pozycja = new Point2D.Double(szerMapy/2,wysMapy/2);
					
					przyciskGra.setEnabled(false);
					repaint();
					przyciskGra.setEnabled(true);
					
				}
			});
		setBackground(Color.red);	
		add(przyciskGra);
		TestKlawisza tk = new TestKlawisza();
		addKeyListener(tk);
		
	}
	
	public boolean isFocusTraversable(){return true;}
	
	public void paintComponent(Graphics g)
	{
		super.paintComponent(g);
		Graphics2D g2 = (Graphics2D)g;
		rysuj(g2);
	}
	
	public void rysuj(Graphics2D g2)
	{
		//tlo gry
		g2.setColor(Color.black);
		Rectangle2D rt = new Rectangle2D.Double(0,wysMenu,szerMapy,wysMapy);
		g2.draw(rt);
		g2.fill(rt);
		g2.setColor(Color.green);
		Rectangle2D kwadracik = new Rectangle2D.Double(pozycja.getX(),pozycja.getY(),bokKwadracika,bokKwadracika);
		g2.draw(kwadracik);
		g2.fill(kwadracik);
	}
	
	private class TestKlawisza implements KeyListener
	{
		public void keyPressed(KeyEvent e)
		{
			int kod = e.getKeyCode();
			
			if(kod==KeyEvent.VK_UP)
				{
					if(pozycja.getY()>wysMenu)
					pozycja = new Point2D.Double(pozycja.getX(),pozycja.getY()-0.5);
				}
			else if(kod==KeyEvent.VK_DOWN)
				{
					if(pozycja.getY()<wysMapy-bokKwadracika)
					pozycja = new Point2D.Double(pozycja.getX(),pozycja.getY()+0.5);
				}
			if(kod==KeyEvent.VK_LEFT)
				{
					if(pozycja.getX()>0)
					pozycja = new Point2D.Double(pozycja.getX()-0.5,pozycja.getY());
				}
			if(kod==KeyEvent.VK_RIGHT)
				{
					if(pozycja.getX()<szerMapy-bokKwadracika)
					pozycja = new Point2D.Double(pozycja.getX()+0.5,pozycja.getY());
				}
				
				
			repaint();
		}
		
		public void keyReleased(KeyEvent e){}
		
		public void keyTyped(KeyEvent e){}
	}
	
	private int wysMenu = 32;
	private int bokKwadracika = 8;
	private int szerMapy = 256;
	private int wysMapy = 256-wysMenu;
	private Point2D pozycja = new Point2D.Double(szerMapy/2,wysMapy/2);
	private JButton przyciskGra;
}

To mniej wiecej dzialajacy programik tak jak chcesz, kwadrat się porusza po nacisnięciu przycisku "Nowa Gra".
Kiedyś miałem z tym problem ale wyl/wl przycisku pomaga.

przyciskGra.setEnabled(false);
repaint();
przyciskGra.setEnabled(true);

0

Dzięki za chęci, ale nie o to mi chodziło. Potrafię stworzyć ruch jakiegoś obiektu na jednym panelu, podobnie jak w twoim kodzie. Mi chodzi o to, żeby były 2 panele, czerwony na którym znajduje się przycisk gry i nic więcej oraz żółty na którym będzie znajdował się kwadrat, którym będzie można ruszać. Klikając w przycisk "start" czerwony panel zostaje usunięty i zastąpiony całkowicie żółtym. (żółty panel jest niewidoczny do czasu kliknięcia przycisku "start") Męczę się już z tym bardzo długo, a jest mi to potrzebne do stworzenia menu wyboru w grze, czy chce się grać takim czy takim kolorem. W żadnej książce nie znalazłem rozwiązania tego problemu. Za 3 dni znowu będę próbował podejść do tego.

0

Malo elegancki sposób ale łatwy i działający to np. poprzez referencje.

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