Code:
package Fenster;
import java.awt.Color;
import java.awt.Font;
import java.awt.Toolkit;
import java.awt.event.MouseEvent;
import java.awt.event.MouseListener;
import java.awt.event.WindowAdapter;
import java.awt.event.WindowEvent;
import java.util.Random;
import javax.swing.BorderFactory;
import javax.swing.JButton;
import javax.swing.JFrame;
import javax.swing.JLabel;
import javax.swing.JOptionPane;
import javax.swing.JPanel;
import javax.swing.JTextField;
public class Fenster implements MouseListener{
//globale Konstanten
final static int FENSTERBREITE=800;
final static int FENSTERHOEHE=700;
JFrame jframe;
JPanel jp=new JPanel();
JPanel jp_hauptpanel=new JPanel();
JPanel jp_dimension=new JPanel();
JPanel jp_zeit=new JPanel();
JPanel jp_zufall=new JPanel();
JPanel jp_spielfeld=new JPanel();
JButton[][] jb_matrix;
JButton jb_dim=new JButton("Ok");
JButton jb_zeit=new JButton("Ok");
JButton jb_zufall=new JButton("Ok");
JButton jb_start=new JButton("Start");
JButton jb_neu=new JButton("Neu");
JTextField jt_x=new JTextField("10");
JTextField jt_y=new JTextField("10");
JTextField jt_zeit=new JTextField("500");
JTextField jt_zufall=new JTextField("20");
JLabel jl_dim=new JLabel("Spielfelddimension");
JLabel jl_zeit=new JLabel("Zeit");
JLabel jl_milli=new JLabel("Millisekunden");
JLabel jl_zeilen=new JLabel("Anzahl Zeilen");
JLabel jl_spalten=new JLabel("Anzahl Spalten");
JLabel jl_zufall=new JLabel("Belegung per Zufall");
JLabel jl_wieviel_felder=new JLabel("Wieviele Felder");
JLabel jl_zyklus=new JLabel("Zyklus :");
JLabel jl_zyklus1=new JLabel("0");
boolean start=false, neu=false;
int zeilen=10; int spalten=10;
int milli=500;
Color color;
boolean [][] matrix;
public Fenster(){
jframe=new JFrame("Game of Life");
JFrame.setDefaultLookAndFeelDecorated(true);
jframe.pack();
jframe.setDefaultCloseOperation(JFrame.DISPOSE_ON_CLOSE);
jframe.setBounds(Toolkit.getDefaultToolkit().getScreenSize().width/2 - FENSTERBREITE/2,
Toolkit.getDefaultToolkit().getScreenSize().height/2-FENSTERHOEHE/2,
FENSTERBREITE, FENSTERHOEHE);
jframe.setResizable(false);
//Listener fuer Window- und key_events hinzufuegen
jframe.addWindowListener(new WindowClosingAdapter());
jframe.setLayout(new java.awt.GridLayout(1, 1));
Font font=new Font("Arial",Font.PLAIN,10);
jb_matrix=new JButton[zeilen][spalten];
matrix=new boolean[zeilen][spalten];
for(int i=0;i<zeilen;i++)
for(int j=0;j<spalten;j++){
matrix[i][j]=false;
jb_matrix[i][j]=new JButton();
jb_matrix[i][j].addMouseListener(this);
jb_matrix[i][j].setFocusable(false);
}
color=jb_matrix[0][0].getBackground();
jp_spielfeld=new JPanel();
jp_spielfeld.setBounds(5, 5, 600, 600);
jp_spielfeld.setLayout(new java.awt.GridLayout(zeilen, spalten));
jp_spielfeld.setBorder(BorderFactory.createLineBorder( Color.black ));
for(int i=0;i<zeilen;i++)
for(int j=0;j<spalten;j++){
jp_spielfeld.add(jb_matrix[i][j]);
}
jl_dim.setBounds(3, 3, 100, 20);
jl_dim.setFont(font);
jl_zeilen.setBounds(3, 30, 90, 20);
jl_zeilen.setFont(font);
jt_x.setBounds(95, 30, 50, 20);
jt_x.setHorizontalAlignment(JTextField.RIGHT);
jt_x.setFont(font);
jl_spalten.setBounds(3, 55, 90, 20);
jl_spalten.setFont(font);
jt_y.setBounds(95, 55, 50, 20);
jt_y.setHorizontalAlignment(JTextField.RIGHT);
jt_y.setFont(font);
jb_dim.setBounds(95, 90,50,20);
jb_dim.setFont(font);
jb_dim.addMouseListener(this);
jp_dimension.setLayout(null);
jp_dimension.setBounds(620, 5,150,130);
jp_dimension.setBorder(BorderFactory.createLineBorder( Color.black ));
jp_dimension.add(jl_dim);
jp_dimension.add(jl_zeilen);
jp_dimension.add(jt_x);
jp_dimension.add(jl_spalten);
jp_dimension.add(jt_y);
jp_dimension.add(jb_dim);
jl_zufall.setBounds(3, 3, 100, 20);
jl_zufall.setFont(font);
jl_wieviel_felder.setBounds(3, 30, 90, 20);
jl_wieviel_felder.setFont(font);
jt_zufall.setBounds(95, 30, 50, 20);
jt_zufall.setHorizontalAlignment(JTextField.RIGHT);
jt_zufall.setFont(font);
jb_zufall.setBounds(95, 60,50,20);
jb_zufall.setFont(font);
jb_zufall.addMouseListener(this);
jp_zufall.setLayout(null);
jp_zufall.setBounds(620, 140,150,100);
jp_zufall.setBorder(BorderFactory.createLineBorder( Color.black ));
jp_zufall.add(jl_zufall);
jp_zufall.add(jl_wieviel_felder);
jp_zufall.add(jt_zufall);
jp_zufall.add(jb_zufall);
jl_zeit.setBounds(3, 3, 100, 20);
jl_zeit.setFont(font);
jl_milli.setBounds(3, 30, 90, 20);
jl_milli.setFont(font);
jt_zeit.setBounds(95, 30, 50, 20);
jt_zeit.setHorizontalAlignment(JTextField.RIGHT);
jt_zeit.setFont(font);
jb_zeit.setBounds(95, 60,50,20);
jb_zeit.setFont(font);
jb_zeit.addMouseListener(this);
jp_zeit.setLayout(null);
jp_zeit.setBounds(620, 245,150,100);
jp_zeit.setBorder(BorderFactory.createLineBorder( Color.black ));
jp_zeit.add(jl_zeit);
jp_zeit.add(jl_milli);
jp_zeit.add(jt_zeit);
jp_zeit.add(jb_zeit);
font=new Font("Arial",Font.BOLD,20);
jb_neu.setBounds(650, 510,100,40);
jb_neu.setFont(font);
jb_neu.addMouseListener(this);
jb_start.setBounds(650, 560,100,40);
jb_start.setFont(font);
jb_start.addMouseListener(this);
jl_zyklus.setBounds(200, 620, 90, 30);
jl_zyklus.setFont(font);
jl_zyklus1.setBounds(295, 620, 50, 30);
jl_zyklus1.setHorizontalAlignment(JLabel.RIGHT);
jl_zyklus1.setFont(font);
jp_hauptpanel.setLayout(null);
jp_hauptpanel.setBounds(5, 5,590,590);
jp_hauptpanel.setBorder(BorderFactory.createLineBorder( Color.black ));
jp_hauptpanel.add(jp_spielfeld);
jp_hauptpanel.add(jp_dimension);
jp_hauptpanel.add(jp_zufall);
jp_hauptpanel.add(jp_zeit);
jp_hauptpanel.add(jb_neu);
jp_hauptpanel.add(jb_start);
jp_hauptpanel.add(jl_zyklus);
jp_hauptpanel.add(jl_zyklus1);
jframe.add(jp_hauptpanel);
jframe.setVisible(true);
}
void set_zufallsfelder() {
try {
Random zufall=new Random();
int anzahl=Integer.parseInt(jt_zufall.getText());
if(anzahl>zeilen*spalten/2)throw new MehrRandomFelderalsMatrixfelder();
for(int i=0;i<zeilen;i++)
for(int j=0;j<spalten;j++)
matrix[i][j]=false;
for(int i=0;i<anzahl+1;i++) {
matrix[zufall.nextInt(zeilen)][ zufall.nextInt(spalten)]= true;
}
for(int i=0;i<zeilen;i++)
for(int j=0;j<spalten;j++)
if(matrix[i][j])jb_matrix[i][j].setBackground(Color.BLUE);
else jb_matrix[i][j].setBackground(color);
} catch(Exception e) {
if(e.getMessage().equals("Die Anzahl der Randomfelder ist größer, als die Anzahl der Matrixfelder")) {
JOptionPane.showMessageDialog(null,"Anzahl > Anzahl Felder Spielfeld","Maximal x*y/2", JOptionPane.INFORMATION_MESSAGE);
jt_zufall.setText(Integer.toString(20));
}
else {
JOptionPane.showMessageDialog(null,"Bitte Zahl eingeben","Fehlerhafte Eingabe", JOptionPane.INFORMATION_MESSAGE);
jt_zufall.setText(Integer.toString(20));
}
}
}
public void set_feld(int zeile, int spalte, boolean zustand) {
matrix[zeile][spalte]=zustand;
if(matrix[zeile][spalte])jb_matrix[zeile][spalte].setBackground(Color.BLUE);
else jb_matrix[zeile][spalte].setBackground(color);
}
public boolean get_feld(int zeile, int spalte) {
return matrix[zeile][spalte];
}
public void set_zyklus(int i) {
jl_zyklus1.setText(Integer.toString(i));
}
public void set_start(boolean zustand) {
start=zustand;
}
public void set_neu(boolean zustand) {
neu=zustand;
}
void reset_spielfeld() {
set_neu(true);
jl_zyklus1.setText(Integer.toString(0));
for(int i=0;i<zeilen;i++)
for(int j=0;j<spalten;j++) {
matrix[i][j]=false;
jb_matrix[i][j].setBackground(color);
}
set_start(false);
}
public boolean get_start() {
return start;
}
public boolean get_neu() {
return neu;
}
void set_milli() {
try {
milli=Integer.parseInt(jt_zeit.getText());
if(milli<0) {
milli=milli*(-1);
jt_zeit.setText(Integer.toString(milli));
}
} catch (Exception e) {
JOptionPane.showMessageDialog(null,"Bitte Zahl eingeben","Fehlerhafte Eingabe", JOptionPane.INFORMATION_MESSAGE);
jt_zeit.setText(Integer.toString(milli));
}
}
public int get_milli(){
return milli;
}
public int get_zeilen() {
return zeilen;
}
public int get_spalten() {
return spalten;
}
void set_spielfeld() {
try {
zeilen=Integer.parseInt(jt_x.getText());
spalten=Integer.parseInt(jt_y.getText());
if(zeilen>3&&spalten>3&&zeilen<100&&spalten<100) {
set_start(false);
jp_spielfeld.removeAll();
jp_hauptpanel.remove(jp_spielfeld);
jframe.revalidate();
jframe.repaint();
jb_matrix=new JButton[zeilen][spalten];
matrix=new boolean[zeilen][spalten];
for(int i=0;i<zeilen;i++)
for(int j=0;j<spalten;j++){
matrix[i][j]=false;
jb_matrix[i][j]=new JButton();
jb_matrix[i][j].addMouseListener(this);
jb_matrix[i][j].setFocusable(false);
}
jp_spielfeld=new JPanel();
jp_spielfeld.revalidate();
jp_spielfeld.repaint();
jp_spielfeld.setBounds(5, 5, 600, 600);
jp_spielfeld.setLayout(new java.awt.GridLayout(zeilen, spalten));
jp_spielfeld.setBorder(BorderFactory.createLineBorder( Color.black ));
for(int i=0;i<zeilen;i++)
for(int j=0;j<spalten;j++){
jp_spielfeld.add(jb_matrix[i][j]);
}
jp_hauptpanel.add(jp_spielfeld);
jframe.validate();
}
else {
JOptionPane.showMessageDialog(null,"Dimension muss > 3 und < 100 sein","Fehlerhafte Dimension", JOptionPane.INFORMATION_MESSAGE);
zeilen=matrix.length;spalten=matrix[0].length;
jt_x.setText(Integer.toString(zeilen));
jt_y.setText(Integer.toString(spalten));
}
} catch(Exception e) {
JOptionPane.showMessageDialog(null,"Dimension muss eine ganze Zahl sein","Ganze Zahlen von 3 bis 100", JOptionPane.INFORMATION_MESSAGE);
zeilen=matrix.length;spalten=matrix[0].length;
jt_x.setText(Integer.toString(zeilen));
jt_y.setText(Integer.toString(spalten));
}
}
private void beenden() {
jframe.setVisible(false);
jframe.dispose();
System.exit(0);
}
/*Wenn Window schließen durch X erfolgt, wird
* Fenster mit beenden() geschlossen
*/
class WindowClosingAdapter extends WindowAdapter {
public void windowClosing(WindowEvent event)
{beenden();}
}
@Override
public void mouseClicked(MouseEvent arg0){
if(arg0.getSource() == this.jb_zufall){
set_zufallsfelder();
}
if(arg0.getSource() == this.jb_dim){
set_spielfeld();
}
if(arg0.getSource() == this.jb_zeit){
set_milli();
}
if(arg0.getSource() == this.jb_start){
set_start(true);
}
if(arg0.getSource() == this.jb_neu){
reset_spielfeld();
}
for(int i=0;i<zeilen;i++)
for(int j=0;j<spalten;j++){
if(arg0.getSource() == this.jb_matrix[i][j]){
if(matrix[i][j]) {
matrix[i][j]=false;
jb_matrix[i][j].setBackground(color);
}
else {
matrix[i][j]=true;
jb_matrix[i][j].setBackground(Color.BLUE);
}
}
}
}
@Override
public void mouseEntered(MouseEvent arg0) {
// TODO Auto-generated method stub
}
@Override
public void mouseExited(MouseEvent arg0) {
// TODO Auto-generated method stub
}
@Override
public void mousePressed(MouseEvent arg0) {
// TODO Auto-generated method stub
}
@Override
public void mouseReleased(MouseEvent arg0) {
}
}
class MehrRandomFelderalsMatrixfelder extends Exception
{
MehrRandomFelderalsMatrixfelder()
{
super("Die Anzahl der Randomfelder ist größer, als die Anzahl der Matrixfelder");
}
}