Java语言程序设计--实验2:文本框、文本区和布局的设计
目的:通过编写一个Java GUI应用程序,进一步熟悉Java GUI应用程序的结构和开发过程;熟悉窗口、组件的创建、布局管理器的使用以及事件处理机制。题目:根据教材关于Java GUI的介绍,编写一个具有如上基本布局的应用程序,要求当在上面的文本区中输入若干数后(输入的多个数据之间以逗号分隔),并点击按钮,就可以在下面的文本框中分别显示出输入数据的“和”以及“平均数”。在完成上述要求的情况下,考虑改进该应用程序,从界面上去掉按钮,并且随着输入数据的变化,其“和”以及“平均数”能够立刻显示在下面的相应文本框中。要求考虑异常处理,使得程序正常运行
1.使用按钮的情况代码(支持double数字):
package swingDemo;
import java.awt.BorderLayout;
import java.awt.Dimension;
import java.awt.Font;
import java.awt.event.MouseAdapter;
import java.awt.event.MouseEvent;
import java.text.DecimalFormat;
import javax.swing.JButton;
import javax.swing.JFrame;
import javax.swing.JLabel;
import javax.swing.JOptionPane;
import javax.swing.JPanel;
import javax.swing.JTextArea;
import javax.swing.JTextField;
public class SwingDemo extends JFrame {
private static final long serialVersionUID = 1L;
private JPanel contentPanel = null;
private JTextArea textArea = null;
private JTextField sumTextField = null;
private JTextField avgTextField = null;
private JPanel mainPanel = null;
private JButton calculateBtn = null;
@SuppressWarnings("javadoc")
public SwingDemo(int width,int height) {
this.setBounds(200, 200, width, height);
this.setTitle("和与平均值");
this.contentPanel = (JPanel) this.getContentPane();
this.mainPanel = new JPanel(new BorderLayout());
initConponents();
iniEvent();
this.setVisible(true);
}
private void iniEvent() {
this.calculateBtn.addMouseListener(new MouseAdapter() {
@Override
public void mouseClicked(MouseEvent e) {
if(e.getButton() == MouseEvent.BUTTON1) {
String valueText = textArea.getText();
if(valueText == null || valueText.trim().length() == 0) {
JOptionPane.showMessageDialog(null, "输入为空!!!!");
sumTextField.setText("");
avgTextField.setText("");
}else {
String [] valuesStr =valueText.split(",");
double[] doubleValues = strValuesToDoubleValues(valuesStr);
double sum = sum(doubleValues);
double avg = avg(doubleValues);
String sumStr = fomatDouble(sum);
String avgStr = fomatDouble(avg);
sumTextField.setText(sumStr);
avgTextField.setText(avgStr);
}
}
}
});
}
private String fomatDouble(double value) {
DecimalFormat df = new DecimalFormat("#.##");
String valueStr = df.format(value);
return valueStr;
}
private double sum(double[] doubleValues) {
if ( doubleValues == null || doubleValues.length == 0) {
return 0;
}
double sum = 0;
for(double value:doubleValues ) {
sum += value;
}
return sum;
}
private double avg(double[] doubleValues) {
if ( doubleValues == null || doubleValues.length == 0) {
return 0;
}
double sum = sum(doubleValues) ;
double avg = sum / doubleValues.length ;
return avg;
}
private double[] strValuesToDoubleValues(String[] valueStr) {
if (valueStr == null || valueStr.length == 0) {
return null;
}
double[] doubleValues = new double[valueStr.length];
try {
for(int i = 0;i < valueStr.length; i++) {
String str = valueStr[i].trim();
doubleValues[i] = Double.parseDouble(str);
}
} catch (NumberFormatException e) {
e.printStackTrace();
doubleValues = null;
JOptionPane.showMessageDialog(null, "输入有误,请以英文逗号分开每个数字!!");
}
return doubleValues;
}
private void initConponents() {
Font font = new Font("微软雅黑", Font.BOLD, 16);
this.textArea = new JTextArea();
this.textArea.setPreferredSize(new Dimension(300,100));
this.textArea.setFont(font);
this.sumTextField = new JTextField();
this.sumTextField.setFont(font);
this.sumTextField.setEditable(false);
this.sumTextField.setPreferredSize(new Dimension(300,30));
this.avgTextField = new JTextField();
this.avgTextField.setFont(font);
this.avgTextField.setEditable(false);
this.avgTextField.setPreferredSize(new Dimension(300, 30));
this.calculateBtn = new JButton("计算");
calculateBtn.setPreferredSize(new Dimension(60, 30));
JPanel texAreaPanel = new JPanel();
texAreaPanel.setPreferredSize(new Dimension(350,150));
texAreaPanel.add(this.textArea);
this.mainPanel.add(texAreaPanel, BorderLayout.NORTH);
JPanel sumTextFieldPanel = new JPanel();
sumTextFieldPanel.setPreferredSize(new Dimension(350, 50));
JLabel sumTextLable = new JLabel("和值");
sumTextFieldPanel.add(sumTextLable);
sumTextFieldPanel.add(this.sumTextField);
JPanel avgTextFieldPanel = new JPanel();
avgTextFieldPanel.setPreferredSize(new Dimension(350, 50));
JLabel avgTextFieldLable = new JLabel("均值");
avgTextFieldPanel.add(avgTextFieldLable);
avgTextFieldPanel.add(this.avgTextField);
JPanel btnPanel = new JPanel();
btnPanel.add(calculateBtn);
JPanel centerPanel = new JPanel();
centerPanel.add(sumTextFieldPanel);
centerPanel.add(avgTextFieldPanel);
centerPanel.add(btnPanel);
this.mainPanel.add(centerPanel, BorderLayout.CENTER);
this.contentPanel.add(mainPanel);
}
public static void main(String[] args) {
new SwingDemo(400, 400);
}
}
运行实例图片:输入: 1 2 4.5 中间以英文逗号隔开,结果为:和值:7.5,均值:2.5
没有按钮,实时更新输入时的均值和和值(支持double数字)
package swingDemo;
import java.awt.BorderLayout;
import java.awt.Dimension;
import java.awt.Font;
import java.awt.event.MouseAdapter;
import java.awt.event.MouseEvent;
import java.text.DecimalFormat;
import javax.swing.JButton;
import javax.swing.JFrame;
import javax.swing.JLabel;
import javax.swing.JOptionPane;
import javax.swing.JPanel;
import javax.swing.JTextArea;
import javax.swing.JTextField;
import javax.swing.event.DocumentEvent;
import javax.swing.event.DocumentListener;
public class SwingDemo2 extends JFrame {
private static final long serialVersionUID = 1L;
private JPanel contentPanel = null;
private JTextArea textArea = null;
private JTextField sumTextField = null;
private JTextField avgTextField = null;
private JPanel mainPanel = null;
@SuppressWarnings("javadoc")
public SwingDemo2(int width,int height) {
this.setBounds(200, 200, width, height);
this.setTitle("和与平均值");
this.contentPanel = (JPanel) this.getContentPane();
this.mainPanel = new JPanel(new BorderLayout());
initConponents();
iniEvent();
this.setVisible(true);
}
private void iniEvent() {
this.textArea.getDocument().addDocumentListener(new DocumentListener() {
@Override
public void removeUpdate(DocumentEvent e) {
textAreaAction();
}
@Override
public void insertUpdate(DocumentEvent e) {
textAreaAction();
}
@Override
public void changedUpdate(DocumentEvent e) {
textAreaAction();
}
});
}
private void textAreaAction() {
String valueText = textArea.getText();
if (valueText == null || valueText.trim().length() == 0) {
sumTextField.setText("");
avgTextField.setText("");
} else {
String[] valuesStr = valueText.split(",");
double[] doubleValues = strValuesToDoubleValues(valuesStr);
double sum = sum(doubleValues);
double avg = avg(doubleValues);
String sumStr = fomatDouble(sum);
String avgStr = fomatDouble(avg);
sumTextField.setText(sumStr);
avgTextField.setText(avgStr);
}
}
private String fomatDouble(double value) {
DecimalFormat df = new DecimalFormat("#.##");
String valueStr = df.format(value);
return valueStr;
}
private double sum(double[] doubleValues) {
if ( doubleValues == null || doubleValues.length == 0) {
return 0;
}
double sum = 0;
for(double value:doubleValues ) {
sum += value;
}
return sum;
}
private double avg(double[] doubleValues) {
if ( doubleValues == null || doubleValues.length == 0) {
return 0;
}
double sum = sum(doubleValues) ;
double avg = sum / doubleValues.length ;
return avg;
}
private double[] strValuesToDoubleValues(String[] valueStr) {
if (valueStr == null || valueStr.length == 0) {
return null;
}
double[] doubleValues = new double[valueStr.length];
try {
for(int i = 0;i < valueStr.length; i++) {
String str = valueStr[i].trim();
doubleValues[i] = Double.parseDouble(str);
}
} catch (NumberFormatException e) {
doubleValues = null;
}
return doubleValues;
}
private void initConponents() {
Font font = new Font("微软雅黑", Font.BOLD, 16);
this.textArea = new JTextArea();
this.textArea.setPreferredSize(new Dimension(300,100));
this.textArea.setToolTipText("请以英文逗号隔开每个数");
this.textArea.setFont(font);
this.sumTextField = new JTextField();
this.sumTextField.setFont(font);
this.sumTextField.setEditable(false);
this.sumTextField.setPreferredSize(new Dimension(300,30));
this.avgTextField = new JTextField();
this.avgTextField.setFont(font);
this.avgTextField.setEditable(false);
this.avgTextField.setPreferredSize(new Dimension(300, 30));
JPanel texAreaPanel = new JPanel();
texAreaPanel.setPreferredSize(new Dimension(350,150));
texAreaPanel.add(this.textArea);
this.mainPanel.add(texAreaPanel, BorderLayout.NORTH);
JPanel sumTextFieldPanel = new JPanel();
sumTextFieldPanel.setPreferredSize(new Dimension(350, 50));
JLabel sumTextLable = new JLabel("和值");
sumTextFieldPanel.add(sumTextLable);
sumTextFieldPanel.add(this.sumTextField);
JPanel avgTextFieldPanel = new JPanel();
avgTextFieldPanel.setPreferredSize(new Dimension(350, 50));
JLabel avgTextFieldLable = new JLabel("均值");
avgTextFieldPanel.add(avgTextFieldLable);
avgTextFieldPanel.add(this.avgTextField);
JPanel centerPanel = new JPanel();
centerPanel.add(sumTextFieldPanel);
centerPanel.add(avgTextFieldPanel);
this.mainPanel.add(centerPanel, BorderLayout.CENTER);
this.contentPanel.add(mainPanel);
}
public static void main(String[] args) {
new SwingDemo2(400, 400);
}
}
ps:要想实时监听输入文本域JextArea的变化,只需要添加Document监听即可:
this.textArea.getDocument().addDocumentListener(new DocumentListener() {
@Override
public void removeUpdate(DocumentEvent e) {
}
@Override
public void insertUpdate(DocumentEvent e) {
}
@Override
public void changedUpdate(DocumentEvent e) {
}
});
运行结果:
3.项目的编码为GBK,并且版本为jdk1.8