webForumDet fria alternativet

Knapp...

12 svar · 470 visningar · startad av hajdo

hajdoMedlem sedan nov. 2003169 inlägg
#1

Som sagt, jag är helt nybörjare på java och har inte kommit så här långt än. Jag undrar hur man gör en snygg knapp som det står "Play" på. Efter att man tryckt på den så sk man komma in i spelet som jag ska göra... Men hur gör man en knapp :q

:)

jmeMedlem sedan maj 20012 237 inlägg
#2

Vill du anvämda dig utav Swing så gör du en knapp enkelt genom:


JButton knapp = new JButton("En kenkel knapp");

Nu har du endast en knapp. För att kunna koppla en händelse till knappen kan du använda interfacet ActionListener.

Jag hostar fram ett snabbt exempel med endast väsentlig kod för knappen. Du får själv lägga till det i ett fönster.


import java.awt.*;
import java.awt.event.*; // här finns bl a ActionListener
import javax.swing.*; // om du vill använda JButton

// här kopplas en händelselyssnare till knappen

button.addActionListener(this);

// denna metod måste du implementera från interfacet //ActionListener

public void actionPerformed(ActionEvent e);
{
   JButton src = (JButton) e.getSource();
   
   if(src.equals(button) )
   {
       // detta skrivs i konsollen om du trycker på knappen
       System.out.println("Du tryckte just på en knapp!");
       
   }

}
hajdoMedlem sedan nov. 2003169 inlägg
#3

Jag få fram flera felmeddelanden:

Game.Java:5: (Identifier) expected
import.Java.awt.Event.ActionListener;
_____^

Och så vidare... Vad gör jag?

import javax.swing.JApplet;
import java.awt.Graphics;
import.java.awt.Event.ActionListener;
import.java.art.swing.JButton;
import java.awt.Color;
import java.awt.Font;
import java.awt.FontMetrics;
import javax.swing.ImageIcon;

public class Game extends JApplet
{
public void init()
{
setSize(700,500); //Storlek på fönstret
setBackground(new Color(50,83,85)); //Bakrundsfärg
}

public void paint (Graphics g)
{
g.setFont(new Font("Mistral", Font.PLAIN, 60)); //Textstil och textstorlek

String str = "TANK-GAME"; //Text
FontMetrics fm = g.getFontMetrics(); //I mitten
int hPos = ( getWidth() - fm.stringWidth(str) ) / 2;

g.drawString(str, hPos, 80); //Vet inte

ImageIcon image = new ImageIcon( getClass().getResource( "tank.gif" ) );

int HPos = ( getWidth() - image.getIconWidth() ) / 2;
int VPos = ( getHeight() - image.getIconHeight() ) / 2;

g.drawImage( image.getImage(), HPos, VPos, null );

button.addActionListener(this);

public void actionPerformed(ActionEvent e);
{
JButton src = (JButton) e.getSource();

  if(src.equals(button) )

{
System.out.println("Spelet är under konstruktion!");

}
}

}
}

ViktorMedlem sedan aug. 20021 752 inlägg
#4

ta bort punkten som finns mellan import och java
ändra

import.java.awt.Event.ActionListener;
import.java.art.swing.JButton;

till

import java.awt.Event.ActionListener;
import java.art.swing.JButton;

/Viktor

hajdoMedlem sedan nov. 2003169 inlägg
#5

Det funkar endå inte:

import javax.swing.JApplet;
import java.awt.Graphics;
import.java.awt.Event.ActionListener;
import.java.art.swing.JButton;
import java.awt.Color;
import java.awt.Font;
import java.awt.FontMetrics;
import javax.swing.ImageIcon;

public class Game extends JApplet
{
public void init()
{
setSize(700,500); //Storlek på fönstret
setBackground(new Color(50,83,85)); //Bakrundsfärg
}

public void paint (Graphics g)
{
	g.setFont(new Font("Mistral", Font.PLAIN, 60));		//Textstil och textstorlek
	
String str = "TANK-GAME";		//Text
FontMetrics fm = g.getFontMetrics();		//I mitten
int hPos = ( getWidth() - fm.stringWidth(str) ) / 2;		

g.drawString(str, hPos, 80);		//Vet inte

ImageIcon image = new ImageIcon( getClass().getResource( "tank.gif" ) );

int HPos = ( getWidth() - image.getIconWidth() ) / 2;
int VPos = ( getHeight() - image.getIconHeight() ) / 2;

g.drawImage( image.getImage(), HPos, VPos, null );

button.addActionListener(this);

public void actionPerformed(ActionEvent e);
{
	JButton src = (JButton) e.getSource();
	
	if(src.equals(button) )
{
	System.out.println("Spelet är under konstruktion!");

}

}

}

}

hajdoMedlem sedan nov. 2003169 inlägg
#6

Jag testade att ta bort ActionListener och bara ha knappen, då gick det att kompilera men ingen knapp syns i appleten, åhh, det e så jobbigt...

import javax.swing.JApplet;
import java.awt.Graphics;
import java.awt.Color;
import java.awt.Font;
import java.awt.FontMetrics;
import javax.swing.ImageIcon;
import javax.swing.JButton;

public class Game extends JApplet
{
public void init()
{
setSize(700,500); //Storlek på fönstret
setBackground(new Color(50,83,85)); //Bakrundsfärg
}

public void paint (Graphics g)
{
	g.setFont(new Font("Mistral", Font.PLAIN, 60));		//Textstil och textstorlek
	
String str = "TANK-GAME";		//Text
FontMetrics fm = g.getFontMetrics();		//I mitten
int hPos = ( getWidth() - fm.stringWidth(str) ) / 2;		

g.drawString(str, hPos, 80);		//Vet inte

ImageIcon image = new ImageIcon( getClass().getResource( "tank.gif" ) );

int HPos = ( getWidth() - image.getIconWidth() ) / 2;
int VPos = ( getHeight() - image.getIconHeight() ) / 2;

g.drawImage( image.getImage(), HPos, VPos, null );

JButton knapp = new JButton("Start Game");



}

}

hajdoMedlem sedan nov. 2003169 inlägg
#7

åhh, jag såg vad som var fel i början, nu är det nästan fixat. Det är bara ett felmeddelande kvar, illegal start of expression

public void ActionPerformed......
^

ViktorMedlem sedan aug. 20021 752 inlägg
#8

Det låter som att du har glömt ett { innan eller så har du skrivit funktionen utanför klassen. Men med så lite kod så är det väldigt svårt att säga exakt vad det är som är fel.

Sen så om du med ActionPerformed menar den funktion som är definierad i interfacet ActionListener så ska den börja med liten bokstav. Standarden för Java är att klasser börjar med stor bokstav medans funktioner och variabler börjar med liten bokstav.

/Viktor

hajdoMedlem sedan nov. 2003169 inlägg
#9

Kan du inte skriva om denna kod till den rätta?

import javax.swing.JApplet;
import java.awt.Graphics;
import java.awt.Event.ActionListener;
import java.art.swing.JButton;
import java.awt.Color;
import java.awt.Font;
import java.awt.FontMetrics;
import javax.swing.ImageIcon;

public class Game extends JApplet
{
public void init()
{
setSize(700,500); //Storlek på fönstret
setBackground(new Color(50,83,85)); //Bakrundsfärg
}

public void paint (Graphics g)
{
g.setFont(new Font("Mistral", Font.PLAIN, 60)); //Textstil och textstorlek

String str = "TANK-GAME"; //Text
FontMetrics fm = g.getFontMetrics(); //I mitten
int hPos = ( getWidth() - fm.stringWidth(str) ) / 2;

g.drawString(str, hPos, 80); //Vet inte

ImageIcon image = new ImageIcon( getClass().getResource( "tank.gif" ) );

int HPos = ( getWidth() - image.getIconWidth() ) / 2;
int VPos = ( getHeight() - image.getIconHeight() ) / 2;

g.drawImage( image.getImage(), HPos, VPos, null );
}

public void actionPerformed(ActionEvent e);
{
JButton knapp = new JButton("Start Game");

button.addActionListener(this);

JButton src = (JButton) e.getSource();

if(src.equals(button) )
{
System.out.println("Spelet är under konstruktion!");

}
}

}
}

ViktorMedlem sedan aug. 20021 752 inlägg
#10
import java.awt.Event.ActionListener;

Finns inget paket med detta namn, som jag sa i min förra post så är standarden för Java att bara klasser börjar med stor bokstav, därför kan man direkt säga att Event inte ska göra det eftersom det inte är en klass :) Det ska altså vara

import java.awt.event.ActionListener;
import java.art.swing.JButton;

finns inget paket med detta namn, det är javax.swing.JButton

public void actionPerformed(ActionEvent e);

; på slutet av raden ska bort.

button.addActionListener(this);

Du försöker anroppa en funktion hos ett objekt som inte finns, menar du kanske

knapp.addActionListener(this);

?

Sen har du plaserat koden på fel plats. Koden som ligger i actionPerformed anroppas när en knapp har tryckts och som du har skrivit nu så blir det så att när användaren har tryckt på en knapp så skapas den, lite moment 22 :)

Sen har du inte implementerat interfacet ActionListener. Det maste du gora for att kunna anvanda funktionen actionPerformed som den ar tankt.

För en riktigt bra förklaring om hur och var du ska lägga koden för knappar och hur du plaserar knappar i en applet så rekomenderar jag att du först läser User Interfaces that Swing: A Quick Start Guide,Writing Applets och Creating a GUI with JFC/Swing. I Java ar det tyvarr inte bara att lagga in en knapp utan man maste lagga den i en layout manager osv.

(mitt under skrivningen av detta inlagg bytte tangentbordet till engelska, darfor saknas aao i slutet :) )

/Viktor

hajdoMedlem sedan nov. 2003169 inlägg
#11

Jag gjorde som du sa fast det funkar endå inte, kan inte nån skriva om koden så att den blir rätt? asså skriv hela koden...

jmeMedlem sedan maj 20012 237 inlägg
#12

hajdo:

Jag tycker att du ska ta och köpa dig en bra bok om Java. Jag rekommenderar Wrox böcker( https://www.wrox.com). Tycker själv att de är bra.

Hittade följande nyss:

http://oopweb.com/Java/Documents/ThinkingInJava/VolumeFrames.html?/Java/Documents/ThinkingInJava/Volume/AppendixC.html

Innan du börjar göra mer avancerade grejer bör du lära dig grunderna i Java och i OOP (objektorienterad programmering).

Lär dig hur en klass fungerar, hur du använder interface, hur du ärver osv. Känn till vad variable scope betyder. Börja med enkla exempel. Du kan inte göra ett spel andra dagen.

Börja inte med grafiska saker utan håll dig till konsoll-program så kan du koncentrera dig bättre på grunderna.

Lär dig använda Java's api doc:

http://java.sun.com/j2se/1.4.2/docs/api/

Den kommer att vara väl till hands när du utvecklar dina program.

Vi hjälper dig gärna men försöker vi nu förklara för dig hur man gör an java-applet så blir det nog för mycket för dig (och åt oss också).

https://www.java.sun.com har utmärkta tutorials som du kan följa.

http://java.sun.com/learning/tutorial/index.html

Några tips:

Objekt som skapas inuti metoder syns bara i just den metoden.

Vill du att en variabel skall vara åtkomlig för hela klassen och kanske även för andra klasser så måste du deklarera dem som klass-variablar.

public class Klass
{
    int tal;    // klass-variabel, synlig för hela klassen
    
    public Klass()
    {
        tal = 10;
    }
    
    public void metod()
    {
        int tal2 = 10;  // synligt enbart för metoden metod()
        int tal = 15;   // inte samma som klass-variabeln!!!
    }
}

Sen laddar du in bilden i paint() metoden. Kom ihåg att inladdning av bilder kan vara tids-krävande och eftersom paint() metoden anropas då nåt behövs uppdateras(vilket händer ofta i spel) så blir det mycket overhead i och med att man måste ladda in bilden igen varje gång.

Varför inte ladda in bilden en gång istället?

Lägg in den raden i init() metoden istället. Kom dock ihåg att göra ImageIcon-objektet åtkomligt får paint() metoden genom att den i början av klassen:

public class Game extends JApplet
{
    // här deklarerar du alla klass-variablar
    
    ImageIcon image;
    
    public void init()
    {
        ...
        
    }

I den nyare versionen av den kod som du publicerat så har du en knapp med namnet button i koden, men jag ser inte att du har deklarerat den nånstans. Det måste du göra innan du kan använda den.

Du har:

button.addActionListener(this); // denna rad lägger du in init() metoden efter att ha deklarerat samt initierat knappen(button).

men du har inte:

JButton button;
button = new JButton("knapp"); // lägg denna i init() metoden.

Med nyckelordet new skapar du en instans av en viss klass.

Sen har du sen System.out.println() sats i actionPerformed() metoden.

System.out.println() skriver ut text endast i konsollen och inte i en applet. Denna förfarande kan vara tillhands då man debuggar sin kod. Då ser man texten antingen i webläsarens Java-konsoll eller i konsollen som startas med javac.

hajdoMedlem sedan nov. 2003169 inlägg
#13

Jag har en bok om java som just wrox har skrivit. Jag har kommit till kapitel 3 och en halv. Mitt spel ska inte vara världens svåraste utan en väldigt enkel verision 1.0. All hjälp har varit jättebra och jag fortsätter läsa i boken med hårdstudering och kommer åter i forumet efter ett tag.

141 ms totalt · 3 externa anrop · v20260731065814-full.3ab8d573
0 ms — hämta forumlista (cache)
0 ms — hämta statistik (cache)
138 ms — hämta tråd, inlägg och bilagor (db)