2015-04-12 4 views
-1

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

int goodRow; 

    int boardStatus[][] = { 
      {0, 0, 0, 0, 0, 0, 0}, 
      {0, 0, 0, 0, 0, 0, 0}, 
      {0, 0, 0, 0, 0, 0, 0}, 
      {0, 0, 0, 0, 0, 0, 0}, 
      {0, 0, 0, 0, 0, 0, 0}, 
      {0, 0, 0, 0, 0, 0, 0}, 
    }; 

    public void placePiece(int column) { 
     boolean goodInput = false; 
     while(!goodInput) { 
      for(int x = 5; x >= 0; x--) { 
       if(boardStatus[x][column] == 0) { 

        setRow(x); 

        boardStatus[x][column] = 1; 
        goodInput = true; 
        break; 

       }else if(boardStatus[0][x] == 1) { 
        goodInput = true; 
        break; 
       } 
      } 
     } 
    } 

    public int getRow() { 
     return goodRow; 
    } 

    public void setRow(int row) { 
     goodRow = row; 
    } 

Моя цель чтобы иметь возможность вызвать getRow() и извлечь значение x, принятое в методе. Внутри моего метода placePiece() я использую метод setRow() для получения значения x, но моя стратегия пока не сработала. Как я могу получить значение x из моего метода, чтобы я мог использовать его в другом месте в моей программе?

----- EDIT -----

Вот мой полный код:

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

import javax.swing.JFrame; 
import javax.swing.JPanel; 

public class GUI extends JPanel implements MouseListener { 

    moveMaker mover = new moveMaker(); 
    clickDetector click = new clickDetector(); 

    public void paintComponent(Graphics g) { 
     super.paintComponent(g); 

     g.setColor(Color.red); 

     for(int y = 0; y < 6; y++) { 
      for(int x = 0; x < 7; x++) { 
       g.fillOval(x*70 + 10, y*70 + 10, 50, 50); 
      } 
     }  
     g.setColor(Color.BLACK); 
     g.fillRect(0, 430, 500, 50); 
     g.setColor(Color.white); 
     g.drawString("CONNECT FOUR", 250, 450); 
     g.setColor(Color.LIGHT_GRAY); 
     click.paintPiece(g); 
    } 

    public void setUpGUI() { 
     JFrame mainFrame = new JFrame(); 
     clickDetector click = new clickDetector(); 

     mainFrame.addMouseListener(click); 
     mainFrame.addMouseListener(this); 
     mainFrame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); 
     mainFrame.setSize(500, 500); 
     mainFrame.getContentPane().add(this); 
     mainFrame.setVisible(true); 
    } 

    @Override 
    public void mouseClicked(MouseEvent e) { 
     repaint(); 
    } 

    @Override 
    public void mousePressed(MouseEvent e) { 
    } 
    @Override 
    public void mouseReleased(MouseEvent e) { 
    } 
    @Override 
    public void mouseEntered(MouseEvent e) { 
    } 
    @Override 
    public void mouseExited(MouseEvent e) {  
    } 

    public static void main(String args[]) { 
     GUI gui = new GUI(); 
     gui.setUpGUI(); 

    } 

} 

-

public class moveMaker { 

    int goodRow; 

    int boardStatus[][] = { 
      {0, 0, 0, 0, 0, 0, 0}, 
      {0, 0, 0, 0, 0, 0, 0}, 
      {0, 0, 0, 0, 0, 0, 0}, 
      {0, 0, 0, 0, 0, 0, 0}, 
      {0, 0, 0, 0, 0, 0, 0}, 
      {0, 0, 0, 0, 0, 0, 0}, 
    }; 

    public void placePiece(int column) { 
     boolean goodInput = false; 
     while(!goodInput) { 
      for(int x = 5; x >= 0; x--) { 
       if(boardStatus[x][column] == 0) { 

        setRow(x); 

        boardStatus[x][column] = 1; 
        goodInput = true; 
        break; 

       }else if(boardStatus[0][x] == 1) { 
        setRow(x); 
        goodInput = true; 
        break; 
       }else{ 
        System.out.println(x + " is taken."); 
       } 
      } 
     } 
    } 

    public int getRow() { 
     return goodRow; 
    } 

    public void setRow(int row) { 
     goodRow = row; 
    } 

} 

-

import java.awt.Graphics; 
import java.awt.event.MouseEvent; 
import java.awt.event.MouseListener; 


public class clickDetector implements MouseListener { 

    moveMaker mover = new moveMaker(); 

    int mouseX = 0; 

    @Override 
    public void mouseClicked(MouseEvent e) { 
     int xLocation = (e.getX() + 10)/70; 
     mover.placePiece(xLocation); 
     setMouseX(xLocation); 
     System.out.println("Place piece at " + mouseX + ", " + mover.getRow() + "."); 

    } 

    public void paintPiece(Graphics g) { 
     int x = (getMouseX()+10)/70; 
     int y = (mover.getRow()+10)/70; 
     g.fillOval(x, y, 50, 50); 
     System.out.println(x + ", " + y); 
    } 

    public int getMouseX() { 
     return mouseX; 
    } 

    public void setMouseX(int x) { 
     mouseX = x; 
    } 

    @Override 
    public void mousePressed(MouseEvent e) { 
    } 
    @Override 
    public void mouseReleased(MouseEvent e) { 
    } 
    @Override 
    public void mouseEntered(MouseEvent e) {  
    } 
    @Override 
    public void mouseExited(MouseEvent e) { 
    } 
} 
+0

Если вы не может заставить ваш getter возвращать ничего, кроме нуля, это может быть признаком того, что ваша переменная goodRow никогда не установлена ​​в значение (поскольку значение по умолчанию равно нулю).Вы действительно вызываете setRow перед вызовом getRow? – Jyr

+0

@jyr Да, я установил точки останова в setRow (x) и getRow (x) в моем другом классе, а setRow (x) был первым. – AlecR

+0

Можете ли вы показать код, который использует этот код? –

ответ

0

Удалите MouseListener из класса clickDetector, и создать новый метод;

public void setUpVariables(int x) { 
    int xLocation = (x + 10)/70; 
    mover.placePiece(xLocation); 
    setMouseX(xLocation); 
    System.out.println("Place piece at " + mouseX + ", " + mover.getRow() + "."); 
} 

Теперь в вашем классе GUI, в методе mouseClicked, вы можете добавить

click.setUpVariables(e.getX()); 

Для правильной картины, метод paintPiece должен быть отрегулирован чуток

public void paintPiece(Graphics g) { 
    int x = (getMouseX())*70 + 10; 
    int y = mover.getRow()*70 + 10; 
    g.fillOval(x, y, 50, 50); 
} 
+0

Это работает! Несколько ошибок, которые мне нужно исправить, но их картина правильно! Спасибо за вашу помощь. – AlecR

+0

Нет проблем. Это обходное решение, хотя я не совсем понимаю, почему мешанины вмешиваются, может быть, кто-то увидит этот вопрос и прольет какой-то свет :). – Jyr

0

Вы не вызвали setRow(x) в течение is block:

else if(boardStatus[0][x] == 1) { 
    goodInput = true; 
    break; 
} else { //missing 
    ... 
} 

Также вам не хватает else блока.

Отредактировано:

Try метод отладки setRow() и посмотреть значение парам.

+0

Я исправил это, но он все еще возвращается 0. – AlecR

0

Я разместил свой код внутри класса под названием Trial и добавил этот главный():

public static void main(String[] args){ 
    Trial t = new Trial(); 
    for (int k = 0; k < 5; k++){ 
     t.placePiece(k); 
     System.out.println(k + ", " + t.getRow()); 
    } 
} 

Выход был:

0, 5 
1, 5 
2, 5 
3, 5 
4, 5 

Это ожидаемый результат: метод placePiece(n) вызывает только setRow(n) если значение boardStatus[5][n] равно 0 (которое оно всегда есть) и завершает цикл; Когда вы вызываете getRow(), значение будет равно 5, строка, в которой была петля, когда вы вызывали сеттер !. Глядя на логике вашего времени цикла, она сводится к

while(true){ 
    setRow(5); 
    break; 
} 

или более просто

public void placePiece(int column){ 
    setRow(5); 
} 
+0

Итак, в моем коде, какой будет лучший подход к получению значений моих переменных для достижения методов? – AlecR

+0

Я предполагаю, что вы пытаетесь вызвать метод placePiece (column), чтобы поместить кусок в стек. Если стек пуст, он помещается внизу, если нет, он помещается поверх самой высокой части. Тогда вам нужно будет убедиться, что цикл while не закончил, пока не нашел пустой слот, поэтому не вызывайте break до тех пор, пока тестовая платаStatus [x] [column] == 0 не вернется !. Потеряйте предложение else. –

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