webForumDet fria alternativet

Uppdatera en Panel genom att trycka på knapp

8 svar · 414 visningar · startad av Type

TypeMedlem sedan mars 20021 239 inlägg
#1

Hej alla experter! Jag behöver lite hjälp o vänder mig därför till förträffliga wF.

Jag har egentligen ett mycket mer utbyggt system men tänkte petade ihop ett litet exempel som visar precis vad som är problemet... Jag vill när man trycker på en knapp ändra texten som står i en panel.

Problemet är att man måste ändra storlek på fönstret för att den nya texten "nu har du tryckt" kommer fram. Det känns som att detta är ett repaint-problem men jag har försökt lägga in repaint på allt. Jag har även i ett drastiskt försök ändrat storleken på fönstret i programmet. Detta gav inget positivt resultat tyvärr utan man måste fortfarande ändra storlek med musen för att det ska komma ut...

Koden:

import java.awt.*;
import java.awt.event.*;

public class Test extends Frame implements ActionListener{
	private Panel right;
	private Panel p;
	private Panel left;
	public void makeGui(){
		p = new Panel(new BorderLayout());
		Panel left = new Panel(new FlowLayout());
		right = new Panel(new FlowLayout());
		right.add(new Label("Nu har du INTE tryckt"));
		Button b = new Button("test");
		b.addActionListener(this);
		b.setActionCommand("test");
		left.add(b);
		p.add(left,BorderLayout.WEST);
		p.add(right,BorderLayout.CENTER);
		this.add(p);
		this.setSize(400,400);
		this.show();
	}
   
	Test(){
		makeGui();
	}
	
	public void actionPerformed(ActionEvent e){
		if(e.getActionCommand()=="test"){
			right.removeAll();
			right.add(new Label("Nu har du tryckt"));
			p.add(right,BorderLayout.CENTER);
			right.repaint();
			p.repaint();
		}
	}
}

Jag är tacksam för snabba svar för lösningen måste va klar imorgon... (helst) ;)

MVH Erik

ViktorMedlem sedan aug. 20021 752 inlägg
#2

Jag har inte provat denna lösning men den ser bra ut :)

import java.awt.*;
import java.awt.event.*;

public class Test extends Frame implements ActionListener{
	private Panel right;
	private Panel p;
	private Panel left;
	private Label myLabel; //Ny
	public void makeGui(){
		p = new Panel(new BorderLayout());
		Panel left = new Panel(new FlowLayout());
		right = new Panel(new FlowLayout());
		myLabel=new Label("Nu har du INTE tryckt"); //Ny
		right.add(myLabel);  //Ny
		Button b = new Button("test");
		b.addActionListener(this);
		b.setActionCommand("test");
		left.add(b);
		p.add(left,BorderLayout.WEST);
		p.add(right,BorderLayout.CENTER);
		this.add(p);
		this.setSize(400,400);
		this.show();
	}
   
	Test(){
		makeGui();
	}
	
	public void actionPerformed(ActionEvent e){
		if(e.getActionCommand()=="test"){
			myLabel.setText("Nu har du tryckt");  //Ny
			//right.repaint();

		}
	}
}

Jag är lite osäker på om repaint behövs.

/Viktor

PhorpherMedlem sedan feb. 20002 300 inlägg
#3

Lägg din label som en privat klassvariabel istället. När du trycker på knappen så ändrar du bara texten i labeln istället för att plocka bort den gamla och lägga dit en ny.

TypeMedlem sedan mars 20021 239 inlägg
#4

Typiskt... Nu blev mitt korta snabba exempel inte så bra längre..
Det är nämligen inte en label jag ska ha där egentligen... la bara dit den för enkelhetens skull..

Jag kommer ha en massa olika saker där.. Där ska nämligen sökresultat visas från en databas..

Jag kör awt så det går inte att använda en tabell som annars skulle va perfekt!

Jag kommer skriva ut detta:

for(int i=0; i<rader;i++){
   gridCell = new Panel(new FlowLayout());
   gridCell.add(new Button("läs mer"));
   gridCell.add(new Checkbox("Reservera"));
   contentCenter.add(new Label("Titel på bok"));
   contentCenter.add(new Label("Författare"));
   contentCenter.add(gridCell);	
}

... där Titel på bok ska ersättas av titeln från ResultSet:en och Författare ersättas av Författaren från ResultSet:en. Som ni ser ska knappar läggas till o några labels... Eftersom ett varierande antal poster ska läggas till kan man inte bara ändra en labels text... Hoppas ni förstår mitt problem ännu bättre nu ;)

/Erik

TypeMedlem sedan mars 20021 239 inlägg
#5

koden jag senast postade funkar ju inte o sätta in direkt utan ni får se det mer som ett exempel.. jag har en massa olika versioner av kod så namnen stämmer inte alls igen.. det skulle väl stå FlowLayout gridCell på första raden i forloopen tex... sen ska det istället för contentCenter stå right... för att få den o fungera som jag hoppas o tror...

TypeMedlem sedan mars 20021 239 inlägg
#6

Finns det ingen som vet vad som är fel? Det börjar bli lite brådis :)

ViktorMedlem sedan aug. 20021 752 inlägg
#7

Ska du bara ändra texten när du gör en sökning eller även när resultatet är pressenterat?

/Viktor

TypeMedlem sedan mars 20021 239 inlägg
#8

Jag ska aldrig ändra texten...
Det känns som att jag behöver förklara det här lite bättre...

Den där labeln va bara ett exempel. men tydligen framgick det inte vad som va problem.

Jag ska söka ur en databas. Jag har ett textfält och en choice-ruta som man kan skriva o välja saker i. Sen trycker man på ok-knappen. När man trycker på den ska alla resultsets som hittades i databasen skrivas ut i Panelen. Det är detta som inte fungerar nu, utan man måste ändra storlek på fönstret innan man ser ändringen...

Jag ska skriva ut "Titel på bok" "Författare" och en knapp som det ska stå "läs mer". Dessutom ska det finnas en checkbox som heter Reservera.

Problemet är själva uppdateringen... Det går att direkt ändra bakgrundsfärg på panelen men inte att lägga dit nya komponenter direkt. De nyinlagda komponenterna syns inte förrän man ändrar storlek. Hur kommer man runt det... testa den kod jag postade i första exemplet, med ett tillägg på körbar fil som skapar ett objekt av Test såklart.. Gör du det kommer du se vad som är problem... klockan tickar ;)

TypeMedlem sedan mars 20021 239 inlägg
#9

Felet är löst!

Fick tag på hjälp via DC av en påläst person...

Funktionen jag skulle använda hette pack() o fanns i klassen Window.

Jag ändrade de nedersta right.repaint() och p.repaint() skrev jag this.pack(), då funkade det bra!
sen fick jag lägga till en this.resize(400,400); för att få samma storlek på fönstret som innan!

Tack så mycket alla som hjälpt till med det ena eller det andra!
:birp :birp :birp

131 ms totalt · 3 externa anrop · v20260731065814-full.3ab8d573
0 ms — hämta forumlista (cache)
0 ms — hämta statistik (cache)
128 ms — hämta tråd, inlägg och bilagor (db)