第三次作业,GUI设计之最大子序列和

先吐槽一发!!!学渣表示作业太难了啊!!!!!!做一次作业要用好久好久,要问好多好多大神才能行,虽然确实提高不少,花的时间真是……!!!!!

这次作业费劲心血,希望老师能给个好分数,至少对于学渣来说已经很不容易了。

还要感谢我的室友杨超同学(11061098),可以说这个小软件是我和他一起写的,他懂得java语言,我负责写框架,他负责写功能,然后我再把代码集合起来生成小软件。这是我们结对编程的结晶~~~

回到正题,看到第三次的题目,结合课堂有同学提出的建议,用浏览器实现单个程序多个标签的目标非常靠谱,于是学着写Java的Applet了。

先上代码

import javax.swing.*;
import java.awt.*;
import java.awt.event.*;
import javax.swing.*; public class frame extends JApplet implements ActionListener{
private FlowLayout fl=new FlowLayout(FlowLayout.CENTER);
private JButton bt=new JButton("开始");
private JLabel lbx=new JLabel("x长度");
private JLabel lby=new JLabel("y长度");
private JTextField tfx=new JTextField(2);
private JTextField tfy=new JTextField(2);
private JPanel jpl=new JPanel();
private JPanel arr=new JPanel();
private JTextField[][] a=new JTextField[6][6]; public frame()
{
jpl.add(bt);
jpl.add(lbx);
jpl.add(tfx);
jpl.add(lby);
jpl.add(tfy);
arr.setLayout(new GridLayout(6,6));
for(int i=0;i<6;i++)
for(int j=0;j<6;j++)
{
a[i][j]=new JTextField(2);
arr.add(a[i][j]);
}
jpl.setSize(200,200);
bt.addActionListener(this);
this.add(jpl);
this.add(arr);
this.setLayout(fl);
this.setSize(250,250);
this.setVisible(true);
}
public void actionPerformed(ActionEvent e){ int x=Integer.parseInt(tfx.getText());
int y=Integer.parseInt(tfy.getText());
int b[][]=new int[6][6]; for(int i=0;i<y;i++)
{
for(int j=0;j<x;j++)
{
b[i][j]=Integer.parseInt(a[i][j].getText()); }
} int l= find(x,y,b);
JOptionPane.showMessageDialog( this ,l);
}
public void init()
{
new frame();
}
public int find(int x,int y,int b[][]){
int s,sum,n;
int max;
int c[][]=new int[100][100];
for(int i=0;i<x;i++)
{
n=0;
for(int j=0;j<y;j++)
{
sum=0;
for(int t=j;t>=0;t--)
{
sum=sum+b[t][i];
c[n][i]=sum;
n++;
} }
} max=c[0][0];
for(int i=0;i<(y*(y+1)/2);i++)
{
s=c[i][0];
for(int j=1;j<x;j++){
s+=c[i][j];
if(s<c[i][j])s=c[i][j];
if (max<s) max=s;
}
} return max;
/*
*/
}
}

以上就是源代码了,等下慢慢来解读我的程序是怎么写的

再附上嵌入网页的源码

<html>
<applet code="frame.class" codebase = "applet" width="320" height="320">
</applet>
</html>

这个网页代码很简单

applet是网页中嵌入的小程序,宽和高为320

这个是小程序的截图

 第三次作业,GUI设计之最大子序列和

使用方法:在x长度和y长度里面输入两个数字,分别是要输入数组的两个维度,x为横向长度,y为纵向长度

在输入完x和y以后在下面的文本框中输入测试数据,比如

第三次作业,GUI设计之最大子序列和

在输入完毕以后点击“开始”开始运算,弹出窗口并显示结果

第三次作业,GUI设计之最大子序列和

这就是最终答案:12

介绍一下这个小程序是怎么写的:

先说说界面部分

import javax.swing.*;
import java.awt.*;
import java.awt.event.*;
import javax.swing.*; public class frame extends JApplet implements ActionListener{
private FlowLayout fl=new FlowLayout(FlowLayout.CENTER);
private JButton bt=new JButton("开始");
private JLabel lbx=new JLabel("x长度");
private JLabel lby=new JLabel("y长度");
private JTextField tfx=new JTextField(2);
private JTextField tfy=new JTextField(2);
private JPanel jpl=new JPanel();
private JPanel arr=new JPanel();
private JTextField[][] a=new JTextField[6][6]; public frame()
{
jpl.add(bt);
jpl.add(lbx);
jpl.add(tfx);
jpl.add(lby);
jpl.add(tfy);
arr.setLayout(new GridLayout(6,6));
for(int i=0;i<6;i++)
for(int j=0;j<6;j++)
{
a[i][j]=new JTextField(2);
arr.add(a[i][j]);
}
jpl.setSize(200,200);
bt.addActionListener(this);
this.add(jpl);
this.add(arr);
this.setLayout(fl);
this.setSize(250,250);
this.setVisible(true);
}

import几个需要用到的方法,创建了一个名为开始的button和x,y轴长度的标签和输入文本框

然后注册了一个jpl的框体,将button,两个标签以及两个文本框放到这个jpl框体中

然后通过数组创建了一个6*6的JTextfield文本框,这个创建花了我很久的时间

刚开始想一个个的手打一个个的创建,后来实在觉得一定可以用for循环来创建

但是百度和书本都没有关于批量创建和引用的内容,于是自己慢慢摸索,写出了这两部分代码发现可以执行并且能够知道文本框的名字

    private JTextField[][] a=new JTextField[6][6];
.......
.....
arr.setLayout(new GridLayout(6,6));
for(int i=0;i<6;i++)
for(int j=0;j<6;j++)
{
a[i][j]=new JTextField(2);
arr.add(a[i][j]);
}

上面是声明文本框数组变量

下面的部分是创建一个名为arr的框体,设置arr框体的布局为GRIDLAYOUT

通过两个for循环为每个JTEXTFIELD附上名字并且添加到arr的框体当中

然后通过

        this.add(arr);

这个语句将arr框体添加到总框体frame当中。

然后完成的效果就是

第三次作业,GUI设计之最大子序列和

上面的第一排是Jpl框体,下面的GRID是arr框体,他们共同被放在frame里面

写完这段界面整整花掉了6个小时啊!!!(学渣你伤不起,从0开始啊!写这个程序之前JAVA怎么写我都不知道。。不说了,都是泪)

介绍完框架,开始绑定函数和添加监听了(监听是什么神奇的东西,我什么都不知道啊!)

学习事件和监听的基础,用时3小时~

public class frame extends JApplet implements ActionListener{

...
...
...
bt.addActionListener(this); ...
...
...
public void actionPerformed(ActionEvent e){

这算是个基本格式了

利用的是点击按钮触发事件的方式

在下面的actionperformed里面写要执行的动作就行了

先测试了一发点击按钮生成对话框的功能

        JOptionPane.showMessageDialog( this ,“shit!”);

发现屏幕上真的出现了一个消息窗口对我说“shit!”

这真是个好消息

后面的工作可以慢慢来了

找到第二次作业的代码,经过长时间的改动和测试改成了在java中能使用的代码,由杨超同学主力完成,我来辅助

public int find(int x,int y,int b[][]){
int s,sum,n;
int max;
int c[][]=new int[100][100];
for(int i=0;i<x;i++)
{
n=0;
for(int j=0;j<y;j++)
{
sum=0;
for(int t=j;t>=0;t--)
{
sum=sum+b[t][i];
c[n][i]=sum;
n++;
} }
} max=c[0][0];
for(int i=0;i<(y*(y+1)/2);i++)
{
s=c[i][0];
for(int j=1;j<x;j++){
s+=c[i][j];
if(s<c[i][j])s=c[i][j];
if (max<s) max=s;
}
} return max;
/*
*/
}

然后在调用函数的过程中发现了一个严重的问题!!

Jtextfield的内容为String,要处理的数组要int,怎么转换啊?

尝试了半天,发现要利用一个叫做

Integer.parseInt()的函数

问题又能解决了

利用Integer.parseInt()和gettext()

我顺利的从文本框中得到了我需要的文字,并且是整形的哦~

问我如何知道?我把

JOptionPane.showMessageDialog( this ,“shit”)改成了JOptionPane.showMessageDialog( this ,b[0][0]+b[0][1]);

如果没有转换成int,还是string的话我在b00和b01的位置分别输入1和2,那么信息盒子给出的结果一定是12(string的加号是连接)

如果转化成了整形,那么信息盒子给出的一定是3(int的加号是数学加)。机智!!!!!

又花了一个小时把这个程序搞定

开始测试

把生成的.class拷贝到网页的applet文件夹下面,打开网页,当当当当!!!!!成功了

真是不容易

当然还有未完成的一些功能,比如在显示结果的同时将最大和的矩形通过颜色标记出来。这个可以实现,但是对于我来说需要不少的时间,先交个基础版的吧。

题外话

结对编程让我学到了很多,也让我找到了乐趣,在和同学讨论一个程序如何实现的过程中,我能够听到别人的想法,并用别人的想法来优化我的思路,这样的设计软件的方法真是不错

这次作业做了很久,是今天早晨在完成的全部的工作,下午把博客写完,博客也写了不少时间,貌似超过了规定的交作业时间一点点,希望老师能够通融

我真的有在很努力的写程序,实在因为水平有限,而且时间不是很多,以后还要多靠大神,谁让我自己是个“坑”~~~

上一篇:Android 用Activity的onTouchEvent来监听滑动手势


下一篇:Java之路(四)数组初始化