Gå til innhold

Anbefalte innlegg

Har en frame som er bygd opp av en del paneler. Når jeg gjør en endring i det ene panelet, skal denne endringen vises i et annet panel via en setText-metode på en JLabel som kjøres i dette panelets paintComponent metode.

 

Nå skjer dette imidlertid først når jeg f.eks. minimerer/gjenoppretter vinduet eller på annen måte fremtvinger en repaint, men mitt spørsmål er om det er noen måte å kalle en repaint for hele frame'en eller dette spesifikke panelet fra det andre panelet? En slags "repaint-all" funksjon, slik at JLabel'en på det andre panelet endres umiddelbart.

 

Takknemlig for svar!

Endret av azidG
Lenke til kommentar
Videoannonse
Annonse
  buskmann skrev:
update()

Hei,

 

Kan du være snill og forklare litt nærmere hvordan jeg skal bruke den metoden? Ser den tar inn et Graphics objekt som parameter, men hva skal jeg bruke her?

 

Mulig jeg spør dumt, men har ikke holdt på med Java så veldig lenge... ;)

Lenke til kommentar
  mikaelandre skrev:
jeg har aldri brukt update før, men det som er viktig når du kaller paint() er å kalle super(g) inne i paint metoden. på den måten vil alle objektene tegnes på nytt, og ikke bare det ene som er endret.

Hmm.. Kaller super.paintComponent(g); først i paintComponent-metoden også. Merkelig dette her asså.. :hmm:

Lenke til kommentar
  azidG skrev:
  buskmann skrev:
update()

Kan du være snill og forklare litt nærmere hvordan jeg skal bruke den metoden? Ser den tar inn et Graphics objekt som parameter, men hva skal jeg bruke her?

Sorry, men jeg husker ikke. Husker bare at det løste mine problemer en gang.

 

paint() tar ve et graphicsobjekt, så du kan jo prøve å sende det videre til update().

 

GUI er prøving og feiling for min del.

Lenke til kommentar

Ville anbefalt å bruke Model View Controller (MVC) pattern til slike ting som dette her. Ved å bruke mvc så samler du all data i modellen, og hvis denne dataen endrer seg, så endrer også alle viewene (panelene i dette tilfellet). Legger ved kode her for verdens enkleste implementasjon av MVC i java som jeg gjorde en gang for lenge siden. Veldig enkelt å forstå.

 

Logikken bak er ganske enkel.. Modellen fremstår som en tjeneste som viewene kan abonnomere på. Modellen er Observable, mens viewene er Observers. Dvs.. hvis noe data endrer seg i modellen, så sier modellen ifra til viewene at dataen har endret seg ( setChanged() og notifyObservers() ). Legg merke til at modellen 'extends Observable', og viewene 'implements Observer'. Viewene "abonnomerer" på modellen ved 'addObserver( this )". Utrolig enkelt, og veldig effektivt. Dette tvinger deg også til å endre arkitekturen til det bedre, ved å separere presentasjon og logikk.

 

Controller klassen gjør ikke så mye, annet enn å være et "bindeledd" mellom modellen og viewene. Kompiler koden, og kjør, så skjønner du hva jeg snakker om.

 

Håper dette er til hjelp.

 

Dette er "view" klassen:

import java.util.*;

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

public class MVC_View extends JEditorPane implements Observer
{
MVC_Model mod = null;

String mode = null;

public MVC_View( MVC_Model mod )
{
 this.mod = mod;
 this.mode = mode;
 
 mod.addObserver( this );
 
 setEditable( false );
 setSize( 100,100 );
}

public void update( Observable o, Object object )
{
 setText( mod.getText() );
}
}

 

Dette er "modell" klassen:

import java.util.Observable;

public class MVC_Model extends Observable
{
String txt = null;

public MVC_Model( String txt )
{
 this.txt = txt;
}

public void setText( String txt )
{
 this.txt = txt;
 setChanged();
 notifyObservers();
}

public String getText()
{
 return txt;
}
}

 

Og til slutt, controller klassen:

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

public class MVC_Controller extends JFrame implements KeyListener
{
JTextField txtField = null;
MVC_Model mod = null;

public MVC_Controller()
{
 mod = new MVC_Model( "" );
 
 Container c = getContentPane();
 txtField = new JTextField( 20 );
 txtField.addKeyListener( this );
 txtField.setEditable( true );
 
 c.add( new JScrollPane( new MVC_View( mod ) ) , BorderLayout.CENTER );
 c.add( new JScrollPane( new MVC_View( mod ) ) , BorderLayout.EAST );
 c.add( new JScrollPane( new MVC_View( mod ) ) , BorderLayout.WEST );
 c.add( txtField, BorderLayout.SOUTH );
 
 setContentPane( c );
 setSize( 400, 250 );
 setVisible( true );
}

public void keyTyped( KeyEvent e )
{
}

public void keyPressed( KeyEvent e )
{
}

public void keyReleased( KeyEvent e )
{
 //if( e.getKeyCode() == e.VK_ENTER )
 mod.setText( txtField.getText() );
}

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

Lenke til kommentar

Det er også verdt å merke seg at dette kan være din "repaint-all" funksjon, da modellen behøver nødvendigvis ikke å inneholde data, men jeg vet ikke hva du prøver å gjøre. Uansett er det bra å kjøre MVC.. Slipper oppdaterings-problemene.

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å
×
×
  • Opprett ny...