import java.awt.EventQueue;
import java.awt.GridBagConstraints;
import java.awt.GridBagLayout;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.io.BufferedReader;
import java.io.File;
import java.io.FileNotFoundException;
import java.io.FileReader;
import java.io.IOException;
import java.text.SimpleDateFormat;
import java.util.Calendar;
import java.util.Date;
import java.util.Stack;
import java.util.Timer;
import java.util.TimerTask;
import javax.swing.BorderFactory;
import javax.swing.JButton;
import javax.swing.JFileChooser;
import javax.swing.JFrame;
import javax.swing.JLabel;
import javax.swing.JScrollPane;
import javax.swing.JTable;
import javax.swing.JTextArea;
import javax.swing.JTextField;
import javax.swing.UIManager;
import javax.swing.border.Border;
import javax.swing.filechooser.FileFilter;
import javax.swing.filechooser.FileNameExtensionFilter;
import javax.swing.table.DefaultTableCellRenderer;
public class LL1 extends JFrame {
/**
*
*/
private static final long serialVersionUID = 1L;
//private char VN[]={'E','G','T','S','F'};//非终结符
//private char VT[]={'+','-','ε','*','/','(',')','i','#'};//终结符
private char VN[]=new char[100];//定义终结符数组元素个数
private char VT[]=new char[100];
private String[] First=new String[VN.length];//单个非终结符的first集
private String[] Follow=new String[VN.length];
private String M[][]=new String[VN.length][VT.length];
//private String G[]={"E->TG","G->+TG|-TG","G->ε","T->FS","S->*FS|/FS","S->ε","F->(E)","F->i"};//文法
private String G[]=new String[100];
//建立表格
private Object[] colname = {"步骤","分析栈","剩余字符串","所用产生式","动作"};
private Object[][] data=new Object[50][5];
private JTable table;
private JTextField j3;
private JLabel j8;
private JLabel j9;
private JLabel j10;
private JTextArea j5;
private JTextArea j12;
private JTextArea j13;
private JTextArea j14;
private JTextArea j15;
private JScrollPane jsPan;
private JScrollPane jsPane;
private JScrollPane jsPan1;
private JScrollPane jsPan2;
private JScrollPane jsPan3;
private JScrollPane jsPan4;
private File imgFile = null;// 声明所选择文件
private BufferedReader in1;
private GridBagLayout layout;
private GridBagConstraints s;
private int h = 0;
private String getstr=null;
private int ONE_SECOND = 1000;
private String DEFAULT_TIME_FORMAT = "HH:mm:ss";
private String time;
public void Init() {//初始化follow集,将#放到开始符号集中去
int i=0;
Follow[i]="#";
}
public int IsInVn(char ch) {//判断字符是否属于非终结符
int judge=999;
for(int i=0;i<VN.length;i++) {
if(ch==VN[i]) {
judge=i;
break;
}
}
return judge;
}
public int IsInVt(char ch) {//判断字符是否属于终结符
int judge=999;
for(int i=0;i<VT.length;i++) {
if(ch==VT[i]) {
judge=i;
break;
}
}
return judge;
}
public int IsInFirst(String s,char ch) {//判断字符是否在first集中
int judge=999;
if(s!=null) {
for(int i=0;i<s.length();i++) {
if(ch==s.charAt(i)) {
judge=i;
break;
}
}
}
return judge;
}
public String Simply(String s) {//去除重复的字符
StringBuffer sb = new StringBuffer();
int len = s.length();
int i = 0;
boolean flag = false;
for (i = 0; i < len; i++) {
char c = s.charAt(i);
if(c!='n'&&c!='u'&&c!='l') {
if (s.indexOf(c) != s.lastIndexOf(c)) {
flag = false;
}else{
flag = true;
}
if(i==s.indexOf(c))
flag=true;
if (flag) {
sb.append(c);
}
}
}
return sb.toString();
}
public boolean Check(int a[],int b[]) {//检查两个数组是否相等
int i;
int count=0;
for(i=0;i<VN.length;i++) {
if(a[i]==b[i]) {
count++;
} else {
break;
}
}
return (count==VN.length);
}
public void First_Call(char s[],int j,int i) {//子过程
if(IsInVn(s[j])!=999) {//如果推导式后面的是非终结符
if(First[IsInVn(s[j])]!=null) {//如果它的first集为非空
if(IsInFirst(First[IsInVn(s[j])],'ε')==999) {//如果ε不在这个非终结符中
First[IsInVn(s[0])]+=First[IsInVn(s[j])];
} else {//ε在这个非终结符中
First[IsInVn(s[0])]+=First[IsInVn(s[j])];
j=j+1;//取下一个符号
while(j<G[i].length()&&s[j]!='|') {
First[IsInVn(s[0])]+=First[IsInVn(s[j])];
if(IsInFirst(First[IsInVn(s[j])],'ε')!=999) {
j++;
} else {
break;
}
}
}//步骤2中的过程
}
} else {//如果第一个后面的是终结符
First[IsInVn(s[0])]+=s[j];
}
}
public void Get_First() {//求解单个非终结符first集
int i,j;
for(i=0;i<G.length;i++) {
if(G[i]!=null) {
char s[]=G[i].toCharArray();
j=0;
if(IsInVn(s[j])!=999) {//如果第一个是非终结符
j=j+3;
First_Call(s,j,i);
while(j<s.length) {
if(s[j]=='|') {//判断|,继续后续的操作
j++;
First_Call(s,j,i);
} else {
j++;
}
}
}
}
}
}
public void First_Finally() {
int i;
int Count[]=new int[VN.length];//存放当前first集中元素的个数
int Count1[]=new int[VN.length];//存放执行后first集中元素的个数
Count[0]=1;//不等进行循环
while(Check(Count,Count1)==false) {
for(i=0;i<VN.length;i++) {
if(First[i]!=null) {
Count[i]=First[i].length();
} else {
Count[i]=0;
}
}
Get_First();
for(i=0;i<VN.length;i++) {
if(First[i]!=null) {
First[i]=Simply(First[i]);
}
}
for(i=0;i<VN.length;i++) {
if(First[i]!=null) {
Count1[i]=First[i].length();
} else {
Count1[i]=0;
}
}
}
}
public String DeleteCharString(String sourceString, char chElemData) {//删除特定的字符从字符串中
String tmpString = "";
tmpString += chElemData;
StringBuffer stringBuffer = new StringBuffer(sourceString);
int iFlag = -1;
do {
iFlag = stringBuffer.indexOf(tmpString);
if (iFlag != -1) {
stringBuffer.deleteCharAt(iFlag);
}
} while (iFlag != -1);
return stringBuffer.toString();
}
public String Get_First_String(String t) {//求字符串的First集
char s[]=t.toCharArray();
int i=0;
String temp="";
if(IsInVn(s[i])!=999) {//如果是非终结符
if(IsInFirst(First[IsInVn(s[i])],'ε')!=999) {
temp+=First[IsInVn(s[i])];
temp=DeleteCharString(temp, 'ε');
} else {
temp+=First[IsInVn(s[i])];
}
} else {//否则是终结符
if(s[i]!='ε') {
temp+=s[i];
}
}
while(i<s.length) {//循环执行
if(IsInVn(s[i])==999) {
break;
} else {
if(IsInFirst(First[IsInVn(s[i])],'ε')!=999) {
i++;
if(i<s.length) {
if(IsInVn(s[i])!=999) {//如果是非终结符
if(IsInFirst(First[IsInVn(s[i])],'ε')!=999) {
temp+=First[IsInVn(s[i])];
temp=DeleteCharString(temp, 'ε');
} else {
temp+=First[IsInVn(s[i])];
break;
}
} else {//否则是终结符
if(s[i]!='ε') {
temp+=s[i];
break;
}
}
} else {
break;
}
} else {
break;
}
}
}
if(s[0]=='ε'||i==s.length) {//每个字符的first集中都含有ε
temp+="ε";
}
return temp;
}
//求解Follow集
public void Follow_Call(char s[],int j) {//求解follow子过程
while(j<s.length) {
if(IsInVn(s[j])!=999) {//如果推导式后面的是非终结符
String temp="";
int k=j+1;
while(k<s.length&&s[k]!='|') {
temp+=s[k];
k++;
}
//System.out.println(temp);
if(temp=="") {//条件3
Follow[IsInVn(s[j])]+=Follow[IsInVn(s[0])];
} else {
if(IsInFirst(Get_First_String(temp),'ε')!=999) {
Follow[IsInVn(s[j])]+=Follow[IsInVn(s[0])];
}
temp=Get_First_String(temp);
temp=DeleteCharString(temp,'ε');
Follow[IsInVn(s[j])]+=temp;
}
}
j++;
}
}
public void Get_Follow() {//求解单个非终结符first集
int i,j;
for(i=0;i<G.length;i++) {
if(G[i]!=null) {
char s[]=G[i].toCharArray();
j=0;
if(IsInVn(s[j])!=999) {//如果第一个是非终结符
j=j+3;
Follow_Call(s,j);
while(j<s.length) {
if(s[j]=='|') {//判断|,继续后续的操作
j++;
Follow_Call(s,j);
} else {
j++;
}
}
}
}
}
}
public void Follow_Finally() {
int i;
int Count[]=new int[VN.length];//存放当前first集中元素的个数
int Count1[]=new int[VN.length];//存放执行后first集中元素的个数
Count[0]=1;//不等进行循环
while(Check(Count,Count1)==false) {
for(i=0;i<VN.length;i++) {
if(Follow[i]!=null) {
Count[i]=Follow[i].length();
} else {
Count[i]=0;
}
}
Get_Follow();
for(i=0;i<VN.length;i++) {
if(Follow[i]!=null) {
Follow[i]=Simply(Follow[i]);
}
}
for(i=0;i<VN.length;i++) {
if(Follow[i]!=null) {
Count1[i]=Follow[i].length();
} else {
Count1[i]=0;
}
}
}
}
//获得同号符组
public void Get_Same() {
int i,j;
for(i=0;i<VN.length;i++) {
if(VN[i]!=0) {
for(j=0;j<Follow[i].length();j++) {
if(M[i][IsInVt(Follow[i].charAt(j))]==null) {
M[i][IsInVt(Follow[i].charAt(j))]="synch";
}
}
}
}
}
//构造M预测分析表
public void Get_Mtable_Call(char s[],int j) {
int i,k;
//String temp="";
StringBuilder temp=new StringBuilder();
String temp1="";
while(j<s.length&&s[j]!='|') {//当没有结束时
temp.append(s[j]);//获取字符串
j++;
}
temp1=Get_First_String(temp.toString());
for(k=0;k<temp1.length();k++) {//对应第一条
//System.out.println(s[0]);
//System.out.println(temp1.charAt(k));
System.out.println(IsInVt(temp1.charAt(k)));
System.out.println(temp1.charAt(k));
M[IsInVn(s[0])][IsInVt(temp1.charAt(k))]=s[0]+"->"+temp.toString();
}
//进行第二条的判断
if(IsInFirst(temp1,'ε')!=999) {//ε存在它的first集中
for(i=0;i<Follow[IsInVn(s[0])].length();i++) {
M[IsInVn(s[0])][IsInVt(Follow[IsInVn(s[0])].charAt(i))]=s[0]+"->"+temp;
}
}
}
public void Get_Mtable() {
int i,j;
for(i=0;i<G.length;i++) {
if(G[i]!=null) {
char s[]=G[i].toCharArray();
j=3;
Get_Mtable_Call(s,j);
while(j<s.length) {
if(s[j]=='|') {//判断|,继续后续的操作
j++;
Get_Mtable_Call(s,j);
} else {
j++;
}
}
}
}
Get_Same();
}
//输出堆栈中的内容
public String Print_Stack(Stack<Character> stack) {
String s=stack.toString();//将其转化为字符串
String t="";
int i;
for(i=0;i<s.length();i++) {
if(s.charAt(i)!='['&&s.charAt(i)!=','&&s.charAt(i)!=']'&&s.charAt(i)!=' ') {
t+=s.charAt(i);//将其中的字符相加为所要求的字符串
}
}
return t;
}
//输出剩余字符串的内容
public String Print_Buffer(String s,int j) {
String t="";
while(j<s.length()) {
t+=s.charAt(j);
j++;
}
return t;
}
//预测文法分析
public void Run_Mtable() {
int i=0;
int j,k;
String Operate="初始化";
getstr = j5.getText();
Stack<Character> stack = new Stack<Character>(); // 创建堆栈对象
stack.push('#');
stack.push(VN[0]);
System.out.print(Print_Stack(stack)+" ");
System.out.print(Print_Buffer(getstr,i)+" ");
System.out.print(" ");
System.out.println(Operate);
int g=h;
data[h++]=new Object[]{g,Print_Stack(stack),Print_Buffer(getstr,i),"",Operate};
char X=stack.peek();
while(X!='#') {//栈非空
Operate="POP,PUSH(";
if(stack.peek()==getstr.charAt(i)) {
stack.pop();i++;//执行栈的弹出操作,并且指针前移
Operate="GETNEXT(I)";
System.out.print(Print_Stack(stack)+" ");
System.out.print(Print_Buffer(getstr,i)+" ");
System.out.print(" ");
System.out.println(Operate);
int g1=h;
data[h++]=new Object[]{g1,Print_Stack(stack),Print_Buffer(getstr,i),"",Operate};
} else {
if(IsInVt(X)!=999&&X!='ε') {//x是一个终结符
stack.pop();//执行栈的弹出操作
int g1=h;
data[h++]=new Object[]{g1,Print_Stack(stack),Print_Buffer(getstr,i),"","错误,出栈栈顶"};
} else {
if(M[IsInVn(X)][IsInVt(getstr.charAt(i))]==null||M[IsInVn(X)][IsInVt(getstr.charAt(i))]=="synch") {//对应的为报错条目
if(M[IsInVn(X)][IsInVt(getstr.charAt(i))]==null) {
int g1=h;
data[h++]=new Object[]{g1,Print_Stack(stack),Print_Buffer(getstr,i),"","错误,跳过"+getstr.charAt(i)};
i++;
} else {
if(M[IsInVn(X)][IsInVt(getstr.charAt(i))]=="synch"&&X==VN[0]) {
int g1=h;
data[h++]=new Object[]{g1,Print_Stack(stack),Print_Buffer(getstr,i),"","错误,跳过"+getstr.charAt(i)};
i++;
} else {
int g1=h;
data[h++]=new Object[]{g1,Print_Stack(stack),Print_Buffer(getstr,i),"","错,M["+X+","+getstr.charAt(i)+"]=synch"};
stack.pop();
}
}
} else {
if(M[IsInVn(X)][IsInVt(getstr.charAt(i))]!=null) {
k=M[IsInVn(X)][IsInVt(getstr.charAt(i))].length();
String temp=M[IsInVn(X)][IsInVt(getstr.charAt(i))];
stack.pop();
for(j=k-1;j>=3;j--) {
if(temp.charAt(j)!='ε') {
stack.push(temp.charAt(j));
Operate+=temp.charAt(j);
}
}
if(temp.charAt(j+1)!='ε') {
Operate+=")";
} else {
Operate="POP";
}
System.out.print(Print_Stack(stack)+" ");
System.out.print(Print_Buffer(getstr,i)+" ");
System.out.print(temp+" ");
System.out.println(Operate);
int g1=h;
data[h++]=new Object[]{g1,Print_Stack(stack),Print_Buffer(getstr,i),temp,Operate};
}
}
}
}
X=stack.peek();
}
}
//获取系统的日期
public String Get_Date() {
Date date = new Date();
SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd");
String dateNowStr = sdf.format(date);
return dateNowStr;
}
public void Get_Time() {
Timer tmr = new Timer();
tmr.scheduleAtFixedRate(new JLabelTimerTask(),new Date(), ONE_SECOND);
}
public int Get_NotNull_B(String str[]) {//返回最小为空的下标
int i;
int sum=0;
for(i=0;i<100;i++) {
if(str[i]!=null) {
sum++;
}
}
return sum;
}
public int Get_NotNull_B(char str[]) {//返回最小为空的下标
int i;
int sum=0;
for(i=0;i<100;i++) {
if(str[i]!=0) {
sum++;
}
}
return sum;
}
public void Get_VN_VT() {//获得非终结符以及终结符
int i,j,h;
for(i=0;i<100;i++) {
if(G[i]!=null) {
for(j=0;j<G[i].length();j++) {
if(G[i].charAt(j)<='Z'&&G[i].charAt(j)>='A') {
if(IsInVn(G[i].charAt(j))==999) {
h=Get_NotNull_B(VN);
VN[h]=G[i].charAt(j);
}
} else {
if(j!=1&&j!=2&&G[i].charAt(j)!='|') {
if(IsInVt(G[i].charAt(j))==999) {
h=Get_NotNull_B(VT);
VT[h]=G[i].charAt(j);
}
}
}
}
}
}
if(IsInVt('#')==999) {
h=Get_NotNull_B(VT);
VT[h]='#';
}
if(IsInVt('ε')==999) {
h=Get_NotNull_B(VT);
VT[h]='ε';
}
}
public void Print() {
int j;
for(int i=0;i<VN.length;i++) {
if(VN[i]!=0) {
j13.append(VN[i]+"的FIRST集为: ");
if(First[i]!=null) {
for(j=0;j<First[i].length();j++) {
j13.append(First[i].charAt(j)+" ");
}
}
System.out.println(First[i]);
j13.append("\n");
}
}
}
public void Print1() {
int j;
for(int i=0;i<VN.length;i++) {
if(VN[i]!=0) {
j14.append(VN[i]+"的FOLLOW集为: ");
if(Follow[i]!=null) {
for(j=0;j<Follow[i].length();j++) {
j14.append(Follow[i].charAt(j)+" ");
}
}
System.out.println(Follow[i]);
j14.append("\n");
}
}
}
public void Print2() {
j15.append(" ");
for(int k=0;k<VT.length;k++) {
if(VT[k]!=0) {
j15.append("\t"+VT[k]);
}
}
j15.append("\n");
for(int i=0;i<VN.length;i++) {
if(VN[i]!=0) {
j15.append(VN[i]+"\t");
for(int j=0;j<VT.length;j++) {
if(VT[j]!=0) {
j15.append(M[i][j]+"\t");
System.out.print(M[i][j]+" ");
}
}
System.out.println();
j15.append("\n");
}
}
}
public void Print4() {
for(int i=0;i<100;i++) {
if(G[i]!=null) {
System.out.println(G[i]);
}
}
}
public void Print5() {
for(int i=0;i<100;i++) {
if(VN[i]!=0) {
System.out.print(VN[i]);
}
}
System.out.println();
}
public void Print6() {
for(int i=0;i<100;i++) {
if(VT[i]!=0) {
System.out.print(VT[i]);
}
}
}
//将表格清空
public void Get_Clear() {
int i;
for(i=0;i<50;i++) {
data[i]=new Object[]{"","","","",""};
}
}
LL1() {
setTitle("LL(1)语法分析器");
final JButton j4 = new JButton("浏览");
j4.addActionListener(new ActionListener() {
public void actionPerformed(final ActionEvent e) {
JFileChooser fileChooser = new JFileChooser();// 创建文件选择器
FileFilter filter = new FileNameExtensionFilter(
"文件(txt/docx/doc/java/cpp/asm)", "txt","docx","doc","java","cpp","asm");// 创建过滤器
fileChooser.setFileFilter(filter);// 设置过滤器
int flag = fileChooser.showOpenDialog(null);// 显示打开对话框
if (flag == JFileChooser.APPROVE_OPTION) {
imgFile = fileChooser.getSelectedFile(); // 获取选中文件的File对象
}
if (imgFile != null) {
j3.setText(imgFile.getAbsolutePath());// 文件完整路径
}
}
});
final JButton j1 = new JButton("显示");
j1.addActionListener(new ActionListener() {
public void actionPerformed(final ActionEvent e) {
try {
in1=new BufferedReader(new FileReader
(imgFile.getAbsoluteFile()));
} catch (FileNotFoundException e2) {
// TODO Auto-generated catch block
e2.printStackTrace();
}//获得绝对路径
String s;
j12.setText("");
try {
while((s=in1.readLine())!=null) {
j12.append(s);
int h=Get_NotNull_B(G);
G[h]=s;
j12.append("\n");
//System.out.println(G[h]);
}
in1.close();
} catch (IOException e1) {
// TODO Auto-generated catch block
e1.printStackTrace();
}
Get_VN_VT();
}
});
final JButton j2 = new JButton("分析");
j2.addActionListener(new ActionListener() {
public void actionPerformed(final ActionEvent e) {
Get_Clear();
h=0;
j15.setText("");//清除文本域
j13.setText("");
j14.setText("");
Init();
First_Finally();
Follow_Finally();
Get_Mtable();
Print4();
Print5();
Print6();
Run_Mtable();
Print();
Print1();
Print2();
jsPane.validate();
jsPane.repaint();
Get_Date();
}
});
j3 = new JTextField();
j5 = new JTextArea();
j12 = new JTextArea();
j13 = new JTextArea();
j14 = new JTextArea();
j15 = new JTextArea();
//model = new DefaultTableModel(data, colname);
//table = new JTable(model);
table = new JTable(data,colname);
//表头居中
((DefaultTableCellRenderer)table.getTableHeader().getDefaultRenderer()).setHorizontalAlignment(JLabel.CENTER);
//表格内容居中
DefaultTableCellRenderer renderer = new DefaultTableCellRenderer();// 设置table内容居中
renderer.setHorizontalAlignment(DefaultTableCellRenderer.CENTER);
table.setDefaultRenderer(Object.class, renderer);
jsPan = new JScrollPane(j5);
Border titleBorder2=BorderFactory.createTitledBorder("输入字符串");
jsPan.setBorder(titleBorder2);
jsPane = new JScrollPane(table);
Border titleBorder3=BorderFactory.createTitledBorder("结果分析");
jsPane.setBorder(titleBorder3);
jsPan1=new JScrollPane(j12);
Border titleBorder1=BorderFactory.createTitledBorder("文法");
jsPan1.setBorder(titleBorder1);
jsPan4=new JScrollPane(j13);
Border titleBorder4=BorderFactory.createTitledBorder("FIRST");
jsPan4.setBorder(titleBorder4);
jsPan2=new JScrollPane(j14);
Border titleBorder5=BorderFactory.createTitledBorder("FOLLOW");
jsPan2.setBorder(titleBorder5);
jsPan3=new JScrollPane(j15);
Border titleBorder6=BorderFactory.createTitledBorder("预测分析表");
jsPan3.setBorder(titleBorder6);
layout = new GridBagLayout();
j8=new JLabel("LL(1)",JLabel.CENTER);
j8.setBorder(BorderFactory.createEtchedBorder());
j9=new JLabel(Get_Date(),JLabel.CENTER);
j9.setBorder(BorderFactory.createEtchedBorder());
j10=new JLabel("54",JLabel.CENTER);
j10.setBorder(BorderFactory.createEtchedBorder());
this.setLayout(layout);
this.add(j1);
this.add(j2);
this.add(j3);
this.add(j4);
this.add(jsPan);
this.add(jsPan1);
this.add(jsPan3);
this.add(jsPan4);
this.add(jsPan2);
this.add(jsPane);
this.add(j8);
this.add(j9);
this.add(j10);
s= new GridBagConstraints();//定义一个GridBagConstraints,
//是用来控制添加进的组件的显示位置
s.fill = GridBagConstraints.BOTH;
//该方法是为了设置如果组件所在的区域比组件本身要大时的显示情况
//NONE:不调整组件大小。
//HORIZONTAL:加宽组件,使它在水平方向上填满其显示区域,但是不改变高度。
//VERTICAL:加高组件,使它在垂直方向上填满其显示区域,但是不改变宽度。
//BOTH:使组件完全填满其显示区域。
s.gridwidth=2;//该方法是设置组件水平所占用的格子数,如果为0,就说明该组件是该行的最后一个
s.weightx = 0;//该方法设置组件水平的拉伸幅度,如果为0就说明不拉伸,不为0就随着窗口增大进行拉伸,0到1之间
s.weighty=0;//该方法设置组件垂直的拉伸幅度,如果为0就说明不拉伸,不为0就随着窗口增大进行拉伸,0到1之间
layout.setConstraints(j1, s);//设置组件
s.gridwidth=2;
s.weightx = 0;
s.weighty=0;
layout.setConstraints(j2, s);
s.gridwidth=2;
s.weightx = 1;
s.weighty=0;
layout.setConstraints(j3, s);
s.gridwidth=0;//该方法是设置组件水平所占用的格子数,如果为0,就说明该组件是该行的最后一个
s.weightx = 0;//不能为1,j4是占了4个格,并且可以横向拉伸,
s.weighty=0;
layout.setConstraints(j4, s);
s.gridwidth=2;
s.weightx = 1;
s.weighty=0;
layout.setConstraints(jsPan1, s);
s.gridwidth=2;
s.weightx = 1;
s.weighty=1;
layout.setConstraints(jsPan, s);
s.gridwidth=0;
s.weightx = 1;
s.weighty=1;
layout.setConstraints(jsPan3, s);
s.gridwidth=2;
s.weightx = 1;
s.weighty=1;
layout.setConstraints(jsPan4, s);
s.gridwidth=2;
s.weightx = 1;
s.weighty=1;
layout.setConstraints(jsPan2, s);
s.gridwidth=0;
s.weightx = 1;
s.weighty=1;
layout.setConstraints(jsPane, s);
s.gridwidth=4;
s.weightx = 1;
s.weighty=0;
layout.setConstraints(j8, s);
s.gridwidth=3;
s.weightx = 1;
s.weighty=0;
layout.setConstraints(j9, s);
s.gridwidth=0;
s.weightx = 1;
s.weighty=0;
layout.setConstraints(j10, s);
}
protected class JLabelTimerTask extends TimerTask{
SimpleDateFormat dateFormatter = new SimpleDateFormat(DEFAULT_TIME_FORMAT);
@Override
public void run() {
time = dateFormatter.format(Calendar.getInstance().getTime());
j10.setText(time);
}
}
public static void main(String args[]) {
try {//使用默认窗口形式
UIManager
.setLookAndFeel("com.sun.java.swing.plaf.nimbus.NimbusLookAndFeel");
} catch (Throwable e) {
e.printStackTrace();
}
EventQueue.invokeLater(new Runnable() {
public void run() {
try {
LL1 alr = new LL1();
alr.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
alr.setBounds(300,200,400,400);
alr.setVisible(true);
alr.Get_Time();//动态显示时间
} catch (Exception e) {
e.printStackTrace();
}
}
});
}
}
Java 语法分析LL1
最新推荐文章于 2021-02-12 13:44:03 发布