Вызов конструктора из другого конструктора.

 

Часто для того, чтобы избежать написание повторяющегося кода инициализации, необходимо вызвать код одного конструктора из другого.

 

Вот пример, как это можно делать:

public class SomeClass {

int a;

int b;

int c;

public SomeClass(int a, int b){

this.a = a;

this.b = b;

}

public SomeClass(int a, int b, int c){

// Вызов конструктора с двумя параметрами.

this(a, b);

this.c = c;

}

public void Show(){

System.out.println("a = " + a);

System.out.println("b = " + b);

System.out.println("c = " + c);

}

}

 

Как вы видите, для этого используется ключевое слово this, после которого в круглых скобках указываем параметры для соответствующего конструктора (с двумы параметрами в данном случае).

 

Игра «Пятнашки»

 

 

package prjavapytna;

 

import javax.swing.UIManager;

import java.awt.*;

 

public class ApplicationPytna

{

boolean packFrame = false;

/**Construct the application*/

public ApplicationPytna()

{

FramePytna frame = new FramePytna();

//Validate frames that have preset sizes

//Pack frames that have useful preferred

//size info, e.g. from their layout

if (packFrame)

{

frame.pack();

}

else

{

frame.validate();

}

//Center the window

Dimension screenSize = Toolkit.getDefaultToolkit().getScreenSize();

Dimension frameSize = frame.getSize();

if (frameSize.height > screenSize.height)

{

frameSize.height = screenSize.height;

}

if (frameSize.width > screenSize.width)

{

frameSize.width = screenSize.width;

}

frame.setLocation((screenSize.width - frameSize.width) / 2,

(screenSize.height - frameSize.height) / 2);

frame.setVisible(true);

}

/**Main method*/

public static void main(String[] args)

{

try

{

UIManager.setLookAndFeel(

UIManager.getCrossPlatformLookAndFeelClassName());

}

catch(Exception e)

{

e.printStackTrace();

}

new ApplicationPytna();

}

}

 

package prjavapytna;

 

import java.awt.*;

import java.awt.event.*;

import javax.swing.*;

 

public class FramePytna extends JFrame

{

JPanel contentPane;

JPanel gamePane = new JPanel();

BorderLayout borderLayout1 = new BorderLayout();

//линия статус бара

JLabel status= new JLabel();

//массив кнопочек

JButton[][] buttons = new JButton[4][4];

//матрица для хранения чисел

int[][] matrix = new int[4][4];

 

/**Construct the frame*/

public FramePytna()

{

enableEvents(AWTEvent.WINDOW_EVENT_MASK);

try

{

jbInit();

}

catch(Exception e)

{

e.printStackTrace();

}

}

/**Component initialization*/

private void jbInit() throws Exception

{

contentPane = (JPanel) this.getContentPane();

contentPane.setLayout(borderLayout1);

this.setSize(new Dimension(206,275));

this.setTitle("Пятнашки");

//запрещаем изменение размера окна

this.setResizable(false);

//Создаем основное меню

JMenuBar menuBar = new JMenuBar();

//Создаем подменю

JMenu menuGame = new JMenu("Игра");

JMenu menuHelp = new JMenu("Помощь");

//Добавляем подменю в основное меню

menuBar.add(menuGame);

menuBar.add(menuHelp);

//Устанавливаем полученное меню на окно

this.setJMenuBar(menuBar);

//Создаем элементы подменю Game с обработчиками событий

JMenuItem item1 = new JMenuItem("Новая игра");

JMenuItem item2 = new JMenuItem("Выход");

//Создаем элемент подменю Help с обработчиками событий

JMenuItem item3 = new JMenuItem("О игре...");

//Добавляем обработчики событий по нажатию

item1.addActionListener(new java.awt.event.ActionListener()

{

public void actionPerformed(ActionEvent e)

{

newGame();

}

});

item2.addActionListener(new java.awt.event.ActionListener()

{

public void actionPerformed(ActionEvent e)

{

System.exit(0);//Выход из системы

}

});

item3.addActionListener(new java.awt.event.ActionListener()

{

public void actionPerformed(ActionEvent e)

{

JOptionPane.showMessageDialog(null,

"Игра Пятнашки","Об игре",

JOptionPane.QUESTION_MESSAGE);

}

});

 

//Добавляем созданные элементы к подменю

menuGame.add(item1);

menuGame.add(item2);

menuHelp.add(item3);

gamePane.setLayout(null);

// добавляем кнопочки

int count=0;

for(int i = 0;i<4;i++)

for(int j = 0;j<4;j++)

{

buttons[i][j] = new JButton(""+count);

//устанавливаем обработчик событий

buttons[i][j].addMouseListener(new mAdapter(i,j));

buttons[i][j].setSize(50,50);

buttons[i][j].setLocation(50*j,50*i);

buttons[i][j].setCursor(new Cursor(Cursor.HAND_CURSOR));

gamePane.add(buttons[i][j]);

matrix[i][j]=count;//задаем матрицу

count++;

}

buttons[0][0].setText(" ");

//Добавляем игровую панель с кнопками

contentPane.add(gamePane,BorderLayout.CENTER);

//обрамляем строку статуса

status.setBorder(BorderFactory.createEtchedBorder());

//Добавляем строку статуса

contentPane.add(status,BorderLayout.SOUTH);

//новая игра

newGame();

}

/**Overridden so we can exit when window is closed*/

protected void processWindowEvent(WindowEvent e)

{

super.processWindowEvent(e);

if (e.getID() == WindowEvent.WINDOW_CLOSING)

{

System.exit(0);

}

}

/**Случайным образом переставляем элементы матрицы*/

public void randomizeMatrix()

{

for(int i = 0;i<100;i++)

{

int a = (int)(Math.random()*4);

int b = (int)(Math.random()*4);

int a2 = (int)(Math.random()*4);

int b2 = (int)(Math.random()*4);

 

int c = matrix[a][b];

matrix[a][b] = matrix[a2][b2];

matrix[a2][b2] = c;

}

}

/**Начинаем новую игру*/

public void newGame()

{

randomizeMatrix();

for(int i = 0;i<4;i++)

for(int j = 0;j<4;j++)

{

//пишем на кнопочках числа из матрицы

if(matrix[i][j]!=0)buttons[i][j].setText(""+matrix[i][j]);

else buttons[i][j].setText("");

}

status.setText("Старт новой игры");

gamePane.setVisible(true);

}

/**Класс адаптера прослушивающий события над кнопкой*/

class mAdapter extends java.awt.event.MouseAdapter

{

int posi,posj;

int startx=0;

int starty=0;

/**Конструктор адаптера в зависимости от позиции кнопочки*/

mAdapter(int posI,int posJ)

{

this.posi=posI;

this.posj=posJ;

}

/**При нажатой кнопке мыши*/

public void mousePressed(MouseEvent e)

{

//меняем курсор

buttons[posi][posj].setCursor(new Cursor(Cursor.MOVE_CURSOR));

//запоминаем точку начала переноса кнопки

startx=e.getX();

starty=e.getY();

}

/**При отпускании кнопки мыши*/

public void mouseReleased(MouseEvent e)

{

//меняем курсор

buttons[posi][posj].setCursor(new Cursor(Cursor.HAND_CURSOR));

//запоминаем точку окончания переноса кнопки

int endx=e.getX();

int endy=e.getY();

//определяем направление переноса

//если абсолютная величина (shiftx) больше

//абсолютной величины (shifty)

//значит передвигаемся по оси х

int shiftx=endx-startx;

int shifty=endy-starty;

if(Math.abs(shiftx)>Math.abs(shifty))

{

//определяем направление движения по оси х

if(shiftx>0)

{//вправо

 

//если это не крайние правые кнопки

//и правая кнопка пустая

//меняем местами кнопку с пустой кнопкой

if((posj != 3) && (matrix[posi][posj+1] == 0))

{

matrix[posi][posj+1] = matrix[posi][posj];

matrix[posi][posj]=0;

buttons[posi][posj].setText("");

buttons[posi][posj+1].setText(""+matrix[posi][posj+1]);

status.setText("good turn");

}else status.setText("it is impossible");

}

else

{//влево

 

//если это не крайние левые кнопки

//и левая кнопка пустая

//меняем местами кнопку с пустой кнопкой

if((posj != 0) && (matrix[posi][posj-1] == 0))

{

matrix[posi][posj-1] = matrix[posi][posj];

matrix[posi][posj]=0;

buttons[posi][posj].setText("");

buttons[posi][posj-1].setText(""+matrix[posi][posj-1]);

status.setText("good turn");

}else status.setText("it is impossible");

}

}

else

{

//определяем направление движения по оси y

if(shifty>0)

{//вниз

 

//если это не крайние нижние кнопки

//и нижняя кнопка пустая

//меняем местами кнопку с пустой кнопкой

if((posi != 3) && (matrix[posi+1][posj] == 0))

{

matrix[posi+1][posj] = matrix[posi][posj];

matrix[posi][posj]=0;

buttons[posi][posj].setText("");

buttons[posi+1][posj].setText(""+matrix[posi+1][posj]);

status.setText("Хороший ход");

}else status.setText("Проигрыш");

}

else

{//вверх

 

//если это не крайние верхние кнопки

//и верхняя кнопка пустая

//меняем местами кнопку с пустой кнопкой

if((posi != 0) && (matrix[posi-1][posj] == 0))

{

matrix[posi-1][posj] = matrix[posi][posj];

matrix[posi][posj]=0;

buttons[posi][posj].setText("");

buttons[posi-1][posj].setText(""+matrix[posi-1][posj]);

status.setText("good turn");

}else status.setText("it is impossible");

}

}

//проверяем все ли числа стоят на своих местах

//если да то победа!!!

int count=1;

int error=0;

for(int i = 0;i<4;i++)

for(int j = 0;j<4;j++)

{

if(matrix[i][j]!=count)error++;

count++;

}

if(error==1)

{

status.setText("Вы выиграли!!!");

int result = JOptionPane.showConfirmDialog(null,

"Вы выиграли!!!","Вы выиграли!!! Новая игра?",JOptionPane.YES_NO_OPTION);

if (result == JOptionPane.YES_OPTION)newGame();

else gamePane.setVisible(false);

}

}

}

}