クラスは別のクラスをインスタンス化した後、どのようにメソッドを呼び出しますか?

ピーター・ケイ:

私はこのコミュニティに非常に新しいです。私はこの質問を投稿する前に(そして解決策を研究する前に)すべてのルールに精通しようとしました。無知によって気分を害したり、ルールに違反した場合は、お詫び申し上げます。私のひどいコードもすみません、まだ勉強中です。理解していただきありがとうございます!

編集:私は追加情報を追加し、私が抱えているこの問題に対してさまざまなアプローチを試みました。以下のコードの一部を作り直しました。

ゲームフィールドパネルとコントロールパネルを備えたシンプルなサッカーゲームを構築しています。ゲームフィールドには、すべてのプレーヤーとタックルがGUIに表示されます。コントロールパネルは、ゲームの難易度を設定し、タイマーを開始し、クォーターバックの種類を設定します。すべてのコードを正しくコンパイルするロードブロックに遭遇しましたが、GameFieldクラスのsetメソッドを呼び出してスコアを更新すると、変数は更新されますが、JTextAreaスコアキーパーを介して実際のスコアは更新されません。

GamePanelクラス内で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");
}

}

ピーター・ケイ:

@DBのおかげで、コードを意図したとおりに実行できました。2つの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);
    }
}

この記事はインターネットから収集されたものであり、転載の際にはソースを示してください。

侵害の場合は、連絡してください[email protected]

編集
0

コメントを追加

0

関連記事

分類Dev

クラスAはクラスBインスタンスをインスタンス化します。ClassBのインスタンスはどのようにしてクラスAのメソッドを呼び出すことができますか?

分類Dev

クラス/オブジェクトのインスタンス化が発生した後、JavaScriptはどのように新しく追加されたメソッドを呼び出しますか?

分類Dev

クラスをインスタンス化せずに別のパッケージからクラスのメソッドを呼び出します

分類Dev

クラスメソッドで別のクラスインスタンスを呼び出すにはどうすればよいですか?

分類Dev

そのクラスメソッドが別のインスタンスによって呼び出されたときに、特定のクラスメソッドと呼ばれる特定のクラスのどのインスタンスが最後に呼び出されるかを見つけることは可能ですか?

分類Dev

クラスのすべてのインスタンスからメソッドをどのように呼び出しますか?

分類Dev

初期化メソッドからクラスメソッドをどのように呼び出しますか?

分類Dev

スクレイプクロールはどのように機能しますか:どのクラスがインスタンス化され、どのメソッドが呼び出されましたか?

分類Dev

基本クラスのメソッドが呼び出されるように、派生クラスへのポインターまたは参照を渡します

分類Dev

Typescriptで、イベントハンドラーとして呼び出される同じクラスの別のメソッドからクラスメソッドを呼び出すにはどうすればよいですか?

分類Dev

クラスのメソッドをインスタンス化せずに呼び出すにはどうすればよいですか?

分類Dev

Roslyn、実行時にスクリプトでクラスをインスタンス化し、そのクラスのメソッドを呼び出すにはどうすればよいですか?

分類Dev

実行時に指定されたクラスをインスタンス化し、そのインスタンスでメソッドを呼び出すためのより良い方法はありますか?

分類Dev

PHP静的ファクトリメソッド:呼び出し元クラスのインスタンスを動的にインスタンス化します

分類Dev

jQueryでaspメソッドを呼び出した後にボタンクラスを変更するにはどうすればよいですか?

分類Dev

インスタンスまたはクラスメソッドのどちらか適切な方を呼び出します

分類Dev

Collectionクラスのsort()メソッドはどのようにComparableのcompareTo()を呼び出しますか?

分類Dev

Collectionクラスのsort()メソッドはどのようにComparableのcompareTo()を呼び出しますか?

分類Dev

ソリューションエクスプローラーで参照として宣言せずに、別のプロジェクトからDLLメソッドを呼び出すまたは呼び出すにはどうすればよいですか?

分類Dev

Javaは、メインクラスに別のクラスにボイドメソッドを呼び出しますか?

分類Dev

クラスの新しいインスタンスを作成した後にメソッドを呼び出す方法は?

分類Dev

Spring Beans:インスタンス化後に特定のクラスメソッドを呼び出す

分類Dev

基本クラスオブジェクトへの派生クラスポインタは、どのようにして派生クラスのメソッドを呼び出すことができますか?

分類Dev

SwiftクラスのObjectiveCからシングルトンクラスメソッドをどのように呼び出しますか?

分類Dev

インスタンスクラスにメソッド呼び出しを要求させるにはどうすればよいですか?

分類Dev

メソッドまたはコンストラクターの(クラスではなく)呼び出し元インスタンスを取得する

分類Dev

クラスからサービスメソッドをどのように呼び出しますか?

分類Dev

クラスインスタンスなしでC ++クラスメソッドを呼び出しますか?

分類Dev

親クラスの関数がclassmethodまたはインスタンスメソッドによって子クラスから呼び出されていることをどのように知ることができますか?

Related 関連記事

  1. 1

    クラスAはクラスBインスタンスをインスタンス化します。ClassBのインスタンスはどのようにしてクラスAのメソッドを呼び出すことができますか?

  2. 2

    クラス/オブジェクトのインスタンス化が発生した後、JavaScriptはどのように新しく追加されたメソッドを呼び出しますか?

  3. 3

    クラスをインスタンス化せずに別のパッケージからクラスのメソッドを呼び出します

  4. 4

    クラスメソッドで別のクラスインスタンスを呼び出すにはどうすればよいですか?

  5. 5

    そのクラスメソッドが別のインスタンスによって呼び出されたときに、特定のクラスメソッドと呼ばれる特定のクラスのどのインスタンスが最後に呼び出されるかを見つけることは可能ですか?

  6. 6

    クラスのすべてのインスタンスからメソッドをどのように呼び出しますか?

  7. 7

    初期化メソッドからクラスメソッドをどのように呼び出しますか?

  8. 8

    スクレイプクロールはどのように機能しますか:どのクラスがインスタンス化され、どのメソッドが呼び出されましたか?

  9. 9

    基本クラスのメソッドが呼び出されるように、派生クラスへのポインターまたは参照を渡します

  10. 10

    Typescriptで、イベントハンドラーとして呼び出される同じクラスの別のメソッドからクラスメソッドを呼び出すにはどうすればよいですか?

  11. 11

    クラスのメソッドをインスタンス化せずに呼び出すにはどうすればよいですか?

  12. 12

    Roslyn、実行時にスクリプトでクラスをインスタンス化し、そのクラスのメソッドを呼び出すにはどうすればよいですか?

  13. 13

    実行時に指定されたクラスをインスタンス化し、そのインスタンスでメソッドを呼び出すためのより良い方法はありますか?

  14. 14

    PHP静的ファクトリメソッド:呼び出し元クラスのインスタンスを動的にインスタンス化します

  15. 15

    jQueryでaspメソッドを呼び出した後にボタンクラスを変更するにはどうすればよいですか?

  16. 16

    インスタンスまたはクラスメソッドのどちらか適切な方を呼び出します

  17. 17

    Collectionクラスのsort()メソッドはどのようにComparableのcompareTo()を呼び出しますか?

  18. 18

    Collectionクラスのsort()メソッドはどのようにComparableのcompareTo()を呼び出しますか?

  19. 19

    ソリューションエクスプローラーで参照として宣言せずに、別のプロジェクトからDLLメソッドを呼び出すまたは呼び出すにはどうすればよいですか?

  20. 20

    Javaは、メインクラスに別のクラスにボイドメソッドを呼び出しますか?

  21. 21

    クラスの新しいインスタンスを作成した後にメソッドを呼び出す方法は?

  22. 22

    Spring Beans:インスタンス化後に特定のクラスメソッドを呼び出す

  23. 23

    基本クラスオブジェクトへの派生クラスポインタは、どのようにして派生クラスのメソッドを呼び出すことができますか?

  24. 24

    SwiftクラスのObjectiveCからシングルトンクラスメソッドをどのように呼び出しますか?

  25. 25

    インスタンスクラスにメソッド呼び出しを要求させるにはどうすればよいですか?

  26. 26

    メソッドまたはコンストラクターの(クラスではなく)呼び出し元インスタンスを取得する

  27. 27

    クラスからサービスメソッドをどのように呼び出しますか?

  28. 28

    クラスインスタンスなしでC ++クラスメソッドを呼び出しますか?

  29. 29

    親クラスの関数がclassmethodまたはインスタンスメソッドによって子クラスから呼び出されていることをどのように知ることができますか?

ホットタグ

アーカイブ