Avatar billede erk Nybegynder
31. juli 2001 - 23:36 Der er 9 kommentarer og
1 løsning

CardLayouy og setBounds()-metoden

Når jeg laver en single-panel-Applet kan jeg lave [setLauout(null)] og derefter bruge setbounds()-metoden til manuelt at placere elementer som knapper og lignende. Men jeg vil bruge CardLayout, som indkorporerer flere panels. Hvis jeg laver
[panelX.setLauout(null)] på et af disse panels er elementerne som hører til dette panel ikke længere synlige i min Applet selvom jeg har \"addet\" dem og benyttet setBounds()-metoden! Hvordan kan jeg have flere panels i én Applet og alligevel placere elementerne i de forskellige panels manuelt???

Et fyldestgørende svar ville betyde SÅ meget for mig, da dette problem totalt blokerer et lille spil-projekt jeg er igang med...
Avatar billede disky Nybegynder
01. august 2001 - 08:41 #1
Hvorfor det lige er sådanne kan jeg ikke direkte svare på.

Men hvad med at anvende GridBagLayout istedet for setBounds() ?

Så virker det med sikkerhed, har jeg selv gjort flere gange.
Avatar billede erk Nybegynder
01. august 2001 - 16:55 #2
\"GridBagLayout\" ?? Har aldrig hørt om det ! Hvordan gør man det, og kan man stadig have flere panels ?
Avatar billede disky Nybegynder
02. august 2001 - 08:47 #3
nej men lav et CardLayout og i de panels laver du et GridBagLayout. Forresten er GridBagLayout standard i Java :)
Avatar billede anjensen1 Novice
02. august 2001 - 15:15 #4
hej
Jeg véd ikke om det kan hjælpe dig men har du prøvet at kalde setVisible() på de componenter der er \'borte\'? -Det ku jo være...

Historien om GridBagLayout er ikke så simpel ( Layoutet iøvrigt heller ikke ;)
GridbagLayout et lavet af en 3. part for at bevise at det var muligt at skrive egne layoutmanagers med de komponeneter som java tilbyder. Derefter blev GridbagLayout så at sige \'inviteret\' ind i sproget. Det er ret sprødt og anvender sig af Constraints til styring af placering.. Iøvrigt er der mange flere varianter af layout. Det er muligt at du kan finde noget som hjælper dig på Sun\'s hp. Søg på layoutmanagers
mvh.
Avatar billede anjensen1 Novice
02. august 2001 - 15:23 #5
Hov foresten
Du skal kalde show() på dit cardlayout
altså:
<CardLayoutHandle>.show()
Kan det hjælpe?
Avatar billede erk Nybegynder
03. august 2001 - 11:59 #6
CardLayout-klassen indeholder ikke en show-metode.
Jeg har kigget på Sun\'s hjemmeside og kunne ikke finde svar. Det jeg har gjort er at sætte layoutet på de forsk. panels til null : <panel>.setLauout(null); Det lykkedes at få komponenterne frem ved ikke alene at kalde setBounds-metoden på komponenterne, men også på de PANELS som komponenterne ligger i. Mit problem er nu bare at man kun ser de forsk. panels og de knapper jeg har addet til dem. Resultaterne af drawString(...) og drawImage(...) er ikke synlige som de var før jeg satte Layout til null og benyttede setBounds på komponenterne og de forsk. panels. Det tilbageværende problem er altså at klare dette! Hvis jeg kan få en løsning på dette skal jeg nok give ham der giver svaret de fulde 201 point.
Avatar billede erk Nybegynder
03. august 2001 - 12:08 #7
klassen ser såeledes ud:

public class Game extends Applet implements ActionListener {
 
  //noden der repræsenterer aktuel lokation i Map
  SixWayNode location;
 
  //String der angiver aktuelt vindue
  String whichWindow = \"\";
 
  //Sæt plads af i RAM til instansen af navigations-datastrukturen Map
  Map m;
 
  //int til registrering af valg af retning
  int directionChoice = 0;

  Panel gamePanel;
  CardLayout cardLayout;
  Button south, north, east, west, up, down, startGame;
 
  //Valg af Font
  final Font startFont = new Font(\"SansSerif\", Font.BOLD, 22);
  final Font gameFont = new Font(\"SansSerif\", Font.BOLD, 12);
 
  //Skal senere være i et Array med andre Images...
  Image back;

  public void init() {
     
      setBackground(Color.red);
      m = new Map(1); //dan instans af Map +-> Mangler:(user-input-level)
      m.generateMap(); //initiér Map
     
      location = m.getStartingPoint();
     
      setFont(startFont);
      setBackground(Color.black);
     
      //knapper til gameWindow
      south = new Button(\"SYD\");
      north = new Button(\"NORD\");
      east  = new Button(\"ØST\");
      west  = new Button(\"VEST\");
      up    = new Button(\"TRAPPE-OP\");
      down  = new Button(\"TRAPPE-NED\");
     
      setLayout(null);
     
      cardLayout = new CardLayout(0,0);
      gamePanel = new Panel();
      gamePanel.setLayout(cardLayout);

      Panel startWindow = new Panel();
      startWindow.setBounds(0,0,604,450);
      startWindow.setLayout(null);
      startGame = new Button(\"Spil LUC-2001\");
      startGame.setBounds(100,100,100,100);
      startWindow.add(startGame);
      startWindow.setBounds(0,0,604,450);
     
      Panel gameWindow = new Panel();
      gameWindow.setLayout(null);
      south.setBounds(10,20,30,20);
      north.setBounds(50,20,30,20);
      east.setBounds(90,20,30,20);
      west.setBounds(130,20,30,20);
      up.setBounds(170,20,30,20);
      down.setBounds(210,20,30,20);
      gameWindow.add(south);
      gameWindow.add(north);
      gameWindow.add(east);
      gameWindow.add(west);
      gameWindow.add(up);
      gameWindow.add(down);
     
      //+Panel introWindow<--> ?
     
      gamePanel.add(startWindow, \"Velkommen\");
      gamePanel.add(gameWindow, \"LUC 2001 - The Game\");
      gamePanel.setBounds(0,0,604,450);
      add(gamePanel);
     

     
      south.addActionListener(this);
      north.addActionListener(this);
      east.addActionListener(this);
      west.addActionListener(this);
      up.addActionListener(this);
      down.addActionListener(this);
      startGame.addActionListener(this);
      whichWindow = \"startWindow\";
 
      //skal senere håndteres af (\"ImageHandler.initialize();\")...
      back = getImage(getDocumentBase(),\"back.gif\");
  }
 
  //Håndterer bruger-interaktion mht.:[knapper + ?]
  public void actionPerformed(ActionEvent ae) {
      String str = ae.getActionCommand();
      if(str.equals(\"NORD\")) {
        if(testIfActionLegal(ae)) {
            location = location.getFw();
        }
      }
      else if(str.equals(\"SYD\")) {
        if(testIfActionLegal(ae)) {
            location = location.getBw();
        }
      }
      else if(str.equals(\"ØST\")) {
        if(testIfActionLegal(ae)) {
            location = location.getRight();
        }
      }
      else if(str.equals(\"VEST\")) {
        if(testIfActionLegal(ae)) {
            location = location.getLeft();
        }
      }
      else if(str.equals(\"TRAPPE-OP\")) {
        if(testIfActionLegal(ae)) {
            location = location.getUp();
        }
      }
      else if(str.equals(\"TRAPPE-NED\")) {
        if(testIfActionLegal(ae)) {
            location = location.getDown();
        }
      }
      else if(ae.getSource() == startGame) {
        cardLayout.show(gamePanel, \"LUC 2001 - The Game\");
        whichWindow = \"gameWindow\";
        setFont(gameFont);
      }
      repaint();
  }
 
  //test om retning crasher og return true/false
  public boolean testIfActionLegal(ActionEvent ae) {
      String s = ae.getActionCommand();
      boolean output = false;
      if(
          (s.equals(\"NORD\")&&((location.getFw())!=null)) ||
          (s.equals(\"SYD\")&&((location.getBw())!=null))  ||
          (s.equals(\"ØST\")&&((location.getRight())!=null)) ||
          (s.equals(\"VEST\")&&((location.getLeft())!=null)) ||
          (s.equals(\"TRAPPE-NED\")&&((location.getDown())!=null)) ||
          (s.equals(\"TRAPPE-OP\")&&((location.getUp())!=null))
        ) { output = true; }
      return output;     
  }
 
  public String getDirectionInfo() {
      String s = \"\";
      if(location.getFw() != null)
        s += (\"Der er en dør imod nord. \");
      if(location.getBw() != null)
        s += (\"Der er en dør imod syd. \");
      if(location.getLeft() != null)
        s += (\"Der er en dør imod vest. \");
      if(location.getRight() != null)
        s += (\"Der er en dør imod øst. \");
      if(location.getUp() != null)
        s += (\"Der er en trappe der leder op. \");
      if(location.getDown() != null)
        s += (\"Der er en trappe der leder ned. \");
      return s;
  }
 
  public void paint(Graphics g) {
      if(whichWindow.equals(\"gameWindow\")) {
        g.drawImage(back,2,48,this);
        g.drawString(getDirectionInfo(), 4, 100);
      }
  }

}
Avatar billede erk Nybegynder
03. august 2001 - 14:13 #8
HA - problemet har hele tiden været at de panels jeg har ligger OVENPÅ min grafik såsom billeder og tekststrenge, idet jeg anvender setLayout(null), og X.setBounds(...) - hvordan får jeg billeder og tekst til at ligge ØVERST oven på mine panels? - det er det jeg vil vide!
Avatar billede anjensen1 Novice
04. august 2001 - 11:41 #9
Hej
Drop dit kald af setLayout(null). Det tømmer dine paneler. Jeg tror ikke det dækker din grafik det er bare tomt!
Iøvrigt er det forkert at show ikke kan bruges (iøvrigt deprecated der sskal bruges setvisible(true) nu )
Her er udklip fra ref:

For Java.awt.Component:
setVisible
public void setVisible(boolean b)
Shows or hides this component depending on the value of parameter b.
Parameters:
b - If true, shows this component; otherwise, hides this component.
Since:
JDK1.1
See Also:
isVisible()

--------------------------------------------------
show
public void show()
Deprecated. As of JDK version 1.1, replaced by setVisible(boolean).

Du kan altså kalde show() men bedre setVisible(true) på enhver component, også et panel med cardlayout.
mvh.
Avatar billede erk Nybegynder
06. august 2001 - 19:44 #10
Jeg har selv fundet ud af det hele.......
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