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...
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);
}
}
}
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!
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.