Denna övning handlar om arv och hur man använder klasser av Javas API.
Magnus Myreen, oktober 2016.
Övningen kommer med två filer:
Main.java
: ett grafiskt användargränssnitt för en kalkylatorCalc.java
: en fungerande kalkylator (behöver inte läsas eller editeras)Kör programmet med att köra main
i Main.java
.
Uppgiften ber dig skriva klasser som ska vara i nya filer CrazyButton.java
och RandomColor.java
. Se nedan.
När programmet körs ser det ut så här:
Din uppgift är att skriva en ny klass som heter CrazyButton
, som får alla knappar att vara mera intressanta. I den här uppgiften börjar vi med att göra dem lite röda:
Du ska alltså skriva en klass CrazyButton
. Den ska ärva JButton
, dvs du ska börja filen med följande. Här betyder texten extends
att din klass CrazyButton
kommer på alla sätt vara en JButton
förutom där du överskuggar metoderna som finns i JButton
.
import java.awt.*;
import java.awt.event.*;
import javax.swing.*;
public class CrazyButton extends JButton {
public CrazyButton(String name) {
super(name);
...
För att få knapparna att bli lite röda måste du överskugga JButton
s metod paintComponent
. Man överskuggar en JButton
metod genom att skriva en metod med samma signatur i CrazyButton
. Börja din kod med att anropa super.paintComponent(g);
så att JButton
s version av denna metod körs först.
För att testa ditt program bör du byta följande rad i Main.java
.
JButton b = new JButton(name);
Till följande:
JButton b = new CrazyButton(name);
Ni ser att CrazyButton
kan typkonverteras till en JButton
utan problem!
Det skulle vara roligare om alla knappar hade slumpmässig färg.
Din uppgift är att skapa en ny klass RandomColor
som ärver Color
. Din klass ska ha en konstruktor som inte tar parametrar och som genast anropar Color
s konstruktor med super
som nedan. Använd Random
här.
public RandomColor() {
super( ..., ... , ... );
}
Skapa en ny instans av RandomColor
i din ritmetod i CrazyButton
.
Din nästa uppgift är att få texten att bli större för varje gång man klickar på en knapp. I bilden har 5
klickats många gånger.
OBS: för denna uppgift får du inte editera Main.java
; alla dina kodändringar ska vara i CrazyButton.java
.
Du måste sätta en egen lyssnare ActionListener
till CrazyButton
, göra fonten större vid klick och kalla användarens lyssnare om användaren har registretat en lyssnare. Vilken/vilka metoder bör du överskugga? Använd setFont
, new Font
, getFont
för att arbeta med fonter. Använd Google för att hitta beskrivningar om ActionListener
, JButton
mm.
Hur skulle det vara om knapparna skulle hoppa runt slumpmässigt vid varje klick? Efter användning av kalkylatorn kan det se ut så här:
Jag föreslår att ni ändrar minimalt på Main.java
och implementerar en swap
metod i CrazyButton
klassen. Denna swap
metod skulle byta det interna tillståndet mellan två knappar.
OBS: när knapparna byter plats bör deras funktionalitet ännu motsvara knapparnas text, dvs det ska ännu gå att använda kalkylatorn.