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

时间:2017-10-21 16:35:56

标签: java methods getter-setter

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

编辑:我已经添加了其他信息,并尝试了不同的方法来处理我遇到的这个问题。我已经重写了下面的部分代码。

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

我在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");
}

}

1 个答案:

答案 0 :(得分:0)

感谢@ D.B.我已经让我的代码按预期运行了。因为我只打算有两个JPanels(控制面板和游戏面板),所以我添加了面板作为参数传递给对方。在此之后,代码开始按预期工作。感谢您推动我迈出正确的一步!这是一个如此简单的错误。特别感谢@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);
    }
}