Kom-pa-TI-bilitet
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...
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
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);
}
}
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....
- Igår Nvidia: "Energieffektiva RTX 4060 sparar hundralappar" 36
- Igår MSI Geforce RTX 4060 Ventus 2X OC – bra prestanda vid 1080p men medioker kylare 45
- Igår Noctua släpper monteringsram för "deliddade" Ryzen 7000-processorer 15
- Igår Nvidias nästa arkitektur för Geforce kommer år 2025 58
- 27 / 6 Afox släpper kompakt Geforce RTX 4090 36
- Igår Veckans fråga: Vilket operativsystem föredrar du? 76
- Igår Bilar med smarta inslag ger fler dumma fel 58
- 27 / 6 Telekombranschen: "Smarta glasögon ersätter telefoner inom fem år" 88
- 26 / 6 Lastpass-användare rasar – kan inte logga in 59
- 26 / 6 Inet frågar SweClockers – Vad skulle du vilja förbättra på Inet.se? 53
- Framtiden för C# och .Net i Sverige46
- Fel post (dödsbo)8
- Bildvisnings program5
- PSVR2 - diskussionstråd444
- Kommer flytta till stan och mitt wifi kommer säkert synas av hundratals människor varje dag. Vilken router ska jag köpa och hur ska den ställas in?6
- Solfilm till fönster för sommarvärmen. Behöver råd.30
- Hjälp angående gammal psu och "nytt" grafikkort2
- Ert dyraste ” datormisstag”?402
- MSI Geforce RTX 4060 Ventus 2X OC – bra prestanda vid 1080p men medioker kylare45
- Vad lyssnar du på just nu?12615
- Säljes LG 27'' UltraGear 27GP950 4K Nano IPS 160 Hz HDMI 2.1
- Säljes Star Wars Jedi AMD kod
- Säljes Trasig Xiaomi Mi Electric Scooter (M365) Svart
- Säljes 5800x3D + x570 Meg Unify + be quiet! Dark Rock Slim
- Säljes AMD ASUS DUAL RX6700XT
- Säljes Dell OptiPlex 7010
- Säljes Datordelar: i5 9600k + 1070 GTX mm.
- Säljes 1080 TI | Vattenblock | 1TB SSD | Apple Watch 4 Stainless | Hörlurar | Mikrofon
- Säljes Intressekoll: Xbox Series S 512Gb samt Switch Oled 64Gb Vit
- Säljes Gamingdator RTX 3090, i9-10900K, 32GB ram
- Nvidia: "Energieffektiva RTX 4060 sparar hundralappar"36
- MSI Geforce RTX 4060 Ventus 2X OC – bra prestanda vid 1080p men medioker kylare45
- Veckans fråga: Vilket operativsystem föredrar du?76
- Bilar med smarta inslag ger fler dumma fel58
- Noctua släpper monteringsram för "deliddade" Ryzen 7000-processorer15
- Nvidias nästa arkitektur för Geforce kommer år 202558
- Microsoft vill strömma Windows från molnet71
- Starfield utvecklas med AMD:s välsignelse148
- Telekombranschen: "Smarta glasögon ersätter telefoner inom fem år"88
- En av tre svenskar använder annonsblockerare79
Externa nyheter
Spelnyheter från FZ
- Alan Wake och CoD: Kallt krig snart på PS Plus, enligt läcka igår
- Red Dead Redemption åldersmärkt igen i Korea – det spekuleras i remaster igår
- Fallout London flyttas för att slippa Starfield-konkurrensen igår
- Minecraft-filmen kan ha hittat sin Steve – Pedro "The Last of Us-Joel" Pascal igår
- Stor Diablo IV-patch släppt, mer XP och ombalanserade klasser igår