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