Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
Скачиваний:
77
Добавлен:
14.02.2015
Размер:
214.02 Кб
Скачать

СТО АлтГТУ 13.62.1.0667-2011

Лабораторная работа №6. Основы программирования GUI с использованием Swing.

Цель работы: получить практические навыки использования основных классов библиотеки Swing для организации GUI.

В листинге 6.1 представлена программа, которая вычисляет площади геометрических фигур круг. В программе описан абстрактный класс Shape и на его основе производный класс Circle. Класс CircleList используется для работы с коллекцией List объектов класса Circle. Классы MyTableModel, EditDialog и JavaApplication используются для рганизации GUI.

Программа выполнена в NetBeans IDE 7.3.1. На рис. 6.1. показан состав проекта программы. Рисунок 6.2 демонстрирует результат выполнения программы

Рисунок 6.1 – Состав проекта программы

Листинг 6.1

// Shape.java

package shape;

import java.io.Serializable;

// базовый класс фигура

public abstract class Shape implements Serializable

{ protected String type;

public Shape() { }

public Shape(String t) { type = t; }

public String GetShape() { return type; }

public void SetShape(String t) { type = t; }

public abstract void Move(double x1, double y1);

}

// Circle.java

package shape;

// производный класс круг

public class Circle extends Shape implements Comparable <Circle>

{ private double x, y, r;

public Circle(){ }

public Circle(String t, double x1, double y1, double r1)

{ super(t); x = x1; y = y1; r = r1; }

public String toString()

{ return "\n" + type + ". Координаты центра: x = " + x + ", y = " + y + ", r = " + r;

}

//переопределение метода Move

public void Move(double x1, double y1)

{ x += x1; y += y1;

String msg = "Новые координаты центра " + x + " " + y;

System.out.println(type + ". Результат перемещения: " + msg);

}

public double GetSquare()//вычисление площади

{ return Math.PI * Math.pow(r, 2); }

public double getx(){ return x;}

public double gety(){ return y;}

public double getr(){ return r;}

public void setx(double x1){ x = x1;}

public void sety(double y1){ y = y1;}

public void setr(double r1){ r = r1;}

public int compareTo(Circle Cl)

{ int res = 0;

if (Cl.r < this.r) { res = 1;}

if (Cl.r > this.r) { res = -1;}

return res;

}

}

// CircleList.java

package shape;

import java.util.List;

import java.util.ArrayList;

import java.util.Iterator;

import java.util.Collections;

import java.io.*;

public class СircleList implements Serializable

{ public List<Circle> clist;

public СircleList()

{ clist = new ArrayList();}

public void add( Circle obj) { clist.add(obj);}

public void sort() { Collections.sort(clist);}

public String iterate1()

{ Iterator <Circle> it = clist.iterator();

String Str ="";

while (it.hasNext())

{ Circle el = it.next();

Str = Str + (el.GetShape() + ". Площадь: " + el.GetSquare() + "\n");

}

return Str;

}

}

// MyTableModel.java

package javaapplication5;

import javax.swing.table.AbstractTableModel;

import java.util.List;

import shape.Circle;

public class MyTableModel extends AbstractTableModel

{ private List <Circle> list;

public MyTableModel(List <Circle> list)

{ this.list = list;

}

public int getColumnCount() {return 4;}

public String getColumnName(int columnIndex)

{ switch (columnIndex)

{ case 0: return "Имя";

case 1: return "x";

case 2: return "y";

case 3: return "r";

}

return "";

}

public int getRowCount(){ return list.size();}

public Object getValueAt(int rowIndex, int columnIndex)

{ Circle cl = list.get(rowIndex);

switch (columnIndex)

{ case 0: return cl.GetShape();

case 1: return cl.getx();

case 2: return cl.gety();

case 3: return cl.getr();

}

return "";

}

public boolean isCellEditable(int rowIndex, int columnIndex)

{ return false;}

public void setValueAt(Object value, int rowIndex, int columnIndex)

{}

}

// EditDialog.java

package javaapplication5;

import java.awt.Frame;

import java.awt.event.ActionEvent;

import java.awt.event.ActionListener;

import javax.swing.JDialog;

import javax.swing.JTextField;

import javax.swing.text.MaskFormatter;

import javax.swing.JLabel;

import javax.swing.Box;

import javax.swing.JButton;

import static javax.swing.WindowConstants.DO_NOTHING_ON_CLOSE;

import javax.swing.border.EmptyBorder;

import javax.swing.JOptionPane;

public class EditDialog extends JDialog

{ JLabel label1,label2,label3,label4;

JTextField type;

MaskFormatter formatter;

JTextField x,y, r;

JButton ok;

EditDialog(Frame owner, boolean modal)

{ super(owner, modal);

setDefaultCloseOperation(DO_NOTHING_ON_CLOSE);

//setDefaultCloseOperation(DISPOSE_ON_CLOSE);

Box box1 = Box.createHorizontalBox();

label1 = new JLabel("Название и номер круга:"); type = new JTextField(15);

box1.add(label1);

box1.add(Box.createHorizontalStrut(6)); box1.add(type);

Box box2 = Box.createHorizontalBox();

label2 = new JLabel("х:"); x = new JTextField(15);

box2.add(label2);

box2.add(Box.createHorizontalStrut(6)); box2.add(x);

Box box3 = Box.createHorizontalBox();

label3 = new JLabel("y:"); y = new JTextField(15);

box3.add(label3);

box3.add(Box.createHorizontalStrut(6)); box3.add(y);

Box box4 = Box.createHorizontalBox();

label4 = new JLabel("r:"); r = new JTextField(15);

box4.add(label4);

box4.add(Box.createHorizontalStrut(6)); box4.add(r);

Box box5 = Box.createHorizontalBox();

ok = new JButton("OK");

box5.add(Box.createHorizontalGlue());

box5.add(ok);

box5.add(Box.createHorizontalStrut(12));

// Размещаем три горизонтальные панели на одной вертикальной

Box mainBox = Box.createVerticalBox();

mainBox.setBorder(new EmptyBorder(12,12,12,12));

mainBox.add(box1);

mainBox.add(Box.createVerticalStrut(12));

mainBox.add(box2);

mainBox.add(Box.createVerticalStrut(12));

mainBox.add(box3);

mainBox.add(Box.createVerticalStrut(12));

mainBox.add(box4);

mainBox.add(Box.createVerticalStrut(17));

mainBox.add(box5);

setContentPane(mainBox);

pack();

setResizable(false);

ok.addActionListener(new ActionListener()

{ public void actionPerformed(ActionEvent e)

{ boolean er1 = false;

JavaApplication5.nname = type.getText();

String sx = x.getText().replaceAll("[^0-9]", "");

if (sx.equals("")) er1 = true;

String sy = y.getText().replaceAll("[^0-9]", "");

if (sy.equals("")) er1 = true;

String sr = r.getText().replaceAll("[^0-9]", "");

if (sr.equals("")) er1 = true;

if (er1 == true)

JOptionPane.showMessageDialog(ok, "х,y, r - должны быть числами", "Информация", JOptionPane.WARNING_MESSAGE);

else

{ x.setText(sx);

y.setText(sy);

r.setText(sr);

JavaApplication5.xx = Double.parseDouble(x.getText());

JavaApplication5.yy = Double.parseDouble(y.getText());

JavaApplication5.rr = Double.parseDouble(r.getText());

dispose();

}

}

});

}

}

// JavaApplication5.java

package javaapplication5;

import shape.*;

import java.awt.Dimension;

import java.awt.event.ActionEvent;

import java.awt.event.ActionListener;

import java.io.IOException;

import java.util.logging.Level;

import java.util.logging.Logger;

import javax.swing.Box;

import javax.swing.JFrame;

import javax.swing.JScrollPane;

import javax.swing.JTable;

import javax.swing.JButton;

import javax.swing.JOptionPane;

import javax.swing.JTextArea;

import javax.swing.border.EmptyBorder;

public class JavaApplication5 extends JFrame

{ static JavaApplication5 frame;

СircleList circles;

MyTableModel model;

JTextArea textArea;

JTable table;

JButton btnAdd;

JButton btnS;

JButton btnSort;

JButton btnWrf;

JButton btnRf;

static String nname ="";

static double xx = 0,yy=0,rr=0;

public JavaApplication5()

{ super("Окно");

setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);

circles = new СircleList ();

model = new MyTableModel(circles.clist);

table = new JTable(model);

Box box1 = Box.createHorizontalBox();

box1.add(new JScrollPane(table));

Box box2 = Box.createHorizontalBox();

textArea = new JTextArea(10,20);

box2.add(new JScrollPane(textArea));

Box box3 = Box.createHorizontalBox();

btnAdd = new JButton("Add!");

btnAdd.addActionListener(new ActionListener()

{ public void actionPerformed(ActionEvent e)

{ EditDialog myWindow = new EditDialog(frame, true);

myWindow.setVisible(true);

Circle c= new Circle();

c.SetShape(nname);

c.setx(xx);

c.sety(yy);

c.setr(rr);

circles.add(c);

model.fireTableDataChanged();

}

});

btnSort = new JButton("Sort!");

btnSort.addActionListener(new ActionListener()

{ public void actionPerformed(ActionEvent e)

{ circles.sort();

model.fireTableDataChanged();

}

});

btnS = new JButton("S!");

btnS.addActionListener(new ActionListener()

{ public void actionPerformed(ActionEvent e)

{ textArea.setText("");

textArea.append(circles.iterate1());

}

});

box3.add(Box.createHorizontalGlue());

box3.add(btnAdd);

box3.add(Box.createHorizontalStrut(12));

box3.add(btnSort);

box3.add(Box.createHorizontalStrut(12));

box3.add(btnS);

box3.add(Box.createHorizontalStrut(12));

Box mainBox = Box.createVerticalBox();

mainBox.setBorder(new EmptyBorder(12,12,12,12));

mainBox.add(box1);

mainBox.add(Box.createVerticalStrut(12));

mainBox.add(box2);

mainBox.add(Box.createVerticalStrut(12));

mainBox.add(box3);

setContentPane(mainBox);

setPreferredSize(new Dimension(460,420));

pack();

setLocationRelativeTo(null);

setVisible(true);

}

public static void main(String[] args)

{ javax.swing.SwingUtilities.invokeLater(new Runnable()

{ public void run()

{ JFrame.setDefaultLookAndFeelDecorated(true);

new JavaApplication5();

}

});

}

}

Рисунок 6.2 – Результат выполнения программы

Задание: Изменить программу индивидуального варианта лаб. Работы № 5 (задание 1): добавить классы для организации GUI с использованием Swing.

6

Соседние файлы в папке Метод. ук. к л. р