Gå til innhold

[Løst]Swing er (ikke) noe herk!


Anbefalte innlegg

Når jeg kjører vedlagte program får jeg feilmelding:

Exception in thread "AWT-EventQueue-0" java.lang.NullPointerException
at Slumpgenerator.generator(Slumpgenerator.java:22)
at Starter.actionPerformed(SgGui.java:49)

Jeg skjønner ikke hva som er gærnt, er det noen som kan forklare?

 

(Koden er fordelt på to filer hvor det grafiske brukergrensesnittet med 3 klassene SgGui, Starter og Avslutter er på den ene. Og klasse Slumpgenerator på den andre)

 

 

import java.awt.event.*;

import java.awt.*;

import javax.swing.*;

 

class SgGui extends JFrame{

 

public static void main(String[]args){

SwingUtilities.invokeLater

(new Runnable(){

public void run(){

new SgGui();

}

});

}

 

JPanel panel;

JButton start, avslutt;

JTextArea tekstvindu;

 

 

SgGui(){

setTitle("Slumpgenerator");

panel = new JPanel();

panel.setLayout(new BorderLayout());

start = new JButton("Start");

start.addActionListener(new Starter(tekstvindu));

avslutt = new JButton("Avslutt");

avslutt.addActionListener(new Avslutter());

tekstvindu = new JTextArea(30,30);

panel.add(start,BorderLayout.CENTER);

panel.add(avslutt,BorderLayout.EAST);

panel.add(tekstvindu,BorderLayout.SOUTH);

add(panel);

setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);

pack();

setVisible(true);

}

}

 

class Starter implements ActionListener{

JTextArea tekstvindu;

 

Starter(JTextArea tekstvindu){

this.tekstvindu = tekstvindu;

}

 

public void actionPerformed(ActionEvent e){

Slumpgenerator sg = new Slumpgenerator();

sg.generator(tekstvindu);

}

}

 

class Avslutter implements ActionListener{

public void actionPerformed(ActionEvent e){

System.exit(0);

}

}

import java.util.Random;

import javax.swing.*;

 

class Slumpgenerator{

Random r = new Random();

int N;

// String tall;

int count = 0;

JTextArea tekstvindu;

 

void generator(JTextArea tekstvindu){

this.tekstvindu = tekstvindu;

String tekststreng = "Tallet er: ";

 

do{

N = r.nextInt(100)+1;

tekststreng = N + "";

System.out.println("Tall " + count + " er " + tekststreng);//Testfunksjon

count++;

tekstvindu.append(tekststreng);

}while(N!=100 && count<101);

}

}

 

Endret av PelleP
Lenke til kommentar
Videoannonse
Annonse

En nullpointer er nok ikke det som gjør swing til noe herk=) 0o

 

start.addActionListener(new Starter(tekstvindu));

avslutt = new JButton("Avslutt");

avslutt.addActionListener(new Avslutter());

tekstvindu = new JTextArea(30, 30);

 

Problemet ditt er nok rekkefølgen, du bruker tekstvindu før den er initialisert

Lenke til kommentar

Og så over til den virkelige grunnen til at Swing er noe herk! Jeg trodde at tekstvindu.append("Tall " + count + " er " + tekststreng + "\n"); ville legge til teksten i tekstvinduet hver gang dosløyfen kjøres, men altsammen blir lagt til etter at dosløyfen er ferdig. Hvordan kan jeg få lagt til en line av gangen?

Lenke til kommentar
Og så over til den virkelige grunnen til at Swing er noe herk! Jeg trodde at tekstvindu.append("Tall " + count + " er " + tekststreng + "\n"); ville legge til teksten i tekstvinduet hver gang dosløyfen kjøres, men altsammen blir lagt til etter at dosløyfen er ferdig. Hvordan kan jeg få lagt til en line av gangen?

 

 

Legg inn en liten "sleep" i do-while løkken din. Da ser du gjerne at det blir skrevet en og en linje.

 

try{
Thread.currentThread().sleep(100);
}catch(Exception ex){
}

Lenke til kommentar
Og så over til den virkelige grunnen til at Swing er noe herk! Jeg trodde at tekstvindu.append("Tall " + count + " er " + tekststreng + "\n"); ville legge til teksten i tekstvinduet hver gang dosløyfen kjøres, men altsammen blir lagt til etter at dosløyfen er ferdig. Hvordan kan jeg få lagt til en line av gangen?

 

Jeg bruker Swing daglig i profesjonell sammenheng. Det er slett ikke noe herk. For å kunne bruke Swing på en ordentlig måte er du nødt til å ha en ordentlig forståelse av Java, noe du tydeligvis ikke har tilegnet deg enda.

 

Werner

Lenke til kommentar
Jeg bruker Swing daglig i profesjonell sammenheng. Det er slett ikke noe herk. For å kunne bruke Swing på en ordentlig måte er du nødt til å ha en ordentlig forståelse av Java, noe du tydeligvis ikke har tilegnet deg enda.

Werner

Nei, jeg har ikke noen ordenlig forståelse av Java, men jeg jobber med det!

Kanskje du har noen tips, eller er du bare innom for å hjelpe meg til selvinsikt? :)

Lenke til kommentar
Legg inn en liten "sleep" i do-while løkken din. Da ser du gjerne at det blir skrevet en og en linje.

 

Nope, det hjelper ikke. Jeg har prøvd å legge in sleep først i do-løkken, sist i do-løkken og foran og sist i do-løkken. Det hjelper ikke!

 

Ok, har sett litt mer på koden. Det som skjer er at gui henger igjen på startknappen, og kan ikke oppdatere seg selv da (samme tråd). Når du skal starte en større jobb med en knapp i gui, må du kjøre jobben ut i en egen tråd. Jeg har endret litt på koden din, ta en titt.

 

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

class SgGui extends JFrame {

public static void main(String[] args) {
	SwingUtilities.invokeLater(new Runnable() {
		public void run() {
			new SgGui();
		}
	});
}

JPanel panel;
JButton start, avslutt;
JTextArea tekstvindu;
JScrollPane scroll;

SgGui() {
	setTitle("Slumpgenerator");
	panel = new JPanel();
	panel.setLayout(new BorderLayout());
	start = new JButton("Start");
	tekstvindu = new JTextArea(30, 30);
	scroll = new JScrollPane(tekstvindu);
	avslutt = new JButton("Avslutt");
	panel.add(start, BorderLayout.CENTER);
	panel.add(avslutt, BorderLayout.EAST);
	panel.add(scroll, BorderLayout.SOUTH);
	add(panel);
	setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
	pack();
	setVisible(true);
	start.addActionListener(new Starter(tekstvindu));
	avslutt.addActionListener(new Avslutter());
}
}

class Starter implements ActionListener {
JTextArea tekstvindu;

Starter(JTextArea tekstvindu) {
	this.tekstvindu = tekstvindu;
}

public void actionPerformed(ActionEvent e) {
	Slumpgenerator sg = new Slumpgenerator(tekstvindu);
	new Thread(sg).start();
}
}

class Avslutter implements ActionListener {
public void actionPerformed(ActionEvent e) {
	System.exit(0);
}
}

import java.util.Random;
import javax.swing.*;

class Slumpgenerator implements Runnable {
Random r = new Random();
int N;
// String tall;
int count = 0;
JTextArea textField;

public Slumpgenerator(JTextArea textField){
	this.textField = textField;
}

void generator() {
	String tekststreng = "Tallet er: ";

	do {
		N = r.nextInt(100) + 1;
		tekststreng = N + "\n";
		try {
			Thread.currentThread().sleep(100);
		} catch (Exception ex) {

		}
		count++;
		textField.append(tekststreng);
		textField.setCaretPosition(textField.getDocument().getLength());
	} while (N != 100 && count < 101);
}

@Override
public void run() {
	generator();
}
}

Lenke til kommentar
Ok, har sett litt mer på koden. Det som skjer er at gui henger igjen på startknappen, og kan ikke oppdatere seg selv da (samme tråd). Når du skal starte en større jobb med en knapp i gui, må du kjøre jobben ut i en egen tråd. Jeg har endret litt på koden din, ta en titt.

Nå føler jeg at jeg har blitt vesentlig klokere. Koden fungerer og jeg skal studere den nøye! Tusen takk! :thumbup:

Lenke til kommentar

Hvis du ikke har forstått det, så har GUI-et i java en Thread som får inn alle brukerinput (tastetrykk, musklikk, osv). Den samme tråden tegner opp GUI-et. Det er derfor du må lage en egen tråd hvis du skal se resultatet av f.eks append før du returnerer fra metoden din.

 

Wernie som er en erfaren Swing programmerer vet selvfølgelig dette og har sikkert en bestemt måte han pleier å håndtere dette på. F.eks hvis han generer en stor rapport og ikke vil at det skal se ut som programmet har hengt seg. Kanskje han til og med har lyst å fortelle deg om dette hvis du spør han pent? :p

 

Wernie er veldig bestemt på måten spørsmål blir stillt. Hvis du ikke gjør det akkurat riktig så får du stort sett et lettere sarkastiske svar som ikke hjelper trådstarter nevneverdig.

Endret av blackbrrd
Lenke til kommentar
Hvis du ikke har forstått det, så har GUI-et i java en Thread som får inn alle brukerinput (tastetrykk, musklikk, osv). Den samme tråden tegner opp GUI-et. Det er derfor du må lage en egen tråd hvis du skal se resultatet av f.eks append før du returnerer fra metoden din.

 

Wernie som er en erfaren Swing programmerer vet selvfølgelig dette og har sikkert en bestemt måte han pleier å håndtere dette på. F.eks hvis han generer en stor rapport og ikke vil at det skal se ut som programmet har hengt seg. Kanskje han til og med har lyst å fortelle deg om dette hvis du spør han pent? :p

 

Wernie er veldig bestemt på måten spørsmål blir stillt. Hvis du ikke gjør det akkurat riktig så får du stort sett et lettere sarkastiske svar som ikke hjelper trådstarter nevneverdig.

 

Ja jeg er en slask.

 

Werner

Lenke til kommentar
Hvis du ikke har forstått det, så har GUI-et i java en Thread som får inn alle brukerinput (tastetrykk, musklikk, osv). Den samme tråden tegner opp GUI-et. Det er derfor du må lage en egen tråd hvis du skal se resultatet av f.eks append før du returnerer fra metoden din.

 

Wernie som er en erfaren Swing programmerer vet selvfølgelig dette og har sikkert en bestemt måte han pleier å håndtere dette på. F.eks hvis han generer en stor rapport og ikke vil at det skal se ut som programmet har hengt seg. Kanskje han til og med har lyst å fortelle deg om dette hvis du spør han pent? :p

 

Wernie er veldig bestemt på måten spørsmål blir stillt. Hvis du ikke gjør det akkurat riktig så får du stort sett et lettere sarkastiske svar som ikke hjelper trådstarter nevneverdig.

Jeg prøver vanligvis å ha et emne som beskriver problemet litt bedre enn det som var tilfellet her, det er sikkert derfor Wernie har hjelpt meg flere ganger før. Jeg kan ikke avsette så mye tid til å lere meg Java som jeg skulle ønske, men nettop derfor så er den hjelpen jeg kan få her desto mer verdifull. Jeg hadde nok brukt lang tid dersom jeg skulle finne ut av dette på egen hånd! :)

Lenke til kommentar

Opprett en konto eller logg inn for å kommentere

Du må være et medlem for å kunne skrive en kommentar

Opprett konto

Det er enkelt å melde seg inn for å starte en ny konto!

Start en konto

Logg inn

Har du allerede en konto? Logg inn her.

Logg inn nå
  • Hvem er aktive   0 medlemmer

    • Ingen innloggede medlemmer aktive
×
×
  • Opprett ny...