1

宿題のために、paintComponentユーザーが入力した変数を使用してボックスをペイントしようとしています。固定数を使用して、必要なことを構築することができました。私は一日中これに取り組んできましたが、変数を実装する方法を見つけることができませんでした。ここに私が取り組んでいるものの簡略化されたバージョンがあります:

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

public class Problem3 extends JFrame{

  public static void main(String[] args) {  
    int xCoord = Integer.parseInt(
            JOptionPane.showInputDialog("Enter an X cord."));

    JFrame gd = new JFrame();
    gd.setLocationRelativeTo(null);
    gd.setSize(300, 300);
    gd.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
    gd.setVisible(true);

    gd.add(new NewPanel());   
  }

  public int getX(){
    return xCoord;
  }
}

class NewPanel extends JPanel {

  int xCoord = getX();

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

    g.drawRect(10,10,xCoord,50);
  }
}

編集

ここに投稿してから、NewPanel クラス内でセッター メソッドを使用してみました

public void setX() {
    xCoord = Integer.parseInt(
            JOptionPane.showInputDialog("Enter an X cord."));
}

これを実行すると、これまでに見たことのない奇妙なエラーが発生します。StackOverFlow エラーが発生し、ダイアログ ボックスが数回または数百回ポップアップし、ポップアップが止まりません。

EDIT 3 Hovercraft Full Of Eels ソリューションを使用して、動作するようになりました! Full Of Eels の時間、助け、忍耐に感謝します。

public class Problem3 extends JFrame{
    public static void main(String[] args) {  

        JFrame gd = new JFrame();
        gd.setLocationRelativeTo(null);
        gd.setSize(300, 300);
        gd.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        gd.setVisible(true);

        NewPanel panel = new NewPanel();

        panel.setX(50); 
        gd.add(panel);
    } 
}
class NewPanel extends JPanel {

    int xCoord;

    public void setX(int x){
        xCoord = x;
    }

    public int getX(){
        return xCoord;
    }

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

        g.drawRect(10,10,xCoord,50);
    }

}
4

2 に答える 2

6

より基本的な Java クラスと同様に、ミューテーター メソッドとアクセサー メソッド (セッターおよびゲッターとも呼ばれる) を使用して、オブジェクトの状態を変更することがよくあります。あなたの状況では、NewPanel クラスにsetterメソッドを与える必要があります。また、必要に応じて yCoordpublic void setXCoor(int x) {...}にも同様のメソッドを与えて、外部クラス (NewPanel オブジェクトを保持する GUI) が NewPanel の値を変更できるようにする必要があります。xCoord が変更されたら、変更された xCoord 値の効果を表示する JVM がその paintComponent メソッドを呼び出すことができるように、同じ NewPanel オブジェクトで repaint() を呼び出す必要があります。

編集 1
また質問: Problem3 クラスが JFrame を拡張するのはなぜですか? ここでは不要のようです。

編集 2
また、メイン メソッドでこのコードを実行しません。

int xCoord = Integer.parseInt(
        JOptionPane.showInputDialog("Enter an X cord."));

JFrame gd = new JFrame();
gd.setLocationRelativeTo(null);
gd.setSize(300, 300);
gd.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
gd.setVisible(true);

gd.add(new NewPanel()); 

しかし、本格的なクラスのコンストラクターでは。

また、そのクラスに NewPanel クラス フィールドを指定し、そのフィールドが保持するオブジェクトを JFrame に配置して、NewPanel オブジェクトへの参照を取得できるようにして、クラス内の他の場所でそのメソッドを呼び出すことができるようにします。

編集 3
このコードについて:

public void setX() {
    xCoord = Integer.parseInt(
            JOptionPane.showInputDialog("Enter an X cord."));
}

描画クラスではユーザー入力を行いません。代わりに、セッター メソッドを真のセッター メソッドにします。これは、以前に何度もこの形式で作成したと確信しているものと同様です。

public void setX(int xCoord) {
   // set your field in here like you always do
}

次に、JOptionPane であれ、メイン GUI であれ、プログラムの他の場所であれ、ユーザーとの対話を行います。ユーザーが入力を行ったら、NewPanel 変数で上記のセッター メソッドを呼び出し、ユーザーの入力を (もちろん int として) 渡します。

編集 4

このコードについて:

public static void main(String[] args) {
    // ....
    gd.add(new NewPanel());   

    NewPanel.setX(50); 
}

NewPanel オブジェクトではなく NewPanel クラスで setX メソッドを呼び出しているため、コンパイラは適切に不平を言っています。これが、上記の編集の 1 つで、GUI クラスに NewPanel 変数を作成し、メイン メソッド (主に GUI クラスのコンストラクターを呼び出す必要がある) ではなく、GUI クラスのコンストラクターで GUI を作成することを提案した理由です。同じ NewPanel 変数を GUI の JFrame に配置し、setX(...) メソッドを呼び出します。

于 2011-07-02T03:34:52.433 に答える
1
import java.awt.Color;
import java.awt.Graphics;
import javax.swing.JFrame;
import javax.swing.JOptionPane;
import javax.swing.JPanel;


public class BerksSnakeMain extends JPanel{
    int xCoord;

    public void berk() {
        xCoord = Integer.parseInt(
            JOptionPane.showInputDialog("Enter an X cord."));
    }

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

    g.setColor(Color.red);
    g.fillOval(xCoord,10,10,10);
  }



    public static void main(String[] args) {

        BerksSnakeMain ad = new BerksSnakeMain();
        ad.berk();
        JFrame frame = new JFrame();
        frame.setSize(800, 600);
        frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        frame.setVisible(true);
        frame.add(ad);

    }

}
于 2012-10-27T19:52:37.430 に答える