java - 一个类在实例化另一个类后如何调用方法?

标签 java methods getter-setter

我对这个社区很陌生。在发布此问题(以及研究解决方案)之前,我已尝试了解所有规则。如果我因无知而冒犯或违反任何规则,我深表歉意。还请原谅我糟糕的代码,我还在学习。谢谢理解!

编辑:我已经添加了额外的信息并尝试了不同的方法来解决我遇到的这个问题。我修改了下面的部分代码。

我正在构建一个带有游戏场面板和控制面板的简单足球游戏。比赛场显示所有球员和铲球在 GUI 上。控制面板设置游戏难度、启动计时器和四分卫类型。我遇到了一个障碍,我的所有代码都可以正确编译,但是当调用 GameField 类上的 set 方法来更新分数时,它会通过我的 JTextArea Score keeper 更新变量而不是实际分数。

我已经在 GameField 类中实例化了 ControlPanel。我还使用 System.out.println() 进行了测试,它表明它确实在更新变量。是否允许在类之间更新 JTextArea?

GameField.java

import java.awt.*;
import javax.swing.*;
import java.awt.event.*;

public class GameField extends JPanel implements KeyListener {

ControlPanel cp = new ControlPanel();

// Game pieces
private JButton playerIcon = new JButton("RB");
private JButton tackleIcon1 = new JButton("LB");
private JButton tackleIcon2 = new JButton("LB");
private JButton fieldGoal = new JButton("FG");

// Player and Tackle locations
private int playerPositionX = 100;
private int playerPositionY = 500;
private int tackle1PositionX = 1200;
private int tackle1PositionY = 400;
private int tackle2PositionX = 1200;
private int tackle2PositionY = 600;

// Player variable speeds
private int playerSpeed = 20;

public GameField() {
    setLayout(null);
    setBackground(Color.green);

    add(playerIcon);
    playerIcon.setBounds(new Rectangle(getPlayerPositionX(), getPlayerPositionY(), 80, 30));
    add(tackleIcon1);
    tackleIcon1.setBounds(new Rectangle(getTackle1PositionX(), getTackle1PositionY(), 100, 50));
    add(tackleIcon2);
    tackleIcon2.setBounds(new Rectangle(getTackle2PositionX(), getTackle2PositionY(), 100, 50));
    add(fieldGoal);
    fieldGoal.setBounds(new Rectangle(1600, 100, 100, 800));
    playerIsTackled();
    setFocusable(true);
    addKeyListener(this);

}

public void playerIsTackled() {
    Rectangle playerRect = playerIcon.getBounds();
    Rectangle tackle1Rect = tackleIcon1.getBounds();
    Rectangle tackle2Rect = tackleIcon2.getBounds();
    if (playerRect.intersects(tackle1Rect) || playerRect.intersects(tackle2Rect)) {
        setPlayerPositionX(100);
        setPlayerPositionY(500);
        setTackle1PositionX(1200);
        setTackle1PositionY(400);
        setTackle2PositionX(1200);
        setTackle2PositionY(600);
        playerIcon.setBounds(getPlayerPositionX(), getPlayerPositionY(), 80, 30);
        tackleIcon1.setBounds(getTackle1PositionX(), getTackle1PositionY(), 100, 50);
        tackleIcon2.setBounds(getTackle2PositionX(), getTackle2PositionY(), 100, 50);

        cp.setCurrentTackles(cp.getCurrentTackles() + 1);
        System.out.println(cp.getCurrentTackles());
    }
}

public void playerScored() {
    Rectangle playerRect = playerIcon.getBounds();
    Rectangle fieldGoalRect = fieldGoal.getBounds();
    if (playerRect.intersects(fieldGoalRect)) {
        setPlayerPositionX(100);
        setPlayerPositionY(500);
        setTackle1PositionX(1200);
        setTackle1PositionY(400);
        setTackle2PositionX(1200);
        setTackle2PositionY(600);
        playerIcon.setBounds(getPlayerPositionX(), getPlayerPositionY(), 80, 30);
        tackleIcon1.setBounds(getTackle1PositionX(), getTackle1PositionY(), 100, 50);
        tackleIcon2.setBounds(getTackle2PositionX(), getTackle2PositionY(), 100, 50);

        cp.setCurrentScore(cp.getCurrentScore() + 1);
        System.out.println(cp.getCurrentScore());
    }
} 

public void moveToPlayer() {      
    if (getTackle1PositionX() > getPlayerPositionX()) {
        setTackle1PositionX(getTackle1PositionX() - 1);
    } else {
        setTackle1PositionX(getTackle1PositionX() + 1);
    }

    if (getTackle1PositionY() > getPlayerPositionY()) {
        setTackle1PositionY(getTackle1PositionY() - 1);
    } else {
        setTackle1PositionY(getTackle1PositionY() + 1);
    }
    getTackleIcon1().setBounds(getTackle1PositionX(), getTackle1PositionY(), 100, 50);
}

public void paintComponent(Graphics g) {
    super.paintComponent(g);
    requestFocusInWindow();
    playerIsTackled();
    playerScored();
}

@Override
public void keyTyped(KeyEvent e) {
}

@Override
public void keyPressed(KeyEvent e) {
    int k = e.getKeyCode();
    if (k == e.VK_LEFT && getPlayerPositionX() > 0) {
        setPlayerPositionX(getPlayerPositionX() - getPlayerSpeed());
    }
    if (k == e.VK_RIGHT && getPlayerPositionX() < 1703) {
        setPlayerPositionX(getPlayerPositionX() + getPlayerSpeed());
    }
    if (k == e.VK_UP && getPlayerPositionY() > 0) {
        setPlayerPositionY(getPlayerPositionY() - getPlayerSpeed());
    }
    if (k == e.VK_DOWN && getPlayerPositionY() < 1089) {
        setPlayerPositionY(getPlayerPositionY() + getPlayerSpeed());
    }
    getPlayerIcon().setBounds(getPlayerPositionX(), getPlayerPositionY(), 80, 30);
}

下面是ControlPanel.java。在 actionPerformed 方法中,您可以看到我添加了一个 getScore().setText() 方法来更新分数。如果我用任何整数替换 getCurrentScore() 方法,它会在那里正确更新分数。

import java.awt.*;
import javax.swing.*;
import java.awt.event.*;
import java.util.Hashtable;
import javax.swing.event.ChangeEvent;
import javax.swing.event.ChangeListener;

public class ControlPanel extends JPanel implements ActionListener, ChangeListener {

private JButton start;
private JButton stop;
private JSlider speed;
private JComboBox playerList;
private Timer tim;
private int delay = 1000;
private int i = 0;
private int currentScore = 0;
private int currentTackles = 0;
private JTextArea timer = new JTextArea("Timer: " + 0, 1, 6);
private JTextArea score = new JTextArea("Field Goals: " + currentScore + "       Tackles: " + currentTackles, 1, 16);
private String[] playerStyle = {"Slow Runner", "Running Back", "All Star"};

public ControlPanel() {

    super();
    setBackground(Color.darkGray);

    // Game controls
    start = new JButton("Start");
    stop = new JButton("Stop");
    speed = new JSlider(JSlider.HORIZONTAL, 0, 2, 1);
    playerList = new JComboBox(getPlayerStyle());

    // Slider label
    Hashtable labelTable = new Hashtable();
    labelTable.put(new Integer(0), new JLabel("Slow"));
    labelTable.put(new Integer(1), new JLabel("Normal"));
    labelTable.put(new Integer(2), new JLabel("Fast"));
    speed.setLabelTable(labelTable);
    speed.setPaintLabels(true);

    // Combo box dropdown
    playerList.setSelectedIndex(1);

    // Timer
    tim = new Timer(getDelay(), this);

    // Add methods
    add(start);
    add(stop);
    add(timer);
    add(speed);
    add(score);
    add(playerList);

    // Event listeners
    start.addActionListener(this);
    stop.addActionListener(this);
    speed.addChangeListener(this);
    playerList.addActionListener(new ActionListener() {
        public void actionPerformed(ActionEvent e) {
            JComboBox cb = (JComboBox) e.getSource();
            String playerChoice = (String) cb.getSelectedItem();
            playerList.setSelectedItem(playerChoice);
        }
    });

    // Set focus to false on all game controls
    start.setFocusable(false);
    stop.setFocusable(false);
    speed.setFocusable(false);
    playerList.setFocusable(false);
}

@Override
public void actionPerformed(ActionEvent event) {
    Object obj = event.getSource();

    if (obj == getTim()) {
        setI(getI() + 1);
        getTimer().setText("Timer: " + getI());
        getScore().setText("Field Goals: " + getCurrentScore() + "       Tackles: " + getCurrentTackles());
    }
    if (obj == getStop()) {
        getTim().stop();
    }
    if (obj == getStart()) {
        getTim().start();
    }
}

@Override
public void stateChanged(ChangeEvent e) {
    JSlider source = (JSlider) e.getSource();

    int currentSpeed = (int) source.getValue();
    if (currentSpeed == 0) {
        int delaySpeed = getTim().getDelay();
        delaySpeed = (int) 2000;
        getTim().setDelay(delaySpeed);
    }
    if (currentSpeed == 1) {
        int delaySpeed = getTim().getDelay();
        delaySpeed = (int) 1000;
        getTim().setDelay(delaySpeed);
    }
    if (currentSpeed == 2) {
        int delaySpeed = getTim().getDelay();
        delaySpeed = (int) 500;
        getTim().setDelay(delaySpeed);
    }

}

MyJPanel.java

import java.awt.*;
import java.awt.event.*;
import javax.swing.*;

public class MyJPanel extends JPanel {

public MyJPanel() {
    super();
    setBackground(Color.gray);
    setLayout(new BorderLayout());
    ControlPanel gm = new ControlPanel();
    GameField gf = new GameField();
    add(gm, "North");
    add(gf, "Center");
}

最佳答案

感谢@D.B.我已经让我的代码按预期运行。因为我只打算有两个 JPanel(控制面板和游戏面板),所以我添加了面板以作为参数传递给彼此。在此之后,代码开始按预期工作。感谢您将我推向正确的一步!这是一个如此简单的错误。特别感谢@DaveyDaveDave 激励我更加努力!

我对主要 JPanel 对象所做的更改:

public class MyJPanel extends JPanel {

    ControlPanel gm = new ControlPanel();
    GameField gf = new GameField();

    public MyJPanel() {
        super();
        setBackground(Color.gray);
        setLayout(new BorderLayout());
        add(gm, "North");
        add(gf, "Center");

        gf.setCp(gm);
        gm.setGf(gf);
    }
}

关于java - 一个类在实例化另一个类后如何调用方法?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/46865499/

相关文章:

javascript - 函数中的 Getters 和 Setters (javascript)

java - java中的静态和非静态方法之间共享的资源

java - XAMPP: tomcat不从控制面板启动,只从bat启动

java - 如何在 Java 8 中将 Map 转换为 List

java - 使用 java api 获取 Twitter 中我所有关注者的计数(推文)

c# - 在方法定义中不能使用多个 params 参数的原因是什么?

带参数的 Java Reflection 私有(private)方法最好的方法?

javascript - 如何在 Javascript 对象(类)中使用 setter 和 getter?

c - OpenGL 2D 移动关系

angular - getter 和 setter 中 Observable 的 Typescript 返回类型