
Программирование на java / Метод. ук. к л. р / Метод. ук. к л. р. 6
.docСТО АлтГТУ 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.