Gå til innhold

skrive i JTextfield, hente med getText


Anbefalte innlegg

(Jeg har kommet et stykke videre så koden nednefor og spørsmålet til det er blitt endret)

 

Jeg prøver å lage et dialogvindu hvor man kan fylle inn tekst i feltene "norskfelt" og "engelskfelt". Når man klikker på knappen addGlose skal det man har skrevet i feltene hentes som parametere i til konstruktøren klassen tGlose.

 

Jeg klarer imidlertid ikke få tekstfelten redigerbare. Er det noen som kan hjelpe megP

 

class Leggtilord extends JFrame implements ActionListener{

   	Skrivetest st = new Skrivetest();
   public void actionPerformed(ActionEvent e){

JPanel leggTil = new JPanel();
JTextField norskfelt = new JTextField(20);
JTextField klassefelt = new JTextField(20);
JTextField engelskfelt = new JTextField(20);
JTextArea setningarea = new JTextArea(20,20);
JButton addGlose = new JButton("Legg til");
leggTil.setLayout(new GridLayout(0, 2));
leggTil.add(new JLabel("Norsk ord: "));
leggTil.add(norskfelt);
leggTil.add(new JLabel("Ordklass: "));
leggTil.add(klassefelt);
leggTil.add(new JLabel("Engelsk ord: "));
leggTil.add(engelskfelt);
leggTil.add(new JLabel("Exempelsetning: "));
leggTil.add(setningarea);
leggTil.add(addGlose);
addGlose.addActionListener(new tGlose(norskfelt.getText()));
add(leggTil);
setVisible(true);
   }
}

Endret av PelleP
Lenke til kommentar
Videoannonse
Annonse

Nå skjønner jeg ærlig talt ikke hva du mener, men koden fungerer forsåvidt at innholdet i norskfelt fungerer som parameter i konstruktøren til tGlose hvis jeg skriver

JTextField norskfelt = new JTextField("skriv inn norsk ord her!",20);

.

Problemet er at det jeg skriver i textfeltet ikke blir fanget opp.

Lenke til kommentar

Kan du forklare hvordan du mener du har kommet nærmere en løsning? (Er ikke meningen at dette skal høres krasst ut.)

 

Det nye gloseobjektet vil bli opprettet før du har fått sjansen til å skrive noe inn i de relevante tekstfeltene, dvs. før du i det hele tatt ser dem på skjermen.

 

Kanskje det vil bli lettere å gi bedre hint hvis du poster koden for gloseklassen din, samt annen relevant kode. Det er mulig jeg ikke forstår hvordan du tenker.

Lenke til kommentar
Du oppretter jo en ny norskfelt-variabel, som er uten innhold når du senere bruker getText().

Nå tror jeg at jeg har postet all rellevant kode, plus en god del irrellevant. Jeg er i ferd med å lage et grafisk brukergrensesnitt til et program som i utganspunktet kjørdes fra kommandolinjen.

 

Tanken min er at klassen tGlose skal opprettes med parametere fra tekstfeltene når man klikker på knappen "Legg til", det mener jeg bestemt fungerer, men det kan jo være at jeg tar feil. Det som ikke fungerer er å skrive i tekstfelten og så taste enter. Det skjer ikke noe når jeg taster enter og parameterne som blir sendt til tGlose er den opprinnelige teksten som sto i tekstfeltene.

 

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

class Engelsktest{

   public static void main(String[]args){
EngelsktestGUI gui = new EngelsktestGUI();

   }
}

class EngelsktestGUI extends JFrame{


   void EngelsktestGUI(){
SwingUtilities.invokeLater
   (new Runnable(){
    public void run(){
	new EngelsktestGUI();
    }
});
   }

   EngelsktestGUI(){
setTitle("Engelsktest");
setSize(800, 600);
JButton stavetest = new JButton("Stavetest");
stavetest.addActionListener(new Spraktest());
JButton leggtilord = new JButton("Legg til ord");
//leggtilord.addActionListener(new Leggtilord());
JButton avslutt = new JButton("Avslutt");
avslutt.addActionListener(new Avslutter());
JPanel panel = new JPanel();
panel.add(stavetest);
panel.add(leggtilord);
panel.add(avslutt);
add(panel);
setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
setVisible(true);
Leggtilord leggtil = new Leggtilord();
   }

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

class Leggtilord extends JFrame{

   JPanel leggTil;
   JTextField norskfelt;
   JTextField engelskfelt;
   JButton addGlose;
   String norskord;
   String engelskord;


   Leggtilord(){

leggTil = new JPanel();
leggTil.setLayout(new GridLayout(0, 2));

leggTil.add(new JLabel("Norsk ord: "));
norskfelt = new JTextField("sett inn norsk ord her!", 20);
//norskfelt.setEditable(true);
norskfelt.addActionListener(new Lytternorsk());
leggTil.add(norskfelt);

leggTil.add(new JLabel("Engelsk ord: "));
engelskfelt = new JTextField(20);
engelskfelt.setEditable(true);
engelskfelt.addActionListener(new Lytterengelsk());
leggTil.add(engelskfelt);

addGlose = new JButton("Legg til");
leggTil.add(addGlose);
addGlose.addActionListener(new tGlose(norskord, engelskord));

add(leggTil);
setVisible(true);
   }

   class Lytternorsk extends AbstractAction{

public void actionPerformed (ActionEvent e){

    norskord = norskfelt.getText();	   
}

   }

   class Lytterengelsk extends AbstractAction{

public void actionPerformed (ActionEvent e){

    engelskord = engelskfelt.getText();	

}
   }

}



class tGlose implements ActionListener{

   String norskord;
   String engelskord;

   tGlose(String norskord, String engelskord){
this.norskord = norskord;
this.engelskord = engelskord;
     }

   public void actionPerformed(ActionEvent e){  
System.out.println(norskord + ": " + engelskord);
   }
}

Lenke til kommentar

Det som skjer er at du setter feltene norskord og engelskord i denne linjen:

 

addGlose.addActionListener(new tGlose(norskord, engelskord));

 

og på det tidspunktet har du ikke skrevet inn noe i feltene ennå, og denne konstruktøren blir ikke kalt på nytt.

 

Det letteste er å lage en subklasse av tGlose som en inner class, som overrider actionPerformed. Bytt ut forrige linje med denne:

 

		addGlose.addActionListener(new tGlose() {
		@Override
		public void actionPerformed(ActionEvent arg0) {
			this.engelskordet = engelskfelt.getText();
			this.norskord = norskfelt.getText();
			System.out.println(norskfelt.getText() + ": " + engelskfelt.getText());
		}
	});

 

I tillegg må du slette konstruktøren til klassen tGlose, slik at bare en default no-argument konstruktør finnes, og du må gjøre de to JTextField'ene norskfelt og engelskfelt til final. Håper du kommer litt videre nå :)

Lenke til kommentar

addGlose.addActionListener(new tGlose(norskord, engelskord));

Kodelinjen blir kjørt èn gang, IKKE hver ganger du klikker på knappen.

 

Og hva er variablene norskord og engelskord den ene gangen linjen blir kjørt? De er begge null.

 

Det opprettes ETT gloseobjekt med lokale variabler for norskord/engelskord. Når knappen så klikkes på senere er det eneste som skjer at DISSE variablene skrives ut: Altså får du alltid ut "null: null" samme hva som måtte befinne seg i tekstfeltene.

 

Her har jeg herjet litt med koden:

 

 

import java.awt.GridLayout;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.util.ArrayList;
import java.util.List;

import javax.swing.JButton;
import javax.swing.JFrame;
import javax.swing.JLabel;
import javax.swing.JPanel;
import javax.swing.JTextField;


class Engelsktest{

public static void main(String[]args){
	new EngelsktestGUI();
}
}

class EngelsktestGUI extends JFrame{

EngelsktestGUI(){
	setTitle("Engelsktest");
	setSize(800, 600);
	JButton stavetest = new JButton("Stavetest");
	stavetest.addActionListener(new Spraktest());
	JButton leggtilord = new JButton("Legg til ord");
	//leggtilord.addActionListener(new Leggtilord());
	JButton avslutt = new JButton("Avslutt");
	avslutt.addActionListener(new Avslutter());
	JPanel panel = new JPanel();
	panel.add(stavetest);
	panel.add(leggtilord);
	panel.add(avslutt);
	add(panel);
	setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
	setVisible(true);
	Leggtilord leggtil = new Leggtilord();
}

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

class Leggtilord extends JFrame{
List<Glose> gloser;	
JPanel leggTil;
JTextField norskfelt;
JTextField engelskfelt;
JButton addGlose;


Leggtilord(){
	gloser = new ArrayList<Glose>();

	leggTil = new JPanel();
	leggTil.setLayout(new GridLayout(0, 2));

	leggTil.add(new JLabel("Norsk ord: "));
	norskfelt = new JTextField(20);
	//norskfelt.setEditable(true);
	leggTil.add(norskfelt);

	leggTil.add(new JLabel("Engelsk ord: "));
	engelskfelt = new JTextField(20);
	engelskfelt.setEditable(true);
	leggTil.add(engelskfelt);

	addGlose = new JButton("Legg til");
	leggTil.add(addGlose);
	//addGlose.addActionListener(new Glose(norskord, engelskord));
	addGlose.addActionListener(new LeggTilGloseLytter());

	add(leggTil);
	setVisible(true);
}


class LeggTilGloseLytter implements ActionListener {

	public void actionPerformed(ActionEvent e) {
		String norsk = norskfelt.getText();
		String eng = engelskfelt.getText();
		gloser.add(new Glose(norsk, eng));

		System.out.println("La til \"" + norsk + ": " + eng + "\"\n\nALLE gloser:\n===========");
		for (Glose g : gloser) {
			System.out.println(g.norskord + ": " + g.engelskord);
		}
		System.out.println();
	}	
}

}



class Glose {
String norskord;
String engelskord;

Glose(String norskord, String engelskord){
	this.norskord = norskord;
	this.engelskord = engelskord;
}

public void actionPerformed(ActionEvent e){
	System.out.println(norskord + ": " + engelskord);
}
}

 

 

 

Det selvsagt ikke gjøres akkurat slik, det er bare en av mange mulige løsninger på det å legge til nye gloser. Når det gjelder selve brukergrensesnittet så kunne vært en idé f.eks. å lage dialogen med JDialog som superklasse.

Lenke til kommentar
addGlose.addActionListener(new tGlose(norskord, engelskord));

Kodelinjen blir kjørt èn gang, IKKE hver ganger du klikker på knappen.

 

Det var det som jeg hadde missforstått! Jeg vet ikke om jeg får tid til å se på dette idag, men jeg er rimelig sikker på at dette ordner seg nå. Takk for tilbakemeldinger, jeg har lært meg masse! :yes:

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...