import java.awt.*;
import java.awt.event.*;
import javax.swing.*;
/*************************************************************
* En applikation som skriver ut en array med framslumpade tal
* Exemplifiering av kommunikation mellan metoder och klasser
* Visar även upp slumpning och iteration i Java. Anropet till
* main vid knapptryckningar är en både omständlig och felaktig
* struktur som enbart finns i lektionen för att visa metoders
* sätt att kalla på varandra. Lektionen är också en träning på
* iteration med for- och while-konstruktioner.
*
* @author Peter Mozelius
* @version 1.01
* Rapportera hittade fel till:
*mozelius@dsv.su.se
**************************************************************/
public class Lektion3 extends JFrame implements ActionListener {
final static int ARRAYSIZE = 10;
private int[] intArray;
private JButton button;
private NumberPanel np;
public Lektion3(){
super("Lektion3");
makeGUI(scramble(), ARRAYSIZE);
}//konstruktor
/**
* metod som slumpar fram en array med ARRAYSIZE st heltal
*/
public int[] scramble(){
//skapa arrayen/fältet
intArray = new int[ARRAYSIZE];
//lägg in 10 st framslumpade heltal mellan 0 - 999
for(int i = 0; i < ARRAYSIZE; i++) {
intArray[i] = (int) (Math.random() * 1000) ;
}//for
return intArray;
}//scramble
/**
* här skapas det grafiska gränsnittet
*/
public void makeGUI(int[] arr, int arrSize) {
setSize(250, 350);
getContentPane().setLayout(new BorderLayout());
button = new JButton("Tryck här för en ny talslumpning");
button.addActionListener(this);
getContentPane().add(button, BorderLayout.SOUTH);
//skapa en ny NumberPanel
np = new NumberPanel(arr, arrSize);
getContentPane().add(np, BorderLayout.CENTER );
//gör fönstret synligt och stängbart
setVisible(true);
setDefaultCloseOperation(EXIT_ON_CLOSE);
}//makeGUI
/**
* Implementationen av den händelselyssnande metoden
* från interfacet ActionListener. Här körs allt en
* gång genom ett anrop till main. Bättre kod vore med
* direkt anrop till klassens konstruktor eller en
* omstartsmetod
*/
public void actionPerformed(ActionEvent e) {
//inte särskilt stilren programmering[;=)
String[] args = new String[] {"En gång till", "snälla main"};
dispose(); // Frigör resurserna för det gamla fönstret
Lektion3.main(args); // Kör klassmetoden main som tillhör Lektion31
}//actionPerformed
public static void main(String[] args) {
Lektion3 lektion3 = new Lektion3();
for (int i = 0; i < args.length; i++) {
System.out.println("arg " + i + ": " + args[i]);
}
}
}//Lektion3
/*************************************************************
* En subklassning av JPanel som hjälper Lektion3 att skriva
* ut de framslumpade tal som skickas in i konstruktoranropet.
* Klassen innehåller även enkla exempel på användning av Javas
* klasser java.awt.Color och java.awt.Font.
*
* @author Peter Mozelius
* @version 1.01
* Rapportera hittade fel till:
*mozelius@dsv.su.se
**************************************************************/
class NumberPanel extends JPanel {
private Font myFont;
private int[] arr;
private int size;
/**
* Konstruktor som tar emot arrSize antal framslumpade tal
* samt initierar färg och form för en utskrift av talen.
*/
public NumberPanel(int[] arr, int arrSize) {
this.arr = arr;
size = arrSize;
setSize(250, 300);
setBackground(new Color(204, 204, 0));
myFont = new Font("TimesRoman", Font.BOLD, 22);
}//konstruktor
/**
* Överskuggning av den metod som ursprungligen finns
* definierad i javax.swing.JComponent. Talen skrivs
* här ut i en while-slinga med teckensnittet TimesRoman.
*/
public void paintComponent(Graphics g){
super.paintComponent(g);
g.setFont(myFont);
g.drawString(size + " stycken slumptal", 25, 25);
int i = 0;
while(i < size){
g.drawString("Tal" + i + " : " + arr[i++] , 25, 25 + i * 25 );
}
}//paintComponent
}//NumberPanel