Avatar billede pyroman Nybegynder
01. august 2004 - 10:54 Der er 14 kommentarer og
1 løsning

Skifte skærmbillede

Darvs!

Jeg sidder og roder med en applet, hvor man først skal logge in, hvorefter at (når man er logget ind) skal skifte skærmbillede.
De to forskellige skærmbilleder er er opbygget af awt komponenter.

Jeg har indtil videre opbygget det på den måde at jeg har hovedklassen og to andre klasser, der hver udgør skærmbillederne, og add'er komponenterne til appletens container.
Jeg regnede så med at lave en show() og hide(), sådan at man kan skifte mellem de to skærmbilleder.

Er det en smart måde at gøre det på? Og hvordan skjuler man komponenterne igen og gør dem inaktive?

Og bonusspørgsmålet: Jeg vil også gerne tegne nogle rammer og bileder osv... Men når jeg definerer paint() i appleten, så tegnes der ikke en skid så længe at komponenterne tegnes. Jeg mener at have læst at man skulle løse dette på en eller anden måde, men jeg kan ikke huske hvordan... Hvordan?


På forhånd tak!

Filip
Avatar billede Slettet bruger
01. august 2004 - 14:00 #1
Mht. 1. spørgsmål, så er det ikke nok at regne med at kunne bruge show() og hide()-metoderne, du skal (efter min mening) bruge en layoutmanager der gør at du kan skifte imellem de 2 "skærmbilleder", hertil er CardLayout ideel.

Mht. 2. spørgsmål, når du vil definere paint-metoden i en applet, skal du huske at kalde super.paint()-metoden, altså noget lignende dette:

public void paint(Graphics g) {
  super.paint(g);
  // Din "paint-kode" kommer her...
}

Jeg håber jeg har forstået dit spørgsmål korrekt :-)
Avatar billede pyroman Nybegynder
01. august 2004 - 14:47 #2
jo det er nok forstået rigtigt...

Hvordan bruger man cardlayut? Fordi jeg kan ikke helt gennemskue hvordan man skifter mellem de kortene...
Avatar billede pyroman Nybegynder
01. august 2004 - 14:51 #3
ahh - så kan man bruge denne: show(Container parent, String name)    -smart!

Det prøver jeg sgu lige du ;)
Avatar billede pyroman Nybegynder
01. august 2004 - 16:53 #4
Det med cardlayout var en rigtig god ide! skidesmart...

...men! Jeg kan sgu ikke få paint() til at virke - det er som om at komponterne overskriver det tegnede, for hvis jeg forhindrer initialiseringen af dem, så tegner den pænt en streg...
Avatar billede Slettet bruger
01. august 2004 - 17:01 #5
Jamen....hov!

Du kan jo ikke tegne på applet'en, og så tilføje komponenter ovenpå den og forvente at de ikke dækker over det tegnede. Hvis du vil ha' tegnet på applet'en, ovenpå komponenterne, så skal du overskrive komponenternes paint-metoder.
Avatar billede pyroman Nybegynder
01. august 2004 - 18:55 #6
Hmm - altså det jeg gerne kunne tænke mig er fx en 1 pixel ramme udenom nogle af komponenterne og et logo...

Skal man så omdefinere samtlige komponenters paint-metode? eller bare én - eller findes der et trick?
Avatar billede mikkelbm Nybegynder
01. august 2004 - 19:51 #7
Logoet skal du nok tegne ved brug af paint.
Men det fleste komponenter har en setBorder(Border b) metode.
Avatar billede mikkelbm Nybegynder
01. august 2004 - 19:54 #8
Et lille eksempel:

JPanel p = new JPanel();
p.setBorder(BorderFactory.createLineBorder(Color.red, 1));
Avatar billede pyroman Nybegynder
01. august 2004 - 20:53 #9
ja ok - men hvordan fanden tegner jeg med paint()?!!

Det er jo det der er problemet...

Jeg har bogen "Objektorienteret programmering i JAVA" af Jakob Nordfalk - i den laver han et eksempel hvor han både tegner og bruger komponenter. Han bruger i det eksempel do Swing komponenter og det er ikke en applet men et Frame vindue... men måden han gør det på er at han definerer sin egen paint() der kalder paint() i superklassen før han tegner selv...
Avatar billede mikkelbm Nybegynder
01. august 2004 - 21:17 #10
Her et lille eksempel der tegner ovenpå nogle komponenter:

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

public class Test extends JApplet
{
    private Image logo;
   
    public void init()
    {
        JPanel p = new JPanel();   
        p.setBorder(BorderFactory.createLineBorder(Color.red, 1));
       
        logo = getImage(getDocumentBase(), "logo.jpg");
       
        p.setLayout(new GridLayout(10, 10));
       
        for (int i = 0; i<10; i++)
        {
            for (int j = 0; j<10; j++)
            {
                JPanel tempPanel = new JPanel();
                tempPanel.setBorder(BorderFactory.createEtchedBorder(Color.white, Color.black));
                p.add(tempPanel);
            }
        }
       
        this.getContentPane().add(p, BorderLayout.CENTER);
    }
   
    public void paint(Graphics g)
    {
        super.paint(g);
       
        g.drawImage(logo, 2, 2, this);
    }   
}
Avatar billede pyroman Nybegynder
01. august 2004 - 22:58 #11
Jep ok - men det virker altså ikke hvis man bruger awt komponenter og ikke swing...

Kan man gøre det samme med awt komponenter - eller er det lidt mere besværligt?
Avatar billede mikkelbm Nybegynder
02. august 2004 - 11:00 #12
Mht awt kender jeg desværre ikke nogen løsning på problemet. Beklager...
Avatar billede pyroman Nybegynder
02. august 2004 - 16:56 #13
Hmm - jeg prøver at se om man kan tegne på et komponent ved at definere dens paint-metode... ellers så bruger jeg sgu swing - syntes bare at det kunne være smart med platformsdefinerede komponenter, når jeg alligevel kun skal bruge sådan nogle simple nogle som Button, Panel, Textarea...
Avatar billede pyroman Nybegynder
02. august 2004 - 17:50 #14
Jeg har fundet ud af at for at tegne på awt komponenter, så skal man tegne i Canvas komponenten... ellers vil det ikke du...

Men tak for hjælpen - nu vil jeg vurdere om jeg vil bruge Canvas eller swing...

Præmien går derfor til corholio... ;)
Avatar billede Slettet bruger
03. august 2004 - 18:33 #15
Så takker jeg for pointene :-)
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