web-dev-qa-db-ja.com

別のクラスから変数にアクセスする

とても簡単な質問ですが、私にはできません。 3つのクラスがあります。

DrawCircle class

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

class DrawCircle extends JPanel
{
    private int w, h, di, diBig, diSmall, maxRad, xSq, ySq, xPoint, yPoint;
    public DrawFrame d;

    public DrawCircle()
    {
        w = 400;
        h = 400;
        diBig = 300;
        diSmall = 10;
        maxRad = (diBig/2) - diSmall;
        xSq = 50;
        ySq = 50;
        xPoint = 200;
        yPoint = 200;
    }

    public void paintComponent(Graphics g)
    {
        super.paintComponent(g);
        g.setColor(Color.blue);
        g.drawOval(xSq, ySq, diBig, diBig);

        for(int y=ySq; y<ySq+diBig; y=y+diSmall*2)
        {
            for(int x=xSq; x<w-xSq; x=x+diSmall)
            {
                if(Math.sqrt(Math.pow(yPoint-y,2) + Math.pow(xPoint-x, 2))<= maxRad)
                    {
                        g.drawOval(x, y, diSmall, diSmall);
                    }               
            }
        }

        for(int y=ySq+10; y<ySq+diBig; y=y+diSmall*2)
        {
            for(int x=xSq+5; x<w-xSq; x=x+diSmall)
            {
                if(Math.sqrt(Math.pow(yPoint-y,2) + Math.pow(xPoint-x, 2))<= maxRad)
                {
                    g.drawOval(x, y, diSmall, diSmall);
                }   
            }
        }
    }
}

DrawFrame class

public class DrawFrame extends JFrame
{
    public DrawFrame()
    {
        int width = 400;
        int height = 400;

        setTitle("Frame");
        setSize(width, height);

        addWindowListener(new WindowAdapter()
        {
            public void windowClosing(WindowEvent e)
            {
                System.exit(0);
            }
        });

        Container contentPane = getContentPane();
        contentPane.add(new DrawCircle());
    }
}

CircMain class

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

public class CircMain 
{
    public static void main(String[] args)
    {
        JFrame frame = new DrawFrame();
        frame.show();
    }
}

1つのクラスはフレームを作成し、もう1つのクラスは円を描き、それを小さな円で塗りつぶします。 DrawFrameで幅と高さを設定します。 DrawCircleでは、DrawFrameの幅と高さにアクセスする必要があります。どうすればいいですか?

オブジェクトを作成しようとし、.getWidth.getHeightを使用してみましたが、動作させることができません。ここで特定のコードが必要なのは、多くのことを試しましたが、動作させることができないからです。 DrawFrameで幅と高さを間違って宣言していますか? DrawCircleでオブジェクトを間違った方法で作成していますか?

また、DrawCircleで使用する変数は、コンストラクターに含める必要がありますか?

28
johnrambo

変数をパブリックフィールドにすることができます:

  public int width;
  public int height;

  DrawFrame() {
    this.width = 400;
    this.height = 400;
  }

その後、次のように変数にアクセスできます。

DrawFrame frame = new DrawFrame();
int theWidth = frame.width;
int theHeight = frame.height;

ただし、より良い解決策は、変数プライベートフィールドに2つのアクセサメソッドをクラスに追加して、DrawFrameクラスのデータをカプセル化したままにすることです。

 private int width;
 private int height;

 DrawFrame() {
    this.width = 400;
    this.height = 400;
 }

  public int getWidth() {
     return this.width;
  }

  public int getHeight() {
     return this.height;
  }

その後、次のように幅/高さを取得できます。

  DrawFrame frame = new DrawFrame();
  int theWidth = frame.getWidth();
  int theHeight = frame.getHeight();

後者の方法を使用することを強くお勧めします。

44
Peter

同じ問題がありました。異なるクラスの変数を変更するために、変更するクラスを拡張しました。また、スーパークラスの変数を静的にし、それらを継承するものによって変更できるようにしました。また、柔軟性を高めるために保護しました。

ソース:悪い経験。良いレッスン。

5
LifesAway

オブジェクトを作成して、.getWidthと.getHeightを使用しようとしましたが、動作しません。

これは、JFrameで幅と高さのフィールドを設定するのではなく、ローカル変数で設定するためです。フィールドHEIGHTおよびWIDTHはImageObserverから継承されます

Fields inherited from interface Java.awt.image.ImageObserver
ABORT, ALLBITS, ERROR, FRAMEBITS, HEIGHT, PROPERTIES, SOMEBITS, WIDTH

http://Java.Sun.com/javase/6/docs/api/javax/swing/JFrame.html を参照してください

幅と高さがフレームの状態を表す場合、それらをフィールドにリファクタリングし、それらのゲッターを作成できます。

次に、両方の値をパラメーターとして受け取るコンストラクターを作成できます

public class DrawFrame extends JFrame {
 private int width;
 private int height;

 DrawFrame(int _width, int _height){

   this.width = _width;
   this.height = _height;

   //other stuff here
}
 public int getWidth(){}
 public int getHeight(){}

 //other methods
}

Widhtとheightが(作成後)一定になる場合は、final修飾子を使用する必要があります。この方法では、いったん値が割り当てられると、変更できません。

また、DrawCircleで使用する変数は、コンストラクターに含める必要がありますか?

現在の記述方法では、1種類の円のみを作成できます。別の円を作成したくない場合は、引数付きのコンストラクタでオーバーロードする必要があります)。

たとえば、属性xPointおよびyPointを変更する場合は、コンストラクターを作成できます

public DrawCircle(int _xpoint, int _ypoint){
  //build circle here.
 }

編集:

Where does _width and _height come from?

これらはコンストラクターの引数です。 Constructorメソッドを呼び出すときに、それらに値を設定します。

DrawFrameで幅と高さを設定します。 DrawCircleでは、DrawFrameの幅と高さにアクセスする必要があります。どうすればいいですか?

DrawFrame(){
   int width = 400;
   int height =400;

   /*
   * call DrawCircle constructor
   */
   content.pane(new DrawCircle(width,height));

   // other stuff

}

DrawCircleコンストラクターが実行されると、DrawFrameで使用した値をそれぞれ_widthと_heightとして受け取ります。

編集:

やってみて

 DrawFrame frame = new DrawFrame();//constructor contains code on previous edit.
 frame.setPreferredSize(new Dimension(400,400));

http://Java.Sun.com/docs/books/tutorial/uiswing/components/frame.html

1
Tom

Filename = url.Java

public class url {

    public static final String BASEURL = "http://192.168.1.122/";

}

変数を呼び出したい場合は、これを使用してください:

rl.BASEURL + "コードをここに";

0
Marwan Salim

私は問題を正しく理解していることを望みますが、DrawCircleからDrawFrameオブジェクトへの参照を持たないようです。

これを試して:

DrawCircleのコンストラクタシグネチャを変更して、DrawFrameオブジェクトを取得します。コンストラクター内で、クラス変数「d」を先ほど取得したDrawFrameオブジェクトに設定します。今度は、前の回答で述べたように、getWidth/getHeightメソッドをDrawFrameに追加します。それがあなたが探しているものを手に入れることができるかどうか見てください。

DrawCircleコンストラクターを次のように変更する必要があります。

public DrawCircle(DrawFrame frame)
{
    d = frame;
    w = 400;
    h = 400;
    diBig = 300;
    diSmall = 10;
    maxRad = (diBig/2) - diSmall;
    xSq = 50;
    ySq = 50;
    xPoint = 200;
    yPoint = 200;
}

DrawFrameのコードの最後の行は次のようになります。

contentPane.add(new DrawCircle(this));

次に、DrawCircle内でd.getheight()、d.getWidth()などを使用してみてください。もちろん、これらのメソッドにDrawFrameでアクセスして、それらにアクセスできることを前提としています。

0
Lloyd McFarlin

Java組み込みライブラリは、AIFC、AIFF、AU、SND、およびWAVE形式のみをサポートします。ここでは、Clipのみを使用してオーディオファイルを再生することについて説明し、クリップのさまざまなメソッドを確認します。

  1. メインクラスを作成するPlayAudio.Java
  2. ヘルパークラスを作成Audio.Java

PlayAudio.Java

import Java.io.IOException;
import Java.util.Scanner;
import javax.sound.sampled.LineUnavailableException;
import javax.sound.sampled.UnsupportedAudioFileException;
public class PlayAudio {
public static void main(String[] args) throws 
UnsupportedAudioFileException, IOException, 
LineUnavailableException {

    PlayMp3 playMp3;
    playMp3=new PlayMp3();


    Scanner sc = new Scanner(System.in);

    while (true) {
        System.out.println("Enter Choice :-");
        System.out.println("1. Play");
        System.out.println("2. pause");
        System.out.println("3. resume");
        System.out.println("4. restart");
        System.out.println("5. stop");

        System.out.println(PlayMp3.status);
        System.out.println(":::- ");
        int c = sc.nextInt();

        if (c ==5){

            playMp3.stop();
            break;
        }

        switch (c) {
            case 1:
                playMp3.play();
                break;
            case 2:
                playMp3.pause();
                break;
            case 3:
                playMp3.resume();
                break;
            case 4:
                playMp3.restart();
                break;
            case 5:
                playMp3.stop();
            default:
                System.out.println("Please Enter Valid Option :-");

        }
    }
    sc.close();
   }
}

Audio.Java

import javax.sound.sampled.*;
import Java.io.File;
import Java.io.IOException;

public class Audio {

private String filePath="mp.snd";
public static String status="paused";
private Long currentFrame=0L;
private Clip clip;

private AudioInputStream audioInputStream;

public Audio() throws UnsupportedAudioFileException, IOException, LineUnavailableException {

    audioInputStream = AudioSystem.getAudioInputStream(new File(filePath));

    clip = AudioSystem.getClip();

    clip.open(audioInputStream);

}


public void play(){
    clip.start();
    status = "playing";
}

public void pause(){

    if (status.equals("paused")) {
        System.out.println("audio is already paused");
        return;
    }
    currentFrame = clip.getMicrosecondPosition();
    clip.stop();
    status = "paused";
}
public void resume() throws UnsupportedAudioFileException, IOException, LineUnavailableException {
    if (status.equals("play"))
    {
        System.out.println("Audio is already being playing");
        return;
    }
    clip.close();

    //starts again and goes to currentFrame
    resetAudioStream();
    clip.setMicrosecondPosition(currentFrame);
    play();
    status="playing";

}

public void restart() throws UnsupportedAudioFileException, IOException, LineUnavailableException {
    clip.stop();
    clip.close();
    resetAudioStream();
    currentFrame = 0L;
    clip.setMicrosecondPosition(0);
    play();
    status="Playing from start";
}

public void stop(){

    currentFrame = 0L;
    clip.stop();
    clip.close();
    status="stopped";
}

private void resetAudioStream() throws IOException, UnsupportedAudioFileException, LineUnavailableException {

    audioInputStream = AudioSystem.getAudioInputStream(new File(filePath).getAbsoluteFile());
    clip.open(audioInputStream);

   }

}
0
Nikhil Chauhan

円内のフレームの幅と高さが必要な場合は、DrawFrameの幅と高さをDrawCircleコンストラクターに渡してください。

public DrawCircle(int w, int h){
    this.w = w;
    this.h = h;
    diBig = 300;
    diSmall = 10;
    maxRad = (diBig/2) - diSmall;
    xSq = 50;
    ySq = 50;
    xPoint = 200;
    yPoint = 200;
}

drawCircleにいくつかの新しいメソッドを追加することもできます。

public void setWidth(int w) 
   this.w = w;

public void setHeight(int h)
   this.h = h; 

あるいは:

public void setDimension(Dimension d) {
   w=d.width;
   h=d.height;
}

このルートを下る場合は、DrawFrameを更新して、これらのメソッドを呼び出すDrawCircleのローカル変数を作成する必要があります。

編集:

投稿の冒頭で説明したようにDrawCircleコンストラクターを変更する場合、DrawFrameのコンストラクターの呼び出しに幅と高さを追加することを忘れないでください。

public class DrawFrame extends JFrame {
 public DrawFrame() {
    int width = 400;
    int height = 400;

    setTitle("Frame");
    setSize(width, height);

    addWindowListener(new WindowAdapter()
    {
            public void windowClosing(WindowEvent e)
            {
                    System.exit(0);
            }
    });

    Container contentPane = getContentPane();
    //pass in the width and height to the DrawCircle contstructor
    contentPane.add(new DrawCircle(width, height));
 }
}
0
akf