Avatar billede heltsikkert Nybegynder
27. februar 2003 - 16:35 Der er 8 kommentarer og
1 løsning

Opdatering af brugergrænseflade - Hvordan undgår jeg flimmer?

Jeg har et problem med min GUI...
Når jeg tegner nye objekter eller sletter nogen, kan det ikke ses på skærmen.
Det har jeg klaret ved at skrive (GUI er en JFrame):

GUI.hide();
GUI.show();

Når GUI'en kommer frem igen er den opdateret, men det gør at det hele blinker hver gang jeg skal opdatere, og det kan da heller ikke være den rigtige måde, at gøre det på... Er der nogen, der kan hjælpe??
Avatar billede arne_v Ekspert
27. februar 2003 - 16:40 #1
Prøv og kald repaint.
Avatar billede riversen Nybegynder
27. februar 2003 - 16:44 #2
brug repaint();
Avatar billede heltsikkert Nybegynder
27. februar 2003 - 17:17 #3
Desværre... repaint virker ikke.. Der sker ingenting, når jeg bruger den.
Avatar billede riversen Nybegynder
27. februar 2003 - 17:18 #4
så gør du noget forkert
Avatar billede heltsikkert Nybegynder
27. februar 2003 - 17:25 #5
For at sætte en blå cirkel (f.eks.) bruger jeg følgende kommando:

GUI.jPanel1.add(new bluecircle(), new XYConstraints(dim[0]-3, dim[1]-3, 100, 100));

bluecirkel-klassen ser således ud:

class bluecircle extends JComponent {
  public void paint (Graphics g) {
    Graphics2D g2d = (Graphics2D)g;
    g2d.setColor(Color.blue);
    g2d.setStroke(new BasicStroke(3.0f));
    g2d.drawOval(2,2,41,41);
  }
}


Er der noget forkert i den måde at gøre det på?
Avatar billede =maddog= Nybegynder
28. februar 2003 - 00:30 #6
Du skal overskrive paintComponent. Jeg forestiller mig noget lign. dette (kender ikke XYConstraints, så jeg har lavet det uden layout manager)
import java.awt.*;
import java.awt.event.*;
import javax.swing.*;

public class GUI extends JFrame {
   
    public GUI(String title) {
        super(title);
        getContentPane().setLayout(null);
    }
   
    public void addCircle(Circle c, Point pos, Dimension size) {
        Insets insets = getContentPane().getInsets();
        getContentPane().add(c);
        c.setBounds(pos.x + insets.left, pos.y + insets.top, size.width, size.height);
    }
   
    public static void main(String[] args) {
        final GUI frame = new GUI("Cirkel test");
        frame.addCircle(new Circle(Color.blue), new Point(30,30), new Dimension(40,50));
        frame.addCircle(new Circle(Color.red), new Point(30,60), new Dimension(70,50));
        frame.addCircle(new Circle(Color.green), new Point(300,230), new Dimension(100,100));
        frame.addWindowListener(new WindowAdapter() {
            public void windowClosing(WindowEvent e) { System.exit(0); }
        });
        frame.setSize(800,600);
        frame.setVisible(true);
    }
}

class Circle extends JComponent {
   
    Color c;
   
    public Circle(Color c) {
        super();
        this.c = c;
        // Dette er VIGTIGT. Ellers skal vi tegne i alle bytes!!!
        setOpaque(false);
    }
    public void paintComponent (Graphics g) {
        super.paintComponent(g); // essentielt
        // Vi sætter størrelsen eksternt. I paintComponent sørger vi
        // blot for at cirklen svarer til denne størrelse.
        // Vi ønsker en perfekt cirkel i midten
        Dimension dim = getSize();
       
        Graphics2D g2d = (Graphics2D)g;
        g2d.setColor(c);
        g2d.setStroke(new BasicStroke(3.0f));
        if (dim.width>dim.height) {
            g2d.drawOval(
                ((dim.width-dim.height)/2)+3,
                3,
                dim.height-6,
                dim.height-6
                );
        } else {
            g2d.drawOval(
                3,
                ((dim.height-dim.width)/2)+3,
                dim.width-6,
                dim.width-6
                );
        }
    }
}
Avatar billede heltsikkert Nybegynder
01. marts 2003 - 18:39 #7
Det er bare super fedt!! Nu kan jeg få det til at virke.
Men jeg er ikke helt sikker på, at jeg forstår hvad jeg gjorde forkert.. men pyt :-)
Hvad er det, der sker når du kører super()?
Tusind tak for hjælpen. Hvis du lige smider et svar kan jeg give dig point...
Avatar billede =maddog= Nybegynder
01. marts 2003 - 20:58 #8
Når du kalder super ´bruger du også JComponents konstruktor. Ofte set i underklasser.
Avatar billede heltsikkert Nybegynder
02. marts 2003 - 14:05 #9
Jep, jeg fandt ud af det i mellemtiden :-)
Mange tak for hjælpen!
Avatar billede Ny bruger Nybegynder

Din løsning...

Tilladte BB-code-tags: [b]fed[/b] [i]kursiv[/i] [u]understreget[/u] Web- og emailadresser omdannes automatisk til links. Der sættes "nofollow" på alle links.

Loading billede Opret Preview
Kategori
Kurser inden for grundlæggende programmering

Log ind eller opret profil

Hov!

For at kunne deltage på Computerworld Eksperten skal du være logget ind.

Det er heldigvis nemt at oprette en bruger: Det tager to minutter og du kan vælge at bruge enten e-mail, Facebook eller Google som login.

Du kan også logge ind via nedenstående tjenester