Strömma data till java JFrame

Permalänk

Strömma data till java JFrame

Hejsan!

Jag har ett skolprojekt i Java där jag först ska skapa ett program som intelligent genererar viss data beroende av vissa slumpmässiga tal och sedan loggar detta. Nästa steg är att visualisera detta grafiskt. Jag är inte jätteduktig på detta och det är lite överkurs egentligen men krävs för ett högre betyg.

Jag har lyckats få mitt GUI som jag vill ha det, med hjälp av JFrame, JPanel osv, men jag vill "strömma" data (heltal) in i det från mina andra klasser som skall uppdatera vissa dimensioner beroende på vilka tal som kommer in.

Alla metoder måste ha Graphics som in-objekt men det finns ju inget sådant i mina andra klasser, så jag vet inte riktigt vad jag ska göra...

Permalänk
Medlem
Skrivet av Guergelmajs:

Hejsan!

Jag har ett skolprojekt i Java där jag först ska skapa ett program som intelligent genererar viss data beroende av vissa slumpmässiga tal och sedan loggar detta. Nästa steg är att visualisera detta grafiskt. Jag är inte jätteduktig på detta och det är lite överkurs egentligen men krävs för ett högre betyg.

Jag har lyckats få mitt GUI som jag vill ha det, med hjälp av JFrame, JPanel osv, men jag vill "strömma" data (heltal) in i det från mina andra klasser som skall uppdatera vissa dimensioner beroende på vilka tal som kommer in.

Alla metoder måste ha Graphics som in-objekt men det finns ju inget sådant i mina andra klasser, så jag vet inte riktigt vad jag ska göra...

Alla komponenter i Swing har en paintComponent-metod som tar en Graphic och ritar ut just den komponenten. Du kan överlagra den på exempelvis din JPanel och använda Graphic-objektet för att rita din data.

Skickades från m.sweclockers.com

Visa signatur

Kom-pa-TI-bilitet

Permalänk
Skrivet av Teknocide:

Alla komponenter i Swing har en paintComponent-metod som tar en Graphic och ritar ut just den komponenten. Du kan överlagra den på exempelvis din JPanel och använda Graphic-objektet för att rita din data.

Skickades från m.sweclockers.com

Jo, men det är ju typ så långt jag kommit.

import java.awt.*; import javax.swing.*; public class Draw extends JPanel{ public void paintComponent(Graphics g){ super.paintComponent(g); setBackground(Color.BLACK); g.setColor(Color.GRAY); g.fillRect(380, 0, 220, 600); g.setColor(Color.LIGHT_GRAY); g.fillRect(0, 500, 380, 100); g.setColor(Color.WHITE); g.drawRect(170, 30, 20, 20); } public static void main(String[] args){ Draw d = new Draw(); JFrame jf = new JFrame("Draw"); jf.setVisible(true); jf.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); jf.setSize(600,600); jf.add(d); } }

Så ser det just nu, och jag vill att den vita rektangelns y-värde ska kontinuerligt uppdateras för varje frame (så den rör sig upp och ner beroende på vad som kommer in), och detta värde kommer från andra klasser som inte har något med grafiskt att göra.
Jag vet inte om ni fattar, vet inte hur jag ska förklara utan att beskriva hela programmet

Jag förstår ju själv att jag inte kan ha två mainmetoder i samma program men jag vet verkligen inte hur jag ska få till det ^^

EDIT:

Här är huvudklassen i själva programmet:

import java.util.*; import javax.swing.*; public class Simulation { String flame; String dist; Matrix matrix; Log log; Random r; public Simulation(){ matrix = new Matrix(); log = new Log(); r = new Random(); } private boolean fire(double h, int f, double s){ Counter c = matrix.getCounter(h,f,s); if(c.off<c.on){ //Om det verkar fördelaktigt att ha på motorn testar vi det log.chistory.add(c); log.ohistory.add(1); return true; }else if(c.on<c.off){ //Om det verkar fördelaktigt att ha av motorn testar vi det log.chistory.add(c); log.ohistory.add(0); return false; }else{ //Om vi inte vet vad som är fördelaktigt får slumpen bestämma if(Math.random()<0.5){ log.chistory.add(c); log.ohistory.add(1); return true; }else{ log.chistory.add(c); log.ohistory.add(0); return false; } } } private void run(MoonLander m) throws InterruptedException{ m.fuel = r.nextInt(50) + 75; m.height = r.nextInt(100) + 100; m.speed = r.nextInt(10) - 5 ; flame = ""; while (0 < m.height && 0 < m.fuel) { if (fire(m.height, m.fuel, m.speed)) { int kick = Math.min(2, m.fuel); m.fuel -= kick; m.speed += kick; flame = "<"; }else{ flame = ""; } m.height += m.speed; m.speed -= 0.97; // Månens gravitation /* * Draw that SPACESHIP (Skicka m.height) * and that FLAME (Skicka boolean om motorn är på) * and those NUMBERS! (Skicka m.fuel, m.height, m.speed) */ Thread.sleep(100); } int i = 0; int k; if (m.fuel == 0 && 0 < m.height) { // FAIL: slut på bränsle före landning ' for(Counter c : log.chistory){ k = log.ohistory.get(i); if(k == 0){ c.off -= 1; }else{ c.on -= 1; } i++; } log.attempts +=1; log.fuelCrashes +=1; }else if (m.speed < -10) { // FAIL: för hög hastighet vid landning for(Counter c : log.chistory){ k = log.ohistory.get(i); if(k == 0){ c.off -= 1; }else{ c.on -= 1; } i++; } System.out.print("\rX"); log.attempts +=1; log.speedCrashes +=1; }else { // WIN! for(Counter c : log.chistory){ k = log.ohistory.get(i); if(k == 0){ c.off += 2; }else{ c.on += 2; } i++; } log.attempts +=1; log.successes +=1; //System.out.println("success!"); } //Thread.sleep(100); /* * Draw that STATISTICS (Skicka log.attempts, log.successes, log.speedCrashes, log.fuelChrashes) */ run(m); } /** * @param args */ public static void main(String[] args) throws InterruptedException{ Simulation sim = new Simulation(); MoonLander Apollo1337 = new MoonLander(); sim.run(Apollo1337); } }

Dold text

EDIT 2:
Jag löste det...

Till de som kanske läser detta i framtiden:

Skapade en instansvariabel i Draw.java som stod för höjden. Jag satte denna från huvudklassen och anropade sedan metoden repaint(). Detta var korta versionen, den som vill höra långa får fråga....