上机课实验:计算器
源代码:
package diyishiba;
import java.awt.*;
import javax.swing.*;
public class Jisuanqi {
public static void main(String[] args) {
JFrame jfr=new JFrame("计算器");
JTextField jte=new JTextField(30);
JButton jbu11=new JButton("%");
JButton jbu12=new JButton("sqrt");
JButton jbu13=new JButton("pow");
JButton jbu14=new JButton("1/x");
JButton jbu21=new JButton("CE");
JButton jbu22=new JButton("C");
JButton jbu23=new JButton("<--");
JButton jbu24=new JButton("/");
JButton jbu31=new JButton("7");
JButton jbu32=new JButton("8");
JButton jbu33=new JButton("9");
JButton jbu34=new JButton("*");
JButton jbu41=new JButton("4");
JButton jbu42=new JButton("5");
JButton jbu43=new JButton("6");
JButton jbu44=new JButton("-");
JButton jbu51=new JButton("1");
JButton jbu52=new JButton("2");
JButton jbu53=new JButton("3");
JButton jbu54=new JButton("+");
JButton jbu61=new JButton("+/-");
JButton jbu62=new JButton("0");
JButton jbu63=new JButton(".");
JButton jbu64=new JButton("=");
jfr.setLayout(null);
jte.setBounds(10, 10, 333, 80);
jbu11.setBounds(10, 90, 83, 40);
jbu12.setBounds(93, 90, 83, 40);
jbu13.setBounds(176, 90, 83, 40);
jbu14.setBounds(259, 90, 83, 40);
jbu21.setBounds(10, 130, 83, 40);
jbu22.setBounds(93, 130, 83, 40);
jbu23.setBounds(176, 130, 83, 40);
jbu24.setBounds(259, 130, 83, 40);
jbu31.setBounds(10, 170, 83, 40);
jbu32.setBounds(93, 170, 83, 40);
jbu33.setBounds(176, 170, 83, 40);
jbu34.setBounds(259, 170, 83, 40);
jbu41.setBounds(10, 210, 83, 40);
jbu42.setBounds(93, 210, 83, 40);
jbu43.setBounds(176, 210, 83, 40);
jbu44.setBounds(259, 210, 83, 40);
jbu51.setBounds(10, 250, 83, 40);
jbu52.setBounds(93, 250, 83, 40);
jbu53.setBounds(176, 250, 83, 40);
jbu54.setBounds(259, 250, 83, 40);
jbu61.setBounds(10, 290, 83, 40);
jbu62.setBounds(93, 290, 83, 40);
jbu63.setBounds(176, 290, 83, 40);
jbu64.setBounds(259, 290, 83, 40);
jfr.add(jte);
jfr.add(jbu11);
jfr.add(jbu12);
jfr.add(jbu13);
jfr.add(jbu14);
jfr.add(jbu21);
jfr.add(jbu22);
jfr.add(jbu23);
jfr.add(jbu24);
jfr.add(jbu31);
jfr.add(jbu32);
jfr.add(jbu33);
jfr.add(jbu34);
jfr.add(jbu41);
jfr.add(jbu42);
jfr.add(jbu43);
jfr.add(jbu44);
jfr.add(jbu51);
jfr.add(jbu52);
jfr.add(jbu53);
jfr.add(jbu54);
jfr.add(jbu61);
jfr.add(jbu62);
jfr.add(jbu63);
jfr.add(jbu64);
jfr.setSize(375, 370);
jfr.setVisible(true);
}
}
运行截图:
课程总结:
其他容器:
一、JPanel
用途:
应用:可以将多个组件加入到JPanel
中实现复杂的排列。
如下图所示:
JPanel
类的常用方法:
序号 | 方法 | 类型 | 描述 |
---|---|---|---|
1 | public JPanel() | 构造 | 创建一个默认的JPanel对象,使用流布局管理 |
2 | public JPanel(LayoutManager layout) | 构造 | 创建一个指定布局管理器的JPanel对象 |
例子:
package diyishiba;
import java.awt.*;
import javax.swing.*;
public class JPanelDemo01 {
public static void main(String[] args) {
JFrame jfr=new JFrame("窗口");
JPanel jpa=new JPanel();
jpa.add(new JLabel("一"));
jpa.add(new JLabel("棵"));
jpa.add(new JLabel("树"));
jpa.add(new JButton("JAVA"));
jpa.add(new JButton("好"));
jpa.add(new JButton("难"));
jfr.add(jpa);
jfr.setSize(400, 300);
jfr.setVisible(true);
}
}
运行截图:
二、JSplitPane
用途:
如下图所示:
JSplitPanel
类的主要方法及常量
例子:
package diyishiba;
import java.awt.*;
import javax.swing.*;
public class JSplitPaneDemo01 {
public static void main(String[] args) {
JFrame jfr=new JFrame("窗口");
JSplitPane jsp=new JSplitPane(JSplitPane.HORIZONTAL_SPLIT,new JLabel("这是左窗口"),new JLabel("这是右窗口"));
JSplitPane jsp1=new JSplitPane(JSplitPane.VERTICAL_SPLIT,jsp,new JLabel("这是下窗口"));
jfr.add(jsp1);
jsp.setDividerLocation(170);
jsp1.setDividerLocation(130);
jsp.setOneTouchExpandable(true);
jsp1.setOneTouchExpandable(true);
jsp.setDividerSize(3);
jfr.setSize(400, 300);
jfr.setVisible(true);
}
}
运行截图:
三、JTabbedPane
如下图所示:
JTabbedPane
类的常用方法及常量:
例子:
package diyishiba;
import java.awt.*;
import javax.swing.*;
public class JTabbedPaneDemo01 {
public static void main(String[] args) {
JFrame jfr=new JFrame("窗口");
JPanel jpa1=new JPanel();
JPanel jpa2=new JPanel();
JTabbedPane jta=new JTabbedPane(JTabbedPane.TOP);
jpa1.add(new JLabel("常规"));
jpa2.add(new JLabel("高级"));
jta.addTab("常规",jpa1);
jta.addTab("高级", jpa2);
jta.addTab("远程", null);
Container con=jfr.getContentPane();
con.add(jta);
jfr.setSize(400, 300);
jfr.setVisible(true);
}
}
运行截图:
四、JScrollPane
定义:
组成:
JScrollPane
类的常用方法及常量:
例子:
package diyishiba;
import java.awt.*;
import java.io.File;
import javax.swing.*;
public class JScrollPaneDemo01 {
public static void main(String[] args) {
JFrame jfr=new JFrame("窗口");
String path="G:"+File.separator+"程序员搞笑.jpg";
ImageIcon ic=new ImageIcon(path);
JLabel jla=new JLabel(ic);
JPanel jpa=new JPanel();
jpa.add(jla);
JScrollPane jsc=new JScrollPane(jpa,JScrollPane.VERTICAL_SCROLLBAR_ALWAYS,JScrollPane.HORIZONTAL_SCROLLBAR_AS_NEEDED);
jfr.add(jsc);
jfr.setSize(400, 300);
jfr.setVisible(true);
}
}
运行截图:
五、JDesktopPane
与JIntenrnalFrame
用途:
规定:
JDesktopPane
类的常用方法:
JInternalFrame
类的常用方法:
例子:
package diyishiba;
import java.awt.*;
import javax.swing.*;
public class JDesktopPaneDemo01 {
public static void main(String[] args) {
JFrame jfr=new JFrame("多窗口");
jfr.setLayout(new BorderLayout());
JDesktopPane jde=new JDesktopPane();
jfr.add(jde,BorderLayout.CENTER);
for(int i=0;i<3;i++) {
JInternalFrame jin=new JInternalFrame("内窗口",true,true,true,true);
JPanel jpa=new JPanel();
jpa.add(new JLabel("内窗口"+i));
jin.add(jpa);
jin.setLocation(35-i*10, 35-i*10);
jin.pack();
jin.setVisible(true);
jde.add(jin);
}
jfr.setSize(300, 270);
jfr.setVisible(true);
}
}
运行截图:
六、事件处理
事件和监听器:
如下图所示:
Java
事件处理流程
要先理解事件源与事件监听器的概念,如下所示:
处理事件的概念:
如下所示:
七、窗体事件
定义:
WindowListener
接口的方法:
例子:
实现接口
package diyishiba;
import java.awt.event.*;
import java.awt.event.WindowListener;
public class WindowListenerDemo01 implements WindowListener{
public void windowOpened(WindowEvent e) {
System.out.println("窗口被打开");
}
public void windowClosing(WindowEvent e) {
System.out.println("窗口正在被关闭");
}
@Override
public void windowClosed(WindowEvent e) {
System.out.println("窗口被关闭");
}
@Override
public void windowIconified(WindowEvent e) {
System.out.println("窗口最小化");
}
@Override
public void windowDeiconified(WindowEvent e) {
System.out.println("窗口最大化");
}
@Override
public void windowActivated(WindowEvent e) {
System.out.println("窗口被选中");
}
@Override
public void windowDeactivated(WindowEvent e) {
System.out.println("窗口没被选中");
}
}
测试类:
package diyishiba;
import java.awt.Color;
import javax.swing.*;
public class Test {
public static void main(String[] args) {
JFrame jfr=new JFrame("窗口");
WindowListenerDemo01 win=new WindowListenerDemo01();
jfr.addWindowListener(win);
JPanel jpa=new JPanel();
jpa.setBackground(Color.GRAY);
jfr.add(jpa);
jfr.setSize(400, 300);
jfr.setVisible(true);
}
}
运行截图:
八、适配器类:
定义:
例子:
package diyishiba;
import java.awt.Color;
import java.awt.event.*;
import javax.swing.*;
public class Test1 {
public static void main(String[] args) {
JFrame jfr=new JFrame("窗口");
jfr.addWindowListener(new WindowAdapter() {
public void windowClosed(WindowEvent e) {
System.out.println("窗口被关闭");
}
public void windowOpened(WindowEvent e) {
System.out.println("窗口被打开");
}
});
jfr.setSize(400, 300);
JPanel jpa=new JPanel();
jpa.setBackground(Color.BLUE);
jfr.add(jpa);
jfr.setVisible(true);
}
}
运行截图:
问题:发现窗口关闭时并没有输出语句。前面那个例子也是这样,其他的语句都能输出就是窗口关闭时的语句不能输出,不知道是哪里出现问题了。还望助教指点下。
九、动作事件及监听处理
定义:
例子:
package diyishiba;
import java.awt.*;
import java.awt.event.*;
import javax.swing.*;
class ActionListenerDemo01 {
JFrame jfr=new JFrame("窗口");
JButton jbu=new JButton("显示");
JLabel jla=new JLabel();
JTextField jte=new JTextField(10);
JPanel jpa=new JPanel();
public ActionListenerDemo01() {
Font font=new Font("幼圆",Font.BOLD+Font.ITALIC,28);
jla.setFont(font);
jla.setText("等待用户输入信息");
jbu.addActionListener(new ActionListener() {
public void actionPerformed(ActionEvent e) {
if(e.getSource()==jbu) {
jla.setText(jte.getText());
}
}
});
jfr.setLayout(new GridLayout(2,1));
jpa.setLayout(new GridLayout(1,2));
jpa.add(jte);
jpa.add(jbu);
jfr.add(jpa);
jfr.add(jla);
jfr.pack();
jfr.setVisible(true);
}
public static void main(String[] args) {
new ActionListenerDemo01();
}
}
运行截图: