2015-06-19 2 views
0

Я делаю простую java-игру и пытаюсь реализовать пусковую установку в начале игры.Ошибка при создании пусковой установки игры

Например, JFrame с кнопкой в ​​нем, которая запускает мое приложение при его нажатии.

То, что я пытаюсь сделать, это основной вызов метода отдельный класс, который открывает JFrame, и ActionListener для JButton, который вызывает new Cliker(); при вызове.

Однако, когда new Cliker(); вызывается вне метода main, он открывает игру JFrame, но не JPanel.

Почему эта ошибка происходит, и как я могу ее исправить? Я относительно новичок в программировании, поэтому заранее извиняюсь за любые неясные моменты по этому вопросу или моей программе.

Я бы с благодарностью высказал вам свою помощь. Если вам нужны еще какие-то классы, чтобы помочь ответить на мой вопрос, просто спросите, или если у вас есть другие вопросы, не стесняйтесь, дайте мне знать.

package com.Cliker; 

import java.awt.Color; 
import java.awt.Dimension; 
import java.awt.Font; 
import java.awt.Graphics; 
import java.awt.event.MouseEvent; 
import java.awt.event.MouseListener; 

import javax.swing.ImageIcon; 
import javax.swing.JButton; 
import javax.swing.JFrame; 
import javax.swing.JOptionPane; 
import javax.swing.JPanel; 

import com.Cliker.Accessories.Music; 

public class Cliker extends JFrame { 

private static final long serialVersionUID = 1L; 

int score = 0; 

JButton ball = new JButton(new ImageIcon("res/textures/ball/ball.PNG")); 
JFrame gameFrame = new JFrame("Cliker v1.0"); 

public static void main(String[] args){ 
    new Cliker(); 
} 


public Cliker() { 

    gameFrame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); 
    gameFrame.add(new MyPanel()); 
    gameFrame.pack(); 
    gameFrame.setVisible(true); 
    gameFrame.setResizable(false); 
    gameFrame.setLocationRelativeTo(null); 

    ClikerGame play = new ClikerGame(); 
    play.run(this); 

} 

class MyPanel extends JPanel implements MouseListener { 

    private static final long serialVersionUID = 1L; 

    public MyPanel() { 

     setBackground(Color.CYAN); 

     ball.addMouseListener(new MouseListener() { 

      @Override 
      public void mousePressed(MouseEvent e) { 
       if (e.getSource() == ball) { 
        score++; 
        Music.music(4); 
        repaint(); 

       } 

      } 

      @Override 
      public void mouseClicked(MouseEvent e) { 

      } 

      @Override 
      public void mouseEntered(MouseEvent e) { 

      } 

      @Override 
      public void mouseExited(MouseEvent e) { 

      } 

      @Override 
      public void mouseReleased(MouseEvent e) { 

      } 
     }); 
     ball.setBorder(null); 

     add(ball); 
     addMouseListener(this); 

    } 

    public void paintComponent(Graphics g) { 
     super.paintComponent(g); 
     g.setFont(new Font("Fixedsys", Font.BOLD, 30)); 
     g.setColor(Color.BLACK); 
     g.drawString(String.valueOf(score), getWidth()/2, 40); 

    } 

    public Dimension getPreferredSize() { 
     return new Dimension(700, 500); 
    } 

    @Override 
    public void mousePressed(MouseEvent e) { 
     if (e.getSource() == this) { 

      this.setBackground(Color.RED); 

      gameFrame.setVisible(false); 

      ClikerEndGame sendData = new ClikerEndGame(); 

      try { 

       sendData.finish(score); 

      } catch (Exception e1) { 
       JOptionPane.showInputDialog(null,"The game has encountered an error. Error code: 001"); 
       e1.printStackTrace(); 
      } 




     } 

    } 

    @Override 
    public void mouseClicked(MouseEvent e) { 

    } 

    @Override 
    public void mouseEntered(MouseEvent e) { 

    } 

    @Override 
    public void mouseExited(MouseEvent e) { 

    } 

    @Override 
    public void mouseReleased(MouseEvent arg0) { 

    } 
} 

} 

Следующий класс

package com.Cliker; 

import javax.swing.JButton; 
import javax.swing.JOptionPane; 
import com.Cliker.Accessories.Music; 

public class ClikerGame implements Runnable { 

private int x, y, xa = 2, ya = 2; 


public void run(Cliker panel) { 


    JButton ball = panel.ball; 

    Music.music(2); 

    while (true) { 
     try { 
      x += xa; 
      y += ya; 
      if (x < 0 || x > 700 - 20) { 

       Music.music(1); 

       xa = -xa; 
      } 

      else if (y < 0 || y > 500 - 20){ 

       Music.music(1); 

       ya = -ya; 

      } 

      Thread.sleep(15); 

      ball.setBounds(x,y,30,30); 
     } catch (Exception e) { 
       JOptionPane.showMessageDialog(null,"Error 1"); 

     } 

    } 
} 
public void run() { 
    this.run(); 

} 

}

+0

* "Тем не менее, когда новый Cliker(), вызывается за пределами основного метода, открывает игру JFrame, но не JPanel "* - Потому что это то, что делает конструктор' Clicker', он создает новый 'JFrame' ... – MadProgrammer

ответ

2

В принципе, вы нарушая единые правила резьбы свинга, то ClikerGame бежит while-loop который блокирует событие диспетчерского тему, предотвращая от обработки новых событий, включая события рисования.

Причина, по которой она работает от main, составляет main, не вызывается изнутри EDT, в основном, это была случайность. Когда вы вызываете new Clicker() из ActionListener вашего JButton, однако вы работаете в контексте EDT, следовательно, ваша проблема.

Посмотрите на Initial Threads и Concurrency in Swing для получения более подробной информации.

Решение «немедленного» может выглядеть как с использованием Thread, но это также нарушит единые правила Swing, поскольку Swing не является потокобезопасным, и вы никогда не должны обновлять пользовательский интерфейс вне контекста EDT.

Лучшим решением может быть использование Swing Timer вместо этого. Это уведомление, через регулярные промежутки времени, жгутов контекст EDT

Может быть, что-то вроде ...

public class ClikerGame { 

    private int x, y, xa = 2, ya = 2; 
    private Clicker clicker; 

    private Timer timer; 

    public ClikerGame(Clicker clicker) { 
     this.clicker = clicker; 

     timer = new Timer(15, new ActionListener() { 
      @Override 
      public void actionPerformed(ActionEvent e) { 
       try { 
        x += xa; 
        y += ya; 
        if (x < 0 || x > 700 - 20) { 

         Music.music(1); 

         xa = -xa; 
        } else if (y < 0 || y > 500 - 20) { 

         Music.music(1); 

         ya = -ya; 

        } 

        Thread.sleep(15); 

        clicker.ball.setBounds(x, y, 30, 30); 
        clicker.ball.getParent().repaint(); 
       } catch (Exception e) { 
        JOptionPane.showMessageDialog(null, "Error 1"); 

       } 
      } 
     }); 
    } 

    public void start() { 
     if (!timer.isRunning()) { 
      Music.music(2); 
      timer.start(); 
     } 
    } 

    public void stop() { 
     timer.stop(); 
     // Stop the music 
    } 
} 
+0

Спасибо, я дам вам попробовать! – wdavies973

Смежные вопросы