azidG Skrevet 4. mai 2005 Skrevet 4. mai 2005 (endret) 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 4. mai 2005 av azidG
aic007 Skrevet 4. mai 2005 Skrevet 4. mai 2005 Er ikke sikker på om dette fixer problemet ditt, men jeg fixa et likende problem ved å skrive: setVisible( true )
azidG Skrevet 5. mai 2005 Forfatter Skrevet 5. mai 2005 Er ikke sikker på om dette fixer problemet ditt, men jeg fixa et likende problem ved å skrive: setVisible( true ) Takk for svar, men det fungerte ikke.
azidG Skrevet 5. mai 2005 Forfatter Skrevet 5. mai 2005 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...
mikaelandre Skrevet 5. mai 2005 Skrevet 5. mai 2005 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.
azidG Skrevet 5. mai 2005 Forfatter Skrevet 5. mai 2005 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å..
threiran Skrevet 5. mai 2005 Skrevet 5. mai 2005 For å sørge for at noe tegnes på nytt, er det vel enklest å kalle repaint() på komponenten, for eksempel på JLabelen? CPL
buskmann Skrevet 6. mai 2005 Skrevet 6. mai 2005 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.
krigun Skrevet 6. mai 2005 Skrevet 6. mai 2005 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(); } }
krigun Skrevet 6. mai 2005 Skrevet 6. mai 2005 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.
Anbefalte innlegg
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 kontoLogg inn
Har du allerede en konto? Logg inn her.
Logg inn nå