import java.awt.Rectangle
import java.math.BigDecimal
import javax.swing.JButton
import javax.swing.JFrame
import javax.swing.JLabel
import javax.swing.JPanel
import javax.swing.JTextArea
import javax.swing.JTextField
public class Test {
private static JTextField jf =null//长度值
private static JTextField jf1 =null//宽度值
public static void main(String[] args) {
JFrame frame=new JFrame("求矩形面积")
JPanel p = new JPanel()// 建立一个面板
JLabel chang = new JLabel("长:")
chang.setBounds(new Rectangle(18, 53, 150, 38))
jf=new JTextField(20)
jf.setBounds(new Rectangle(50, 56, 150, 25))
JLabel kuan = new JLabel("宽:")
kuan.setBounds(new Rectangle(18, 107, 150, 38))
jf1=new JTextField(20)
jf1.setBounds(new Rectangle(50, 111, 150, 25))
JButton jb=new JButton("确认")
jb.setBounds(new Rectangle(18, 107*2-53, 150, 38))
jb.addActionListener(new java.awt.event.ActionListener() {
public void actionPerformed(java.awt.event.ActionEvent e) {
if(jf.getText()!=null&&jf1!=null){
JFrame f=new JFrame("结果:")
JPanel p1 = new JPanel()
String cd=jf.getText()
String kd=jf1.getText()
p1.setLayout(null)
String str = ""
boolean flag = true
if(cd.equals("")){
str+="长不能为空,"
flag = false
}
if(kd.equals("")){
str+="宽不能为空,"
flag=false
}
if(flag){
if(Double.parseDouble(cd)<=0){
str+="长度需为正数!"
flag=false
}
if(Double.parseDouble(kd)<=0){
str+="宽度需为正数!"
flag=false
}
if(flag){
str="矩形长:"+jf.getText()+",宽:"+jf1.getText()+",面积:"+mianji(cd,kd)
}
}else{
str=str.substring(0, str.length()-1)
}
JTextArea text=new JTextArea()
text.setBounds(new Rectangle(18, 40, 100, 40))
text.setText(str)
text.setEditable(false)
text.setLineWrap(true)
text.setWrapStyleWord(true)
p1.add(text)
f.add(p1)
f.setSize(200,200)
f.setLocationRelativeTo(null)
f.setVisible(true)
f.setAlwaysOnTop(true)
}
}
})
p.add(chang,null)
p.add(jf)
p.add(kuan,null)
p.add(jf1)
p.setLayout(null)
p.add(jb)
frame.add(p)//将面板添加到窗口
frame.setSize(300,300)//设置窗口大小
frame.setAlwaysOnTop(true)//设置窗口始终在最上层
frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE)//设置默认的关闭操作,关闭窗口后退出程序
frame.setLocationRelativeTo(null)//设置窗口居中
frame.setVisible(true)//设置窗口可见,尽快调用paint()方法
frame.setResizable(false)
}
/**计算面积的算法,为了使计算精确采用BigDecimal*/
public static double mianji(String cd,String kd) {
BigDecimal bdcd=new BigDecimal(cd)
BigDecimal bdkd=new BigDecimal(kd)
return bdcd.multiply(bdkd).doubleValue()
}
}
运行了下效果如图:
JAVA弹窗,有下面常见的2种方法实现:
通过JDialog(模式窗口) 类来实现.里面的写法类似JFrame
重点方法提示: setModal(true)
//当设置为true表示,如果不关闭这个弹窗,那么主界面的其他组件都无法操作,该弹窗置于其他窗口的前面
//当设置为false表示,可以绕开本弹窗,对主界面的其他组件进行操作
优点: 功能强大, 扩展性强
缺点: 代码量大.
示例图
通过JOptionPane(提示框) 来实现
效果图如下
优点: 代码量少,简单,方便, 普通场景已经够用
缺点: 扩展性不够, 复杂逻辑难以实现.
下面写一个具体案例
场景:当用于对文本域的文字,进行操作后,那么退出时,提示用户, 是否要保存已经更改后的内容. 如果用户没有修改内容,那么不用提示
重点代码
addDocumentListener-->用于实现对文本内容发生改变时进行响应
addWindowListener--->用于实现对窗口进行操作时进行响应
完整代码如下
import java.awt.Fontimport java.awt.event.*
import javax.swing.*
import javax.swing.event.*
public class JDDemo extends JFrame implements DocumentListener,WindowListener{
JTextArea jta
boolean flag
public JDDemo() {
jta = new JTextArea()//文本域
jta.setText("床前明月光")//文本域的文字-->可以通过IO加载txt文档的文字
jta.setFont(new Font("宋体",Font.BOLD, 20))//文本域的字体
jta.setLineWrap(true)//设置自动换行
jta.getDocument().addDocumentListener(this)//添加文档变化事件的响应.比如修改,删除等
JScrollPane jsp = new JScrollPane(jta)//滚动面板(当文字太多时,显示滚动条)
add(jsp)
setTitle("主窗口")//标题
setSize(300, 260)//大小
setLocationRelativeTo(null)//居中
setDefaultCloseOperation(JFrame.DO_NOTHING_ON_CLOSE)//点击窗口的关闭按钮时,执行windowClosing的代码
addWindowListener(this)
setVisible(true)//窗口可见
}
public static void main(String[] args) {
new JDDemo()
}
//实现WindowListener接口,需要重写下面的6个方法, windowClosing专门处理关闭时的方法
public void windowOpened(WindowEvent e) {
}
public void windowClosing(WindowEvent e) {
if(flag){
int n = JOptionPane.showConfirmDialog(null, "已经更改了内容,需要保存后再退出吗?", "提示",JOptionPane.YES_NO_OPTION)
//n等于-1表示关闭了弹出的对话框等情况的默认值
//n等于0(JOptionPane.YES_OPTION)表示选择了Yes
//n等于1(JOptionPane.NO_OPTION)表示选择了No
if(n==JOptionPane.YES_OPTION){
//把文字保存到文件的代码省略...
System.out.println("正在使用IO进行保存..ing")
closeFrame()//关闭窗口并退出
}else if(n==JOptionPane.NO_OPTION){
System.out.println("放弃保存修改.马上退出")
closeFrame()
}
}else{
closeFrame()
}
}
public void windowClosed(WindowEvent e) {
}
public void windowIconified(WindowEvent e) {
}
public void windowDeiconified(WindowEvent e) {
}
public void windowActivated(WindowEvent e) {
}
public void windowDeactivated(WindowEvent e) {
}
//文档事件,有下面三个,如果触发其中一个,都可以认为修改了文档,所以需要在退出时进行提示,是否保存
public void insertUpdate(DocumentEvent e) {//插入
flag=true
}
public void removeUpdate(DocumentEvent e) {//删除
flag=true
}
public void changedUpdate(DocumentEvent e) {//改变
flag=true
}
//关闭窗口的方法
public void closeFrame(){
this.setVisible(false)//窗口不可见
this.dispose()//窗口销毁
System.exit(0)//JVM虚拟机退出
}
}
运行效果图: