一、实验要求
- 掌握窗口、各种组件,包括按钮、输入框、标签等。
- 掌握事件触发和处理机制。
- 复用实验2中的类。
- 实验实现目标:对方阵的4种不同的遍历,实现可视化展现。
二、实验内容和步骤
1.实验背景介绍
(1)方阵的遍历方式几乎是无穷无尽的,但常见的遍历方式有行主序、列主序、对角序和反对角序等。
(2)对实验2所实现的4种遍历机制,用可视化的方式加以展现。
(3)通过按钮实现遍历的开始和下一步等操作。
2.用记事本书写一个Java程序
(1)、建立个人子目录
步骤1:建立个人子目录
第一次上机时先在D盘上建立一个以自己学号+姓名为目录名的子目录,如学号为210824109的张三同学,就用“210824109张三”为子目录名。实验完成的源代码、Java字节码和实验报告三个文件都要放在这个文件夹下(称为上交文件夹)。
步骤2:建立Java源代码文件
在所建立的文件夹下建立一个文件夹exp3,在这个文件夹下一个记事本文件visualization.txt,并把它重命名为Visualization.java
(2)、编写源代码
步骤1:创建一个公共类Visualization
要创建的公共类在默认包中,可引入其它的包。所创建的公共类在文件中的一行如下:
public class Visualization extends JFrame implements ActionListener {
步骤2:建立主方法main( )
在类Fraction的类体中编写主方法:
public static void main(String[] args){… …}
步骤3:编写方法和Visualization的主方法main( )
里面会有一条语句即可:new Visualization();
3.调试和运行
package exp3;
import exp2.*;
import java.awt.event.ActionListener;
import javax.swing.*;
import javax.swing.border.Border;
import java.awt.event.*;
import java.awt.*;
public class Visualization extends JFrame implements ActionListener {
public static final int MIN_SIZE = 3;
public static final int MAX_SIZE = 13;
public static final String[] TYPES = {"行主序", "列主序", "对角", "反对角"};
private int whichType = 0;
private SquareTraversal squareTraversal = null;
JRadioButton radioRowMajor = new JRadioButton("行主序");
JRadioButton radioColMajor = new JRadioButton("列主序");
JRadioButton radioDiagonal = new JRadioButton("对角序");
JRadioButton radioAntiDiagonal = new JRadioButton("反对角序");
JComboBox boxSize = new JComboBox();
JTextField fieldType = new JTextField();
JTextField fieldSize = new JTextField();
JButton buttonNew = new JButton("新遍历");
JButton buttonNext = new JButton("下一步");
JPanel panelShow = new JPanel();
public Visualization() {
//设置布局,初始化界面,为按钮注册监听器:
//Add your code here.
}
public void actionPerformed(ActionEvent e) {
//监听两个按钮发出的命令
//Add your code here.
}
private void displayCurrent() {
// 这是一个经常要被用到的功能。也就是对当前的遍历状态进行展示
// Add your code here.
// 为了能够正确显示,一般要用到这两句话:
panelShow.revalidate();
panelShow.repaint();
}
public static void main(String[] args) {
new Visualization();
}
}
package exp3;
import exp2.*;
import java.awt.*;
import java.awt.event.ActionListener;
import javax.swing.*;
import java.awt.event.*;
import java.awt.Dimension;
import java.util.Enumeration;
public class Visualization extends JFrame implements ActionListener {
public static final int MIN_SIZE = 3;
public static final int MAX_SIZE = 13;
public static final String[] TYPES = {"行主序", "列主序", "对角", "反对角"};
private int whichType = 0;
private SquareTraversal squareTraversal = null;
JRadioButton radioRowMajor = new JRadioButton("行主序");
JRadioButton radioColMajor = new JRadioButton("列主序");
JRadioButton radioDiagonal = new JRadioButton("对角");
JRadioButton radioAntiDiagonal = new JRadioButton("反对角");
JComboBox boxSize = new JComboBox();
JTextField fieldType = new JTextField("行主序",8);
JTextField fieldSize = new JTextField("3",8);
JButton buttonNew = new JButton("新遍历");
JButton buttonNext = new JButton("下一步");
private int current = 0;
private int Row = 3;
JPanel panelShow = new JPanel();
public String getSelectedButtonText(ButtonGroup buttonGroup)
{
for (Enumeration buttons = buttonGroup.getElements(); buttons.hasMoreElements(); )
{
AbstractButton button = (AbstractButton) buttons.nextElement();
if (button.isSelected())
return button.getText();
}
return null;
}
class MyFrame extends java.awt.Frame{
MyFrame()
{
super("You_id_class_name");
setLayout(new BorderLayout());
setSize(1000, 800);
int h = this.getHeight();
int w = this.getWidth();
Panel form = new Panel();
form.setLayout(new GridLayout(3,3,20,20));
for(int i = 1 ; i < 10 ; i++)
{
if(i == 1)
{
Panel q = new Panel();
q.setBackground(Color.BLUE);
form.add(q);
continue;
}
Panel p = new Panel();
p.setBackground(Color.GREEN);
form.add(p);
}
squareTraversal = new RowMajor(3);
add(form, BorderLayout.CENTER);
Panel sum = new Panel();
sum.setLayout(new GridLayout(2, 1));
sum.setPreferredSize(new Dimension(w, 60));
Panel header1 = new Panel();
header1.setLayout(new GridLayout(1, 5));
header1.setPreferredSize(new Dimension(sum.getWidth(), 30));
ButtonGroup bu = new ButtonGroup();
radioAntiDiagonal.setContentAreaFilled(false);
radioDiagonal.setContentAreaFilled(false);
radioColMajor.setContentAreaFilled(false);
radioRowMajor.setContentAreaFilled(false);
header1.add(radioRowMajor);
header1.add(radioColMajor);
header1.add(radioDiagonal);
header1.add(radioAntiDiagonal);
bu.add(radioRowMajor);
bu.add(radioColMajor);
bu.add(radioDiagonal);
bu.add(radioAntiDiagonal);
radioRowMajor.setSelected(true);
Panel select = new Panel();
select.setLayout(new GridLayout(1, 2));
for(int i = MIN_SIZE ; i <= MAX_SIZE ; i ++)
boxSize.addItem(i);
Font sname = new Font("仿宋",Font.PLAIN, 12);
JLabel Sname = new JLabel("设置方阵大小");
Sname.setFont(sname);
select.add(Sname);
select.add(boxSize);
header1.add(select);
Panel header2 = new Panel();
header2.setLayout(new GridLayout(1, 4));
header2.setPreferredSize(new Dimension(sum.getWidth(), 30));
JLabel Typename = new JLabel("当前遍历类型:");
Font typename = new Font("仿宋",Font.PLAIN, 12);
Typename.setFont(typename);
Panel type = new Panel(new GridLayout(1, 2));
fieldType.setEnabled(false);
type.add(Typename);
type.add(fieldType);
type.setPreferredSize(new Dimension(header2.getWidth()/4, header2.getHeight()));
header2.add(type);
JLabel Sizename = new JLabel("当前方阵大小:");
Font sizename = new Font("仿宋",Font.PLAIN, 12);
Sizename.setFont(sizename);
Panel size = new Panel(new GridLayout(1 ,2));
fieldSize.setEnabled(false);
size.add(Sizename);
size.add(fieldSize);
size.setPreferredSize(new Dimension(header2.getWidth()/4, header2.getHeight()));
header2.add(size);
Panel p1 = new Panel();
p1.setLayout(new GridLayout(1,2));
p1.setPreferredSize(new Dimension(header2.getWidth()/4, (header2.getHeight())/2));
JLabel j1 = new JLabel();
j1.setPreferredSize(new Dimension(p1.getWidth()/2, p1.getHeight()));
buttonNew.setPreferredSize(new Dimension(p1.getWidth()/2, p1.getHeight()));
buttonNew.addMouseListener(new MouseAdapter() {
@Override
public void mouseClicked(MouseEvent e) {
String str = getSelectedButtonText(bu);
fieldType.setText(str);
fieldSize.setText(String.valueOf(boxSize.getSelectedItem()));
int row = Integer.valueOf(String.valueOf(boxSize.getSelectedItem()));
for(int i = 0 ; i <= 3 ; i ++)
if(str == TYPES[i])
whichType = i;
if(whichType == 0)
squareTraversal = new RowMajor(row);
else if(whichType == 1)
squareTraversal = new ColMajor(row);
else if(whichType == 2)
squareTraversal = new Diagonal(row);
else if(whichType == 3)
squareTraversal = new AntiDiagonal(row);
int first;
if(whichType == 2)
first = (row-1)*row;
else
first = 0;
current = first;
form.removeAll();
form.setLayout(new GridLayout(row,row,20, 20));
for(int i = 1 ; i <= row*row ; i ++)
{
Panel p = new Panel();
p.setBackground(Color.GREEN);
form.add(p);
}
Panel p = (Panel)form.getComponent(first);
p.setBackground(Color.BLUE);
form.revalidate();
form.repaint();
}
});
p1.add(j1);
p1.add(buttonNew);
header2.add(p1);
Panel p2 = new Panel();
p2.setLayout(new GridLayout(1,2));
p2.setPreferredSize(new Dimension(header2.getWidth()/4, (header2.getHeight())/2));
JLabel j2 = new JLabel(" ");
j2.setPreferredSize(new Dimension(p2.getWidth()/2, p2.getHeight()));
buttonNext.setPreferredSize(new Dimension(p2.getWidth()/2, p2.getHeight()));
buttonNext.addMouseListener(new MouseAdapter() {
@Override
public void mouseClicked(MouseEvent e) {
int row = Integer.valueOf(String.valueOf(boxSize.getSelectedItem()));
if((squareTraversal.getNext()) != null) {
SquarePoint next = squareTraversal.getNext();
int Next = next.getRow() * row + next.getCol();
System.out.print(Next);
Panel P = (Panel) form.getComponent(Next);
P.setBackground(Color.BLUE);
Panel Q = (Panel) form.getComponent(current);
Q.setBackground(Color.RED);
current = Next;
squareTraversal.step(next);
}
}
});
p2.add(j2);
p2.add(buttonNext);
header2.add(p2);
sum.add(header1);
sum.add(header2);
add(sum, BorderLayout.NORTH);
setDefaultCloseOperation(EXIT_ON_CLOSE);
setLocationRelativeTo(null);
addWindowListener(new WindowAdapter() {
@Override
public void windowClosing(WindowEvent e) {
System.exit(0);
}
});
setVisible(true);
}
}
public Visualization() {
//设置布局,初始化界面,为按钮注册监听器:
// Add your code here.
MyFrame f = new MyFrame();
}
public void actionPerformed(ActionEvent e) {
//监听两个按钮发出的命令
//Add your code here.
}
private void displayCurrent() {
// 这是一个经常要被用到的功能。也就是对当前的遍历状态进行展示
// Add your code here.
// 为了能够正确显示,一般要用到这两句话:
panelShow.revalidate();
panelShow.repaint();
}
public static void main(String[] args) {
new Visualization();
}
}