---
title: "Knapp..."
type: "forum-thread"
url: "https://www.webforum.nu/amne/java/94271-knapp"
topic: "Java"
topic_url: "https://www.webforum.nu/amne/java"
author: "hajdo"
published: "2004-01-08T18:20:02.000Z"
updated: "2004-01-11T00:50:51.000Z"
replies: 12
views: 476
page: 1
pages: 1
language: "sv-SE"
site: "webForum — webforum.nu"
rights: "Upphovsrätten till varje inlägg tillhör dess författare."
attribution: "Citera som: webForum, https://www.webforum.nu/amne/java/94271-knapp"
---

# Knapp...

## #1 — hajdo, 2004-01-08T18:20Z

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 

 :)

Permalänk: https://www.webforum.nu/p/94271

## #2 — jme, 2004-01-09T04:18Z

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

```php

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.

```php

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

}
```

Permalänk: https://www.webforum.nu/p/1245990

## #3 — hajdo, 2004-01-09T18:36Z

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

Permalänk: https://www.webforum.nu/p/1246388

## #4 — Viktor, 2004-01-09T18:43Z

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

Permalänk: https://www.webforum.nu/p/1246389

## #5 — hajdo, 2004-01-09T19:00Z

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!");

	}
}
	
	}
}

Permalänk: https://www.webforum.nu/p/1246399

## #6 — hajdo, 2004-01-09T20:21Z

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");
	
	
	
	}
}

Permalänk: https://www.webforum.nu/p/1246467

## #7 — hajdo, 2004-01-09T20:30Z

å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......
^

Permalänk: https://www.webforum.nu/p/1246477

## #8 — Viktor, 2004-01-10T00:06Z

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

Permalänk: https://www.webforum.nu/p/1246644

## #9 — hajdo, 2004-01-10T10:41Z

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

Permalänk: https://www.webforum.nu/p/1246729

## #10 — Viktor, 2004-01-10T11:05Z

```
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](http://java.sun.com/docs/books/tutorial/uiswing/mini/index.html),[Writing Applets](http://java.sun.com/docs/books/tutorial/applet/index.html) och [Creating a GUI with JFC/Swing](http://java.sun.com/docs/books/tutorial/uiswing/index.html). 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

Permalänk: https://www.webforum.nu/p/1246739

## #11 — hajdo, 2004-01-10T22:18Z

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...

Permalänk: https://www.webforum.nu/p/1247055

## #12 — jme, 2004-01-10T23:09Z

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.

```php
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:

```php
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.

Permalänk: https://www.webforum.nu/p/1247090

## #13 — hajdo, 2004-01-11T00:50Z

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.

Permalänk: https://www.webforum.nu/p/1247146

---

Tråden på webben: https://www.webforum.nu/amne/java/94271-knapp
