GUI(Graphics User Interface):图形用户界面,gui编程即图形用户界面编程.
容器类(Container)和组件类(Component):Component的子类是Container,即容器本身也是一个组件,Container的子类有JComponent和Window,JComponent里包含JButton,JLable等常用组件,Window里包含JFrame,JDialog等常用容器.
做一个简单的求一元二次方程根的图形界面
窗口类:创建一个JFrame的子类,图形界面的组成以及点击按钮所做的操作都放在窗口类里.
package 求一元二次方程根;
import javax.swing.*;/*java后期新增的界面设计包*/
import java.awt.*;/*java早期进行进行用户界面设计时使用的包*/
import java.awt.event.*;/*引入ActionListener接口*/
import static javax.swing.JFrame.*;/*引入JFrame中的静态常量*/
class Win extends JFrame implements ActionListener{/*父类是JFrame,接口是ActionListener*/
JLabel b1=new JLabel("二次项系数");
JLabel b2=new JLabel("一次项系数");
JLabel b3=new JLabel("常数");
JLabel b4=new JLabel("方程的根");/*标签即提示信息,直接在构造方法里输入字符串*/
JTextField tf1=new JTextField(10);
JTextField tf2=new JTextField(10);
JTextField tf3=new JTextField(10);
JTextField tf4=new JTextField(50);/*文本框是用户输入信息的地方,构造方法用来设置宽度*/
JButton btn1=new JButton("求根");
JButton btn2=new JButton("清空");/*按钮的构造方法是按钮上显示的内容*/
Win(String s,int w,int h)/*关于界面的组成和布局都写在构造方法里,构造方法的三个参数是窗口标题、长、宽*/
{super(s);
setSize(w,h);
setVisible(true);
setDefaultCloseOperation(EXIT_ON_CLOSE) ;/*以上三个方法在创建窗口时必须调用,其中setDfaultCloseOperation参数是int型static常量*/
setLayout(new FlowLayout());/*流式布局*/
add(b1);
add(tf1);
add(b2);
add(tf2);
add(b3);
add(tf3);
add(b4);
add(tf4);/*由于采用流式布局,界面上显示的顺序即添加的顺序*/
tf4.setEnabled(false);/*使文本框只能显示内容,不可编辑,如果使用setEditable(boolean b)也可以使文本框不可编辑,但是我试了一下这样会使两个按钮消失,我也不知道为什么会这样?*/
add(btn1);
add(btn2);
btn1.addActionListener(this);/*方法中的参数是接口类型,当组件使用这个方法时,能将这一个类型的接口的类的实例注册为事件源的监视器,而this表示当前类的实例会成为btn1的监视器,即action类型接口的实例*/
btn2.addActionListener(this);
}
public void actionPerformed(ActionEvent e)/*重写接口中的唯一方法,传入的e是ActionEvent类的对象*/
{if(e.getSource()==btn1)/*通过getsource区分事件源,以下是点击btn1的操作*/
{String s1=tf1.getText();
String s2=tf2.getText();
String s3=tf3.getText();
try/*由于要将字符串转换为整形,可能存在输入的不仅是整形的情况,如不小心输入12a,所以要用try-catch*/
{int a=Integer.parseInt(s1);
int b=Integer.parseInt(s2);
int c=Integer.parseInt(s3);
if(a==0) tf4.setText("不是一元二次方程");
else {
if(b*b-4*a*c<0)
tf4.setText("无实数根");
if(b*b-4*a*c==0)
tf4.setText(-b/(2*a)+"");/*通过数字+""直接将数字转化为字符串*/
if(b*b-4*a*c>0)
{double d1=(-b+Math.sqrt(b*b-4*a*c))/(2*a);
double d2=(-b-Math.sqrt(b*b-4*a*c))/(2*a);
tf4.setText(d1+" "+d2);
}
}
}
catch(Exception p) {
System.out.println("重新输入数据");/*也可以改成JOptionPane.showMessageDialog(null, "请重新输入数据");会弹出消息图形对话框*/
}
}
if(e.getSource()==btn2)
tf1.setText(null);
tf2.setText(null);
tf3.setText(null);
tf4.setText(null);
}
}
}
Test类:只放主程序
package 求一元二次方程根;
public class Test {public static void main(String args[]) {
Win Win1=new Win("一元二次方程求根",1000,1000);
}
}
运行结果如下: