2017-10-21 171 views
3

我对这个社区很陌生。在发布这个问题(以及研究解决方案)之前,我试图赶上所有规则的速度。如果因无知而冒犯或破坏任何规则,我表示歉意。请原谅我可怕的代码,我仍然在学习。谢谢你的理解!一个类在实例化另一个类之后如何调用方法?

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

我正在构建一个简单的游戏场面板和控制面板的足球比赛。游戏场显示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"); 
} 

}

+3

一件事是添加一些打印语句('的System.out.println()')到您的代码,会告诉你什么** ** 正在发生。 “没有任何反应”对我们没有多大帮助。做一些调试,并告诉我们在什么时候你期望发生的事情与你所看到的事情不同。 – markspace

+0

谢谢马克,我会回复我发现的内容。非常感谢! – deuscode

+0

你也可以在调试模式下运行你的程序,并把断点放在 –

回答

0

感谢@ 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); 
    } 
} 
相关问题