toegang tot een variabele uit een andere klasse

Heel simpele vraag, maar ik kan het niet. Ik heb 3 lessen:

DrawCircleklasse

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);
                }   
            }
        }
    }
}

DrawFrameklasse

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());
    }
}

CircMainklasse

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();
    }
}

De ene klasse maakt een kader, de andere tekent een cirkel en vult deze met kleinere cirkels. In DrawFramestel ik de breedte en hoogte in. In DrawCircleheb ik toegang nodig tot de breedte en hoogte van DrawFrame. Hoe doe ik dit?

Ik heb geprobeerd een object te maken en probeerde .getWidthen .getHeightte gebruiken, maar ik krijg het niet werkend. Ik heb hier specifieke code nodig omdat ik veel dingen heb geprobeerd, maar het niet voor elkaar krijg. Verklaar ik breedte en hoogte verkeerd in DrawFrame? Maak ik het object op de verkeerde manier aan in DrawCircle?

Ook de variabelen die ik gebruik in DrawCircle, moet ik ze in de constructor hebben of niet?


Antwoord 1, autoriteit 100%

U kunt de variabelen openbare velden maken:

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

Je zou dan als volgt toegang kunnen krijgen tot de variabelen:

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

Een betere oplossing zou echter zijn om de variabelen privévelden twee accessor-methoden toe te voegen aan uw klasse, waarbij de gegevens in de DrawFrame-klasse ingekapseld blijven:

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;
  }

Dan kun je de breedte/hoogte als volgt krijgen:

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

Ik raad je ten zeerste aan de laatste methode te gebruiken.


Antwoord 2, autoriteit 10%

Ik had hetzelfde probleem. Om variabelen uit verschillende klassen te wijzigen, heb ik ze de klasse laten uitbreiden die ze moesten wijzigen. Ik heb de variabelen van de superklasse ook statisch gemaakt, zodat ze kunnen worden gewijzigd door alles wat ze erft. Ik heb ze ook beschermd voor meer flexibiliteit.

Bron:slechte ervaringen. Goede lessen.


Antwoord 3, autoriteit 2%

Ik heb geprobeerd een object te maken en heb geprobeerd
met behulp van .getWidth en .getHeight maar
kan het niet aan het werk krijgen.

Dat komt omdat je de velden width en height niet in JFrame instelt, maar ze op lokale variabelen instelt. Velden HEIGHT en WIDTH zijn overgenomen van ImageObserver

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

Zie
http://java.sun.com/javase/ 6/docs/api/javax/swing/JFrame.html

Als breedte en hoogte de staat van het frame vertegenwoordigen, dan zou je ze kunnen herfactoren in velden, en getters voor ze schrijven.

Dan zou je een Constructor kunnen maken die beide waarden als parameters ontvangt

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
}

Als de breedte en hoogte constant blijven (na het maken), dan moet je de finalemodifier gebruiken. Op deze manier kunnen ze, als ze eenmaal een waarde hebben gekregen, niet meer worden gewijzigd.

Ook de variabelen die ik gebruik in
DrawCircle, moet ik ze in de . hebben
constructeur of niet?

Zoals het nu is geschreven, kun je slechts één type cirkelmaken. Als je geen verschillende cirkels wilt maken, moet je de constructor overladen met één met argumenten).

Als u bijvoorbeeld de attributen xPoint en yPoint wilt wijzigen, kunt u een constructor gebruiken

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

BEWERKEN:

Where does _width and _height come from?

Dat zijn argumenten voor constructeurs. U stelt er waarden op in wanneer u de Constructor-methode aanroept.

In DrawFrame stel ik de breedte en hoogte in.
In DrawCircle heb ik toegang nodig tot de
breedte en hoogte van DrawFrame. Hoe doen
Doe ik dit?

DrawFrame(){
   int width = 400;
   int height =400;
   /*
   * call DrawCircle constructor
   */
   content.pane(new DrawCircle(width,height));
   // other stuff
}

Als de DrawCircle-constructor nu wordt uitgevoerd, ontvangt deze de waarden die u in DrawFrame hebt gebruikt als respectievelijk _width en _height.

BEWERKEN:

Probeer het te doen

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


Antwoord 4

Ik hoop dat ik het probleem goed begrijp, maar het lijkt erop dat je vanuit DrawCircle geen verwijzing hebt naar je DrawFrame-object.

Probeer dit:

Wijzig uw constructorhandtekening voor DrawCircle om een DrawFrame-object op te nemen. Stel binnen de constructor de klassevariabele “d” in op het DrawFrame-object dat u zojuist hebt opgenomen. Voeg nu de getWidth/getHeight-methoden toe aan DrawFrame, zoals vermeld in eerdere antwoorden. Kijk of je daarmee kunt krijgen wat je zoekt.

Uw DrawCircle-constructor moet worden gewijzigd in iets als:

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;
}

De laatste regel code in DrawFrame zou er ongeveer zo uit moeten zien:

contentPane.add(new DrawCircle(this));

Probeer dan d.getheight(), d.getWidth() enzovoort te gebruiken in DrawCircle. Dit veronderstelt natuurlijk dat je die methoden nog steeds beschikbaar hebt op DrawFrame om ze te openen.


Antwoord 5

Als je de breedte en hoogte van het frame in de cirkel nodig hebt, waarom zou je de DrawFrame-breedte en -hoogte dan niet doorgeven aan de DrawCircle-constructor:

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;
}

je zou ook een paar nieuwe methoden kunnen toevoegen aan DrawCircle:

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

of zelfs:

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

als je deze route volgt, moet je DrawFrame updaten om een lokale var van de DrawCircle te maken waarop je deze methoden kunt aanroepen.

bewerken:

Bij het wijzigen van de DrawCircle-constructor zoals beschreven bovenaan mijn bericht, vergeet dan niet om de breedte en hoogte toe te voegen aan de aanroep van de constructor in 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));
 }
}

Antwoord 6

Bestandsnaam=url.java

public class url {
    public static final String BASEURL = "http://192.168.1.122/";
}

als je de variabele wilt aanroepen, gebruik dan dit:

url.BASEURL+ “hier uw code”;


Antwoord 7

Ingebouwde Java-bibliotheken ondersteunen alleen AIFC-, AIFF-, AU-, SND- en WAVE-indelingen.
Hier heb ik alleen gesproken over het afspelen van een audiobestand met alleen Clip en bekijk de verschillende methoden van een clip.

  1. Maak een hoofdklasse PlayAudio.java.
  2. Maak hulpklasse 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);
   }
}

Other episodes