Muskampen 2025: Segraren korad!
Permalänk
Medlem

Problem med ett objekt [JAVA]

Jag har en inlämningsuppgift för programmeringen i skolan. Man ska rita ett fönster och beskriva en bolls rörelse enligt en kastparabel. Vi ska använda tre klasser: rityta, boll och spel. Ritytan ritar ut panelen där bollen ska beskrivas. Men objektet "boll" är i klassen spel.
I ritytan skapar jag ett objekt av klassen spel, som en instansvariabel. Ritytan ska på det sättet komma åt bollen. Vi har fått hjälp med att få in objektet boll i ritytan:

public class rityta extends JPanel { double posX, posY; spel spel; public rityta(spel spel) { spel = spel; } }

...som får anrop från spel

rityta pnlRityta = new rityta(this);

Men när försöker använda en metod för boll i ritytan (t.ex. hämta x-kordinaten) får jag felmeddelandet:
non-static method pos(java.lang.String) cannot be referenced
from a static context

Vad är fel?

Bökigt att förstå?
http://www.qipsystems.com/ksk/java/inluppar/inlupp3.html

Permalänk
Medlem

Kan man få hela källkoden så blir det lättare att se var felet är.
Ovan har du ju inte ens metodanropet till pos().

Visa signatur

Sverige är ett så litet land att det bara får plats en åsikt i taget där.

Permalänk
Medlem

Har testat olika metod, men det har gett samma felmeddelande. Klistrar in källkoden:
spel.java

import javax.swing.*; import java.awt.*; import java.awt.event.*; public class spel extends JFrame implements ActionListener, AdjustmentListener { //Deklarerar variabler int intSpeed = 0, intAngle = 0; double dblTime = 0; //Skapar en boll public boll boll = new boll(); //Hämtar ritytan rityta pnlRityta = new rityta(this); //Skapar skjutknappen JButton btnShoot = new JButton("Shoot"); //Skapar panel för skjutreglagen JPanel pnlSettings = new JPanel(); //Skapar label för resp skjutreglagen, ett namn och ett värde. JLabel lblAngleValue = new JLabel("0"); JLabel lblSpeedValue = new JLabel("0"); JLabel lblAngleName = new JLabel("Angle"); JLabel lblSpeedName = new JLabel("Speed"); //Skapar två skjutreglage Scrollbar scrAngle = new Scrollbar(Scrollbar.HORIZONTAL, 0, 1, 0, 90); Scrollbar scrSpeed = new Scrollbar(Scrollbar.HORIZONTAL, 0, 1, 0, 500); public spel () { //Ger pnlSettings en layout pnlSettings.setLayout(new GridLayout(2,3)); //Sätter in namn, skjutreglage och värde i panelen pnlSettings pnlSettings.add(lblAngleName); pnlSettings.add(scrAngle); pnlSettings.add(lblAngleValue); pnlSettings.add(lblSpeedName); pnlSettings.add(scrSpeed); pnlSettings.add(lblSpeedValue); Container conA = getContentPane(); conA.setLayout(new BorderLayout()); conA.add(pnlSettings, BorderLayout.SOUTH); conA.add(pnlRityta, BorderLayout.WEST); conA.add(btnShoot, BorderLayout.NORTH); //Kopplar lyssnare btnShoot.addActionListener(this); scrAngle.addAdjustmentListener(this); scrSpeed.addAdjustmentListener(this); setDefaultCloseOperation(EXIT_ON_CLOSE); pack(); setVisible(true); } public void actionPerformed (ActionEvent event) { if (event.getSource() == btnShoot) { move(); } } //Lyssnarmetod till skjutreglagen public void adjustmentValueChanged (AdjustmentEvent event) { if (event.getSource() == scrSpeed) { //Ändra värdet på lblSpeedValue om klienten har skjutit reglaget för hastigheten lblSpeedValue.setText(String.valueOf(scrSpeed.getValue())); intSpeed = scrSpeed.getValue(); } else if(event.getSource() == scrAngle) { //Ändra värdet på lblSpeedAngle om klienten har skjutit reglaget för vinkeln lblAngleValue.setText(String.valueOf(scrAngle.getValue())); //Ger även intAngle det värdet, annars är det inte till någon nytta intAngle = scrAngle.getValue(); } } //Metod som uppdaterar bollens position public void move() { int dblX = 0, dblY = 0; System.out.println("Ritar bollen"); for (dblTime = 0; dblTime < 2; dblTime += 0.1) { dblX = (int)(intSpeed * dblTime * Math.cos(Math.PI * intAngle / 180)); dblY = (int)(-0.5 * 9.82 * dblTime * dblTime + intAngle * dblTime * Math.sin(Math.PI * intAngle / 180)); boll.setX(dblX); boll.setY(dblY); System.out.println("Ritar om ytan"); try { Thread.sleep(50); } catch (InterruptedException e) { } pnlRityta.repaint(); } } public static void main (String[] args) { spel s = new spel(); } }

rityta.java

import javax.swing.*; import java.awt.*; public class rityta extends JPanel { double posX, posY; spel spel; public rityta(spel spel) { spel = spel; //Sätter ytans storlek och färg setPreferredSize(new Dimension(320, 240)); setBackground(new Color(0, 0, 255)); } public void paintComponent(Graphics g) { super.paintComponent(g); g.setColor(Color.red); g.fillOval((int)boll.pos("posX"), 240 - (int)boll.pos("posY"), 20, 20); } }

boll.java

import java.awt.*; public class boll { int intPosX, intPosY, intRadie; Color clrRed = new Color(255,0,0); public boll() { /* Panelen är 320x240 pixlar stor och radien är 20. Därefter bestäms bollens startposition. */ intRadie = 20; intPosX = 320 - intRadie; intPosY = 0; } public void setX(int intA) { intPosX = intA; System.out.println("\tNy Y-position: " + intPosY); } public void setY(int intA) { intPosY = intA; System.out.println("\tNy Y-position: " + intPosY); } public int pos(String strA) { if (strA == "posX") { return intPosX; } else if (strA == "posY") { return intPosY; } else { return 0; } } }

Permalänk
Medlem
Citat:

Ursprungligen inskrivet av gish
Har testat olika metod, men det har gett samma felmeddelande. Klistrar in källkoden:
spel.java

MASSA KOD

du måste ange spel.boll.pos i din paintComponent-metod

Visa signatur

Sverige är ett så litet land att det bara får plats en åsikt i taget där.

Permalänk
Medlem

Hur gör jag då?

Permalänk
Medlem

public void paintComponent(Graphics g) { super.paintComponent(g); g.setColor(Color.red); g.fillOval((int)spel.boll.pos("posX"), 240 - (int)spel.boll.pos("posY"), 20, 20); }

Visa signatur

Sverige är ett så litet land att det bara får plats en åsikt i taget där.

Permalänk
Medlem

Ah, det var så lätt.
Nu går det att kompilera, men när panelen ska ritas skrivs det ut ett felmeddelande. Kan inte hitta något fel i koden.
Testa att kompilera får du se.

Permalänk
Medlem

public rityta(spel spel) { this.spel = spel; //Sätter ytans storlek och färg setPreferredSize(new Dimension(320, 240)); setBackground(new Color(0, 0, 255)); }

Visa signatur

Sverige är ett så litet land att det bara får plats en åsikt i taget där.

Permalänk
Medlem

Funkade ju utmärkt! Tack så mycket!

Permalänk
3dfx Fanboy

steg ett: börja använda en vettig kodstandard... kalla inte klassen samma namn som variabler... klassen "boll" och variabler "boll".. så slipper du liknande problem

Visa signatur

Runnin with a pump pump
no bluffin we buck buck