Java Canvas

haikari
  • Rejestracja: dni
  • Ostatnio: dni
  • Lokalizacja: Poland
  • Postów: 20
0

Cześć,
mam problem z moim Frame'm. Utworzyłem 2 okienka, z pierwszego przechodzę do 2 gdzie po przejsciu to drugie nie reaguje na klawiature ani na zamykanie (mozna jedynie zamknac proces z IDE :

1 okno ( oczywiście to niecały kod ):

Kopiuj
public class Credits extends JFrame {

    public Credits() {
        super("Credits");
        setSize(300, 200);
        setLayout(new BorderLayout());
        
        JButton ok = new JButton("GAME");
        
        
        setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        setLocationRelativeTo(null);
        setResizable(false);
       
        setVisible(true);
        
        
        ok.addActionListener(new ActionListener() {
            public void actionPerformed(ActionEvent e) {
                
                dispose();
                new WojnaSwiatow().game();
               
            }
        });
        
        
        
    }

2 okno:

Kopiuj
public class WojnaSwiatow extends Canvas implements Stage, KeyListener {

    /**
     * @param args the command line arguments
     */
    public long usedTime;
    public BufferStrategy strategia;
    private SpriteCache spriteCache;
    private ArrayList actors;
    private Player player;
    
    
    public WojnaSwiatow(){
        
        spriteCache = new SpriteCache();
        JFrame okno = new JFrame("..:Wojna Swiatow :..");
        JPanel panel = (JPanel)okno.getContentPane();
        setBounds(0,0,Stage.SZEROKOSC,Stage.WYSOKOSC);
        
        panel.setPreferredSize(new Dimension(Stage.SZEROKOSC,Stage.WYSOKOSC));
        panel.setLayout(null);
        panel.requestFocus();
        panel.addKeyListener(this);
        panel.add(this);   //   jezeli tutaj wykomentuje okno reaguje normalnie ? moze ktos pomoze ? coś może przysłaniać ? jeżeli uruchomię bezpośrednio WojneSwiatow to
        // okno normalnie sie uruchamia bez zadnego problemu
        
        okno.setBounds(0,0,Stage.SZEROKOSC,Stage.WYSOKOSC);
        okno.setVisible(true);
        okno.setResizable(false);
        okno.setLocationRelativeTo(null);
        
        
        okno.addWindowListener(new WindowAdapter() {
            @Override
            public void windowClosing(WindowEvent e){
                System.exit(0);
            }
        });
        
        createBufferStrategy(2);
        strategia = getBufferStrategy();
        
        requestFocus();
        addKeyListener(this);
        okno.pack();
        okno.setVisible(true);
    }
bogdans
  • Rejestracja: dni
  • Ostatnio: dni
0
  1. Nie wiadomo jak to działa - brakuje kodu metody game().
  2. Klasa WojnaSwiatow wygląda dziwnie, tworzysz okno, na którym niczego nie umieszczasz.
haikari
  • Rejestracja: dni
  • Ostatnio: dni
  • Lokalizacja: Poland
  • Postów: 20
0

Cały projekt z Netbeans http://speedy.sh/44jTf/WojnaSwiatow.rar jezeli komus będzie się chciało... tak Klasa WojnaSwiatow wyglada dziwnie faktycznie usunąłem cześć kodu, uważałem że problem leży w samym konstruktorze ale jednak sprawdziłem i siedzi to gdzieś głębiej.. rysowanie przez Convas odbywa się na JPanel i jak go dodam do okienka to nie reaguje wtedy na nic :/

bogdans
  • Rejestracja: dni
  • Ostatnio: dni
0

Przyczyną problemu jest nieskończona pętla w funkcji game(). Ponieważ nie jest wykonywana w nowym wątku, to blokuje całkowicie wątek interakcji. Jedno z możliwych rozwiązań:

Kopiuj
    public void game(){
        usedTime = 1000;
        initWorld();
        ActionListener task = new ActionListener()
        {
            public void actionPerformed(ActionEvent ae)
            {
                long startTime = System.currentTimeMillis();
                updateWorld();
                checkCollisions();
                paintWorld();
                usedTime = System.currentTimeMillis()-startTime;            
            }
        };
        Timer timer = new Timer(SZYBKOSC,task);
        timer.start();
    }

Zarejestruj się i dołącz do największej społeczności programistów w Polsce.

Otrzymaj wsparcie, dziel się wiedzą i rozwijaj swoje umiejętności z najlepszymi.