matsho Skrevet 29. mars 2007 Del Skrevet 29. mars 2007 Hei Jeg er student ved NTNU og skal i et datafag lage et lite spill. Jeg har begynt så smått med GUI, og da i første omgang menyen. Etter problemer med JButtons og Swing, fikk jeg tips fra eldre studenter om å ikke bruke dette, men heller lage knapper av Rectangle og deretter legge bilde på disse. Dette høres vel og bra ut, men jeg er lit usikker på hvordan jeg skal legge på bildene. Tanken er at det skal være to bilder per knapp: et bilde for når knappen er inaktiv, og et for når den er selected/pressed. Bildene hentes forøvrig fra et ImageMap. ImageMap: Klikk for å se/fjerne innholdet nedenfor package spill; import java.awt.*; import java.util.*; import javax.swing.*; public class ImageMap { private Image backGround = loadImage("knapper/backGround.jpg"); //Inaktivt bilde til knappene private Image newGameIn = loadImage("knapper/newGameIn.jpg"); private Image howToIn = loadImage("knapper/howToIn.jpg"); private Image highScoreIn = loadImage("knapper/highScoreIn.jpg"); private Image creditsIn = loadImage("knapper/creditsIn.jpg"); private Image exitIn = loadImage("knapper/exitIn.jpg"); //Highlightet bilde til knappene private Image newGameHigh = loadImage("knapper/newGameHigh.jpg"); private Image howToHigh = loadImage("knapper/howToHigh.jpg"); private Image highScoreHigh = loadImage("knapper/highScoreHigh.jpg"); private Image creditsHigh = loadImage("knapper/creditsHigh.jpg"); private Image exitHigh = loadImage("knapper/exitHigh.jpg"); private HashMap<String, Image> imageMap; private static ImageMap instance; private ImageMap(){ imageMap = new HashMap<String,Image>(); addImage("knapper/backGround.jpg"); addImage("knapper/newGameIn"); addImage("knapper/howToIn"); addImage("knapper/highScoreIn"); addImage("knapper/creditsIn"); addImage("knapper/exitIn"); addImage("knapper/newGameHigh"); addImage("knapper/howToHigh"); addImage("knapper/highScoreHigh"); addImage("knapper/creditsHigh"); addImage("knapper/exitHigh"); } public static ImageMap getInstance(){ if(instance == null) instance = new ImageMap(); return instance; } private Image loadImage(String fileName){ return new ImageIcon(getClass().getResource(fileName)).getImage(); } public void addImage(String basename){ imageMap.put(basename, loadImage(basename)); } public Image getImage(String desc){ if(!imageMap.containsKey(desc)) addImage(desc); return imageMap.get(desc); } } En _veldig_ ufullstendig Meny klasse. Ble litt kaos etter at jeg måtte bytte fra Swing, og dette er så langt jeg har kommet. Klikk for å se/fjerne innholdet nedenfor package spill; import java.awt.*; import java.awt.event.*; import java.util.*; import javax.swing.*; public class Meny_GUI extends JFrame implements KeyListener{ ImageMap imgMap = ImageMap.getInstance(); //Pressed bilde til knappene private int index=0; //Hver knapp får sin plass, og dermed indeks, i denne ArrayListen. //Bruker denne listen lenger ned når vi tar inn input fra tastatur. private ArrayList<Rectangle> buttonList = new ArrayList<Rectangle>(); public Meny_GUI(){ super("JJump"); setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); setLayout(new GridLayout(0,3,0,0)); Container menuButtons = new Container(); menuButtons.setLayout(new BoxLayout(menuButtons,BoxLayout.PAGE_AXIS)); //Erstatt med Rectangle-knapper. Rectangle newGame = newButton(); Rectangle howTo = newButton(); Rectangle highScore = newButton(); Rectangle creds = newButton(); Rectangle exit = newButton(); menuButtons.add(Box.createVerticalGlue()); menuButtons.add(newGame); menuButtons.add(howTo); menuButtons.add(highScore); menuButtons.add(creds); menuButtons.add(exit); menuButtons.add(Box.createVerticalGlue()); add(Box.createHorizontalGlue()); add(menuButtons); add(Box.createHorizontalGlue()); setIconImage(imgMap.getImage("knapper/backGround.jpg")); // Lag eget ikon her! setPreferredSize(Toolkit.getDefaultToolkit().getScreenSize()); setVisible(true); pack(); validate(); } public void paint(Graphics g){ super.paint(g); g.drawImage(imgMap.getImage("knapper/backGround.jpg"),0,0,getWidth(),getHeight(),this); for(Rectangle rec : buttonList) { } } public static void main(String[] args) { new Meny_GUI(); } //Metode bøffa fra java.sun som lager ImageIcon. protected static ImageIcon createImageIcon(String path) { java.net.URL imgURL = Meny_GUI.class.getResource(path); if (imgURL != null) { return new ImageIcon(imgURL); } else { System.err.println("Couldn't find file: " + path); return null; } } //Metode som lager ny JButton til menyen, med ImageIcon på seg. private Rectangle newButton(){ Dimension standard = new Dimension(300,50); Rectangle button = new Rectangle(standard); buttonList.add(button); return button; } //Legg inn linker fra knappene til hver klasse de representerer her under actionPerfomed. public void keyPressed(KeyEvent e) { if(e.getKeyCode() == KeyEvent.VK_UP){ if(getIndex()==0){ buttonList.get(getIndex()).setSelected(false); setIndex(4); buttonList.get(getIndex()).setSelected(true); } else if(getIndex()!=0){ buttonList.get(getIndex()).setSelected(false); setIndex(-1); buttonList.get(getIndex()).setSelected(true); } } else if(e.getKeyCode() == KeyEvent.VK_DOWN){ if(getIndex()==4) setIndex(0); else if(getIndex()!=0) setIndex(+1); }else if(e.getKeyCode() == KeyEvent.VK_ENTER){ } } public void keyReleased(KeyEvent e) { } public void keyTyped(KeyEvent e) { } public int getIndex(){ return index; } public void setIndex(int plusmin){ this.index += plusmin; } } Så: 1. Hvordan få bilde på rektanglene? 2. Hvordan knytte KeyPressed mot dette, som antydet i koden? Og nok en gang, jeg er klar over at koden er full av feil Lenke til kommentar
zulo Skrevet 31. mars 2007 Del Skrevet 31. mars 2007 (endret) Rectangle er ingen Component så den kan ikke addes på den måten til swing containere. Jeg foreslår at du lager din egen button class som extender Component eller JPanel, inneholder 2 bilder(eller 1) og tegner seg selv ettersom hvilket bilde som er aktivt. Deretter kan du bruke din egen klasse istedenfor Rectangle: MinBildeknapp newGame = newButton(); Også kan du adde newGame til en component og den vil tegne seg selv. Du kan f.eks legge til en metode i MinBildeknapp som gjør at du kan sette bildet, MinBildeknapp.setBilde(Image i). newButton metoden forandrer du da til å returnere et objekt av MinBildeknapp klassen. Hvertfall, lager du først din component klasse og får den til å fungere så blir det veldig enkelt etterpå. PS. Du bruker swing for å lage oppsettet av knappene med mellomrom osv derfor må du extende component i spesialknappklassen din, du kan jo også lage din egen klasse som extender jpanel og tegner seg selv og håndterer alt av posisjoner. Da trenger du bare å ha Image objekter i spesialklassen din og kan tegne de ut som du vil selv. Men det er vel enklest å bruke swing når du er i gang alt. public class MinKnapp extends Component { Image image; public MinKnapp(){ } public void paint(Graphics g){ super.paint(g); g.fillRect(10,10,20,20); //g.drawImage(0,0,image,null); } public void setImage(Image i){ image = i; } } Endret 1. april 2007 av Patience Lenke til kommentar
Patience Skrevet 1. april 2007 Del Skrevet 1. april 2007 !!! Unødvendig bruk av quote fjernet.. #3: Unødvendig quoting samt dårlig bruk av emnefeltet blir sett på som upassende, og kan bli sensurert eller endret av moderatorer. Overdrevet bruk av såkalt SMS-språk, utropstegn/spørsmålstegn osv. og forkortelser skal unngås. Et hvert forsøk på å omgå tre-ords-regelen på forumet vil også bli slått kraftig ned på. Lenke til kommentar
HV Skrevet 3. april 2007 Del Skrevet 3. april 2007 Du har jo komponenten(JButton), siden du ikke skal ha noen spesiell funksjonalitet så er det jo ikke noe vits i å finne opp hjulet på nytt. Hadde det vært noe småting så vill du sikkert heller extendet JButton istedet også. Du er bare ute etter å "skinne" den fin med bilder, da er det ButtonUI du skal overskrive. Lag din egen implementasjon og stapp den inn i UIManager. 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å