2013-12-07 5 views
0

Я сделал программу с несколькими классами, но, похоже, что-то странное происходит между двумя из них. Я не могу получить переменную от одной к другой. Однако я не могу получить переменную Public static int Screen.myWidth и использовать ее на KeyHandler(). Я просто получаю ошибки, когда я пытаюсь что ..Невозможно получить переменную из другого класса

import java.awt.event.*; 
import java.awt.*; 

public class KeyHandler implements MouseMotionListener, MouseListener, KeyListener{ 
    public static boolean backpack = false; 
    public static boolean movebackpack = false; 
    public static int spawntox; 
    public static int spawntoy; 
    public static int SpotWidth = (Screen.myWidth)/World.ScreenWidth; 
    public static int SpotHeight = (Screen.myHeight)/World.ScreenHeight; 

public void mouseClicked(MouseEvent e) { 
    if (!backpack){ 
     Player.targetx = (int) (e.getX()-Frame.x)/SpotWidth; 
     Player.targety = (int) (e.getY()-Frame.y)/SpotHeight; 
     Player.target = false; 
     Player.MovePlayer(); 
    } 
} 

, а затем Screen.java

import java.awt.*; 

import javax.swing.*; 

import java.awt.image.*; 
import java.io.*; 

public class Screen extends JPanel implements Runnable{ 
public Thread thread = new Thread(this); 

public static int myWidth, myHeight; 

public static boolean isFirst = true; 

public static Point mc = new Point (0, 0); 

public static World world; 
public static Ground ground; 
public static Backpack backpack; 

public Screen(Frame frame) { 
    frame.addMouseListener(new KeyHandler()); 
    frame.addMouseMotionListener(new KeyHandler()); 
    frame.addKeyListener(new KeyHandler()); 

    thread.start(); 
} 

public void define() { 
    world = new World(); 
    ground = new Ground(); 
    backpack = new Backpack(); 
    } 

public void paintComponent(Graphics g) { 
    myWidth = getWidth(); 
    myHeight = getHeight(); 
    define(); 
    g.setColor(new Color(0, 0, 0)); 
    g.fillRect(0, 0, getWidth(), getHeight()); 
    g.setColor(new Color(255, 25, 100)); 
    g.drawString(String.valueOf(Player.x), 600, 500); 

    ground.draw(g); 
    world.draw(g); 
    if(KeyHandler.backpack == true){ 
    backpack.draw(g); 
    } 
} 

public void run() { 
    while(true) { 
     repaint(); 
     try{ 
     Thread.sleep(1); 

     } catch(Exception e) { } 
    } 
} 

}

Edit 1 Забыла сказать, что я получаю все ошибки, когда я щелкните где-нибудь, чтобы я мог запустить его и все, но он просто не может вычислить эту вещь, потому что не может получить Screen.myWidth

Edit 2 Ошибка:

Exception in thread "AWT-EventQueue-0" java.lang.ArithmeticException:/by zero 
    at KeyHandler.mouseClicked(KeyHandler.java:14) 
    at java.awt.Component.processMouseEvent(Component.java:6508) 
    at java.awt.Component.processEvent(Component.java:6270) 
    at java.awt.Container.processEvent(Container.java:2229) 
    at java.awt.Window.processEvent(Window.java:2022) 
    at java.awt.Component.dispatchEventImpl(Component.java:4861) 
    at java.awt.Container.dispatchEventImpl(Container.java:2287) 
    at java.awt.Window.dispatchEventImpl(Window.java:2719) 
    at java.awt.Component.dispatchEvent(Component.java:4687) 
    at java.awt.EventQueue.dispatchEventImpl(EventQueue.java:729) 
    at java.awt.EventQueue.access$200(EventQueue.java:103) 
    at java.awt.EventQueue$3.run(EventQueue.java:688) 
    at java.awt.EventQueue$3.run(EventQueue.java:686) 
    at java.security.AccessController.doPrivileged(Native Method) 
    at java.security.ProtectionDomain$1.doIntersectionPrivilege(ProtectionDomain.java:76) 
    at java.security.ProtectionDomain$1.doIntersectionPrivilege(ProtectionDomain.java:87) 
    at java.awt.EventQueue$4.run(EventQueue.java:702) 
    at java.awt.EventQueue$4.run(EventQueue.java:700) 
    at java.security.AccessController.doPrivileged(Native Method) 
    at java.security.ProtectionDomain$1.doIntersectionPrivilege(ProtectionDomain.java:76) 
    at java.awt.EventQueue.dispatchEvent(EventQueue.java:699) 
    at java.awt.EventDispatchThread.pumpOneEventForFilters(EventDispatchThread.java:242) 
    at java.awt.EventDispatchThread.pumpEventsForFilter(EventDispatchThread.java:161) 
    at java.awt.EventDispatchThread.pumpEventsForHierarchy(EventDispatchThread.java:150) 
    at java.awt.EventDispatchThread.pumpEvents(EventDispatchThread.java:146) 
    at java.awt.EventDispatchThread.pumpEvents(EventDispatchThread.java:138) 
    at java.awt.EventDispatchThread.run(EventDispatchThread.java:91) 
+0

Пожалуйста, сообщите об ошибке, которую вы получите. – iWumbo

+0

Я думаю, компилятор жалуется на переменные, которые не инициализируются. Даже если он не жаловался, ваш код не будет делать то, что вы хотите: вы не инициализируете myWidth и myHeight до первого вызова paintComponent. До этого статические переменные в KeyHandler вычисляются, поэтому SpotWidth и SpotHeight просто не могут быть правильными. –

+0

@GuntramBlohm Перемещение этого параметра в define() {или в run() {doesen't, похоже, помогает .. :(Но хорошая идея .. – minisurma

ответ

1

Попробуйте изменить соответствующие части KeyHandler в:

public static int SpotWidth() { return Screen.myWidth/World.ScreenWidth; } 
public static int SpotHeight() { return Screen.myHeight/World.ScreenHeight; } 

public void mouseClicked(MouseEvent e) { 
if (!backpack){ 
    Player.targetx = (int) (e.getX()-Frame.x)/SpotWidth(); 
    Player.targety = (int) (e.getY()-Frame.y)/SpotHeight(); 

Таким образом, переменные Spot * (функции) используют размер экрана в тот момент, когда вы нажимаете на мышь, которая, предположительно, после первого вызова paintComponent().

+0

Спасибо, это работает. :) По крайней мере до сих пор: D – minisurma

+0

Знаете ли вы, что эта ошибка: «Исключение в потоке» AWT-EventQueue-0 «java.lang.ArrayIndexOutOfBoundsException' означает? Я получил это после редактирования кода, как вы сказали выше? ** Редактировать ** Похоже, что я получил только эту ошибку, когда я запускаю игру при просмотре Class 'Player.java' – minisurma

0

Проблема ваша ширина и высота неинициализированным, вы можете попробовать статический блок инициализации, как этот

public static int myWidth, myHeight; 
static { //init those variables. 
    // Get the screen size 
    Dimension screenSize = Toolkit.getDefaultToolkit().getScreenSize(); 
    myWidth = screenSize.width; // width 
    myHeight = screenSize.height; //height 
} 
Смежные вопросы