fredrija Skrevet 3. mai 2007 Del Skrevet 3. mai 2007 hei. har slitt utrolig lenge med en liten detalj no. og begynner å bli tussete. så hper noen kan hjelpe meg. Deal'n er at jeg har en highscore-liste som jeg har lyst til å vise i en JPanel som er i en JFrame (tror jeg:P) dette klarer jeg ikke. den beste måten jeg har fått vist highscorelisten på er ved hjelp av JOptionPane. jeg bruker da JTextArea i JOptionPane. dette er i og for seg ganske greit, men hver gang jeg trykker på en JButton (highscore button) så kommer den opp for seg selv. jeg vil at den skal komme opp i rammen på panelet. her er koden jeg har. Meny-classen. CODE package spel; import java.awt.*; import javax.swing.*; import java.awt.event.*; /** * En klasse som viser menyen til spillet når det startes * @author Fredrik Jansen */ @SuppressWarnings("serial") public class Meny extends JFrame implements ActionListener { SGui spill; private JButton newgame; private JButton highscore; private JButton instructions; private JButton credits; private JButton exit; private Image bildet = Toolkit.getDefaultToolkit().getImage(getClass().getResource("LOGO.jpg")); private Image creds = Toolkit.getDefaultToolkit().getImage(getClass().getResource("creds.jpg")); private Image instructionsImage = Toolkit.getDefaultToolkit().getImage(getClass().getResource("instructions.jpg")); private DescriptionPanel descriptionPanel = new DescriptionPanel(); private JTextField name; private TopScore t; public Meny() { JPanel p1 = new JPanel(new GridLayout(5,0)); JPanel p2 = new JPanel(new BorderLayout()); descriptionPanel.setImageIcon(new ImageIcon(bildet)); setLayout(new BorderLayout()); add(descriptionPanel, BorderLayout.CENTER); newgame = new JButton("New Game"); highscore = new JButton("Highscore"); instructions = new JButton("Instructions"); credits = new JButton("Credits"); exit = new JButton("Exit"); name = new JTextField("Enter name"); newgame.addActionListener(this); highscore.addActionListener(this); instructions.addActionListener(this); credits.addActionListener(this); exit.addActionListener(this); p1.add(newgame); p1.add(highscore); p1.add(instructions); p1.add(credits); p1.add(exit); p2.add(name,BorderLayout.NORTH); p2.add(p1, BorderLayout.EAST); add(p2, BorderLayout.WEST); } public static void main(String args[]) { Meny ramme = new Meny(); ramme.init(); } public void init(){ t = new TopScore(); t.lesFraFil(); this.setTitle("heli"); this.setLocationRelativeTo(null); this.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); this.setSize(415, 320); this.setVisible(true); this.pack(); } public void actionPerformed(ActionEvent e) { if(e.getSource() == newgame ){ //System.out.println("starter nytt spill"); this.setVisible(false); SGui spill = new SGui(); spill.setName(name.getText()); spill.repaint(); new Thread(spill).start(); } String[] score =t.getHighscore(); String utStreng; JTextArea utOmrode; utStreng = score[0]+ "\n"+ score[1]+ "\n"+ score[2]+ "\n"+ score[3]+ "\n"+ score[4]+ "\n"+ score[5]+ "\n"+ score[6]+ "\n"+ score[7]+ "\n"+ score[8]+ "\n"+ score[9]+ "\n"; utOmrode = new JTextArea(); utOmrode.setText("Name\t\tHighscore\n"); utOmrode.append("---------\t\t----------------\n"); utOmrode.append(utStreng); utOmrode.setVisible(true); utOmrode.setEditable(false); if(e.getSource() == highscore) { JOptionPane.showMessageDialog(null, utOmrode, "Highscore", JOptionPane.PLAIN_MESSAGE); } if(e.getSource() == instructions) { // System.out.println("laster inn instructions"); descriptionPanel.setImageIcon(new ImageIcon(instructionsImage)); } if(e.getSource() == credits ) { // System.out.println("Laster inn Credits"); descriptionPanel.setImageIcon(new ImageIcon(creds)); } if(e.getSource() == exit) System.exit(0); } } DescriptionPanel-classen CODE package spel; import java.awt.BorderLayout; import javax.swing.ImageIcon; import javax.swing.JLabel; import javax.swing.JPanel; /** en klasse som lager panelet til bildet som vises * ved siden av meny knappene i rammen til menyen * * @author Fredrik Jansen * */ @SuppressWarnings("serial") public class DescriptionPanel extends JPanel { private JLabel image = new JLabel(); public DescriptionPanel() { setLayout(new BorderLayout ()); add(image, BorderLayout.NORTH); } public void setImageIcon(ImageIcon icon) { image.setIcon(icon); } } TopScore-klassen CODE package spel; import java.io.FileInputStream; import java.io.FileNotFoundException; import java.io.FileOutputStream; import java.io.ObjectInputStream; import java.io.ObjectOutputStream; import java.util.ArrayList; public class TopScore { ArrayList<Score> highscore; String filename = "Highscore.txt"; int size = 10; public TopScore(){ highscore = new ArrayList<Score>(); for(int i=0;i<size;i++) highscore.add(new Score("empty",0)); } public void addScore(Score innScore) { int s = innScore.HentPoeng(); int plassering = -1; for(int i=0;i<size;i++) { if(s>highscore.get(i).HentPoeng()) { plassering = i; break; } } if(plassering!=-1) { highscore.add(plassering, innScore); highscore.remove(size); } } public void printHighscore(){ Score p = null; for(int i=0;i<size;i++){ p=highscore.get(i); System.out.println("Navn:" + p.HentNavn() + " Score: " + p.HentPoeng()); } } //////////////////////////////// public String[] getHighscore(){ Score p = null; String[] s=new String; for(int i=0;i<size;i++){ p=highscore.get(i); s=p.HentNavn()+ "\t\t" + p.HentPoeng(); } return s; } /////////////////////////////// public void lesFraFil(){ highscore = deserialiser(); } public void serialiser(){ serialiser(filename); } public void serialiser(String filename){ try { FileOutputStream fil = new FileOutputStream(filename); ObjectOutputStream objStream = new ObjectOutputStream(fil); objStream.writeObject(highscore); } catch(Exception e) { System.out.print(e.getMessage()); } } private ArrayList<Score> deserialiser(){ return deserialiser(filename); } private ArrayList<Score> deserialiser(String filename){ ArrayList<Score> liste = new ArrayList<Score>(); try{ FileInputStream fil = new FileInputStream(filename); ObjectInputStream objectStream = new ObjectInputStream(fil); liste = (ArrayList<Score>) objectStream.readObject(); /////////////////////////////////// }catch (FileNotFoundException e){ for(int i=0;i<size;i++) highscore.add(new Score("empty",0)); serialiser(); liste=highscore; } //////////////////////////////////// catch (Exception e){ System.out.print(e.getMessage()); // for(int i=0;i<size;i++) // highscore.add(new Score("empty",0)); } return liste; } } Score-klassen CODE package spel; import java.io.Serializable; /** * En klasse som tar imot navn og poeng og leverer det tilbake som en samlet String * @author Even Stubsjøen */ @SuppressWarnings("serial") public class Score implements Serializable{ private String navn; private int poeng; public Score(String navnet, int poenget){ navn = navnet; poeng = poenget; } public String HentNavn(){ return navn; } public int HentPoeng(){ return poeng; } /** * Skriver ut brukernavn og poengsum. * @return String Samlet informasjon om highscore. */ public String toString() { return navn + " " + poeng; } } ...og SGui-klassen (Spill GUI) CODE package spel; import javax.swing.JFrame; import javax.swing.JPanel; //import Spill.Test; //import Spill.Test; import java.applet.Applet; import java.applet.AudioClip; import java.awt.Color; import java.awt.Graphics; import java.util.ArrayList; import java.util.Iterator; /** * Klasse for spelområdet, held orden på alle objekt i speleområdet, og all grafikk * Har while løkke som kjører spelet * * @author Njål Rotevatn litt */ @SuppressWarnings("serial") public class SGui extends JPanel implements Runnable{ // Graphics g2; private int hogde=600; private int bredde=800; public JFrame hovedRamme; //////////////// Brett();? private Helikopter kloss; private Vegg[] gulv; private ArrayList<Ting> folk; private Fuel bensin; // private JLabel drivstoff = new JLabel("test"); /////////////// private int opp=0; private int venstre=0; private int hogre=0; private double a = 100; private double z = 1; private boolean nykollisjon=true; private boolean nykollisjon2=true; private Styring input; private Base base; private String name; private boolean fleirefolk; AudioClip lyden; private TopScore t; /* public static void main(String[] args) { SGui spill = new SGui(); spill.rungame(); //Forskjellige TopScore tester Even /*TopScore t = new TopScore(); t.addScore(new Score("Bjarne",10)); t.addScore(new Score("Bjarne",11)); t.addScore(new Score("Bjårne",100)); t.addScore(new Score("Bjarne",10000)); t.addScore(new Score("Bjarne",11000000)); t.addScore(new Score("Bjårne",150)); t.addScore(new Score("Bjarne",1)); t.addScore(new Score("Bjarne",199999)); t.addScore(new Score("Bjårne",1120)); t.addScore(new Score("Bjårne",150)); t.addScore(new Score("Bjarne",1)); t.addScore(new Score("Bjarne",199999)); t.addScore(new Score("Bjårne",1120)); t.printHighscore(); //TopScore t = new TopScore(); //t.serialiser(); //t.lesFraFil(); //t.printHighscore(); } */ public SGui () { //TopScore t = new TopScore();//ZOOOOOOMG //t.serialiser("Highscore.txt"); ////////// Brett();? Brett(1); lyden=Applet.newAudioClip( getClass().getResource("Dmusikk.mid")); /////////// hovedRamme = new JFrame("Heli"); hovedRamme.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); hovedRamme.setSize(bredde, hogde); hovedRamme.add(this); hovedRamme.setVisible(true); hovedRamme.requestFocus(); input= new Styring(hovedRamme); fleirefolk=folk.iterator().hasNext(); } ////////// public void paint (Graphics g2) { // super.paint(g2); g2.setColor(Color.BLACK); g2.fillRect(0, 0, bredde, hogde); //Color f = new Color(123, 123, 254); //g.setColor(f); //g.fillRect(0, 0, bredde, hogde); /////////// Brett();? for (Vegg arg : gulv) { arg.paint(g2); } for (Ting arg : folk) { arg.paint(g2); } base.paint(g2); kloss.paint(g2); bensin.paint(g2); //painter Fuel/Time /////////// } /////////////// /////////////////////Spill løkka public void rungame(){ repaint(); lyden.loop(); while ((kloss.getPoeng()>-100)&& fleirefolk){ if (input.getOpp()){ opp=20; }else{ opp=0; } if (input.getVenstre()){ venstre=-10; }else{ venstre=0; } if (input.getHogre()){ hogre=10; }else{ hogre=0; } bensin = new Fuel(0, 0 ,kloss, kloss); kloss.akselrasjon((venstre+hogre),opp); for (Vegg arg : gulv) { if (arg.intersects(kloss)) { System.out.println("kollisjon"); kollisjon(arg); }else if (arg.intersects(kloss.helikopterfot)&& kloss.landingsFart()){ System.out.println("landing"); kloss.stopp(); Iterator<Ting> iter = folk.iterator(); repaint(); sov(300); while (iter.hasNext()){ if (kloss.intersects(iter.next())&& !kloss.isfull()){ iter.remove(); kloss.setFull(true); ///kloss.addVind(1);///////////////// } } if (kloss.intersects(base)){ if (kloss.isfull()){ kloss.addPoeng((int)kloss.GetFuel()); kloss.setFull(false); fleirefolk=folk.iterator().hasNext(); } kloss.fyllBensin(); } repaint(); sov(300); while (!input.getOpp()&& fleirefolk){ sov(50); if(kloss.GetFuel()<=0){ fleirefolk=false; break; } } if(!(kloss.GetFuel()<0)) kloss.setFartY(-kloss.GetLandingsfart()); }else{ } } repaint(); sov(40); } //////////////////////////////////////////////// Skrive til poeng ///////////// lyden.stop(); t = new TopScore(); t.lesFraFil(); t.addScore(new Score(name,kloss.getPoeng())); t.serialiser(); Meny m =new Meny(); m.init(); this.hovedRamme.dispose(); //////////////////////////////////////////////// } ///////////////////////////////// /** * Metode som får helikoptertet til å hoppe ved kollisjon * * * @author Njål Rotevatn */ private void kollisjon(Vegg arg){ while (arg.intersects(kloss)){ if (nykollisjon && arg.intersects(kloss)){ // kloss.reduceSpeed(0.7); kloss.invYfart(); // kloss.Yflytt(); kloss.Yflytt(); nykollisjon=false; }else if((!nykollisjon && arg.intersects(kloss) && nykollisjon2)){ kloss.invXfart(); kloss.Xflytt(); kloss.invYfart(); kloss.Yflytt(); nykollisjon2=false; }else if((!nykollisjon2 && arg.intersects(kloss))){ kloss.invYfart(); kloss.Yflytt(); }else{ } } nykollisjon=true; nykollisjon2=true; if ((kloss.GetTotalfart()>20)){ kloss.addPoeng((int)(-1*(kloss.GetTotalfart()-20))); } kloss.reduceSpeed(0.5); } private void sov(int arg) { try { Thread.sleep(arg); } catch (Exception e) { } } private void Brett(int arg){ //legg inn Vegg ol // gulv int[][] xArray={{0, 30, 770, 780 , 800}, {0, 800},{0,1},{800,799},{300,500,450,350}}; int[][] yArray={{600, 500, 500, 300, 600},{0, 1},{0,600},{0,600},{300,300,350,350}}; gulv= new Vegg[xArray.length]; for (int i = 0; i < xArray.length; i++) { gulv =new Vegg(xArray,yArray); } /////////////// Ting og redde osb. int[][] folkepos={{200, 480},{300, 280},{600, 480}}; folk= new ArrayList<Ting>(); for (int i = 0; i < folkepos.length; i++) { folk.add(new Ting(folkepos[0],folkepos[1])); } //////////// base= new Base(100, 483); // gulv[0] =new Vegg(new int[] {0, 30, 770, 780 , 800},new int[] {0, 30, 770, 780 , 800}); kloss =new Helikopter(base.x, base.y-6, a, z); bensin = new Fuel(0, 0 ,kloss, kloss); // kloss =new Helikopter(1, 1, a, z); } public void run() { // TODO Auto-generated method stub // main2(); System.out.println("runs"); rungame(); } public String getName() { return name; } public void setName(String name) { this.name = name; } } håper noen kan hjelpe meg her. vet det er veldig mye å se igjennom, men vet ikke om alt er nødvendig å se igjennom for dere flinke men jeg la no til det jeg trodde var rellevant for å kunne hjepe meg. hilsen en meget dårlig java-programmerer Lenke til kommentar
JAPCU Skrevet 3. mai 2007 Del Skrevet 3. mai 2007 (endret) Får opp feilmeldning når jeg prøver det. Bla. mangler klassen "helikopter" i "SGui". Orker ikke å sette meg inn i koden din. Håper dette hjelper: Det er riktig at du skal sette JTextArea i en JPanel eller JFrame. EDIT: Det er opp til deg hva du ønsker. JPanels bruker når du skal skille deler av GUI-et fra hverandre. F.eks. om du hadde programmert MSPaint ville du kanskje ha 3 paneler. 1 for verktøy. 1 for farger. Og 1 for selve tegneområdet. Du kan skille ting frahverandre med "Layouts". Se java APIen under JFrame.setLayout. For å skille komponenter fra hverandre kan du bruke borders og dummy komponenter. En JFrame er selve vinduet. Dette må du ha. Så kan du legge til alle komponenter du vil ha i vinduet med: vinduetsNavn.add( komponent ) F.eks. import java.awt.*; import javax.swing.*; public class TestFrame { public static void main(String args[]) { TestFrame nyttProgram = new TestFrame(); } public TestFrame() { JFrame mittVindu = new JFrame("dette er en JFrame"); mittVindu.setLayout(new FlowLayout()); JButton knapp = new JButton("en knapp.."); mittVindu.add( knapp ); JPanel mittPanel = new JPanel(); JLabel enMerkelapp = new JLabel("jeg er enmerkelapp inni et panel som igjen er inni en frame"); mittPanel.setBorder(BorderFactory.createLineBorder(Color.BLACK)); // jeg gir panelet en ramme. mittPanel.add( enMerkelapp); mittVindu.add(mittPanel); // legg til panelet i vinduet. mittVindu.pack(); // tilpass vinduet til komponentene inni mittVindu.setVisible(true); } } Endret 3. mai 2007 av JAPCU Lenke til kommentar
fredrija Skrevet 3. mai 2007 Forfatter Del Skrevet 3. mai 2007 ok. skjønte dette no. men siden jeg da skal ha utskriften av highscore listen inni descriptionPanel hvordan skal jeg da gjøre d. det går jo ikke an å skrive: descriptionPanel.add(JOptionPane.showMessageDialog(null, utOmrode, "Highscore", JOptionPane.PLAIN_MESSAGE)); finner ingen måte å gjøre dette på må jeg gjøre alt dette i DescriptionPanel-klassen? Lenke til kommentar
gunnard Skrevet 4. mai 2007 Del Skrevet 4. mai 2007 Hva med å bare legge descriptionPanel inni en ny JPanel x (som har FlowLayout som standard) og skrive x.add(<JPanel/Component av highscore>) når du vil at den skal vises, x.remove(<JPanel/Component av highscore>) når den skal fjernes? Husk å pack() (JFramet).. Lenke til kommentar
v3g4rd Skrevet 5. mai 2007 Del Skrevet 5. mai 2007 Hva med å bare legge descriptionPanel inni en ny JPanel x (som har FlowLayout som standard) og skrive x.add(<JPanel/Component av highscore>) når du vil at den skal vises, x.remove(<JPanel/Component av highscore>) når den skal fjernes? Husk å pack() (JFramet).. 8540010[/snapback] Du må vel også kjøre en doLayout() for at denne skal fungere? Lenke til kommentar
gunnard Skrevet 5. mai 2007 Del Skrevet 5. mai 2007 Kan hende noe ekstra må til ja.. Det er jo lett å sjekke for han dersom han prøver det ut.. Tror validate() er å foretrekke fremfor doLayout() (validate() vil kalle doLayout() i tillegg til å gjøre litt mer tror jeg).. Lenke til kommentar
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å