Java语言程序设计
第九章课后习题答案
1.编写一个程序,该程序绘制一个5×9的网络,使用drawLine方法。//NetWork类
import java.awt.Graphics;
import javax.swing.JFrame;
public class NetWork extends JFrame{
public NetWork(){
// 设置窗体大小
this.setSize(130, 130);
//设置窗体大小不可改变
this.setResizable(false);
// 设置默认关闭方式,关闭窗体的同时结束程序
this.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
// 将窗体显示出来
this.setVisible(true);
}
//横纵格之间都间隔10像素,起点在(20,40)
public void paint(Graphics g){
//绘制横向线
for(int i=0;i<=5;i++){
g.drawLine(20, 40+i*10, 110, 40+i*10);
}
//绘制纵向线
for(int i=0;i<=9;i++){
g.drawLine(20+i*10, 40, 20+i*10, 90);
}
}
}
//test9_1类
public class test9_1 {
public static void main(String[] args){
new NetWork();
}
}
运行结果:
2.编写一个程序,该程序以不同的颜色随机产生三角形,每个三角形用不同的颜色进行填充。//Triangle类
import java.awt.Color;
import java.awt.Graphics;
import java.util.Random;
import javax.swing.JFrame;
public class Triangle extends JFrame{
Random rnd = new Random();
//这里定义4个三角形
int[][] x=new int[4][3];
int[][] y=new int[4][3];
int[][] color=new int[4][3];
public Triangle(){
for(int i=0;i<4;i++){
for(int j=0;j<3;j++){
color[i][j]=rnd.nextInt(255);
x[i][j]=rnd.nextInt(i*100+100);
y[i][j]=rnd.nextInt(i*100+100)+50;//加50像素是为了避免顶到窗体上沿}
}
//窗体标题
this.setTitle("随机三角形");
//窗体大小
this.setSize(500,500);
//窗体大小不可变
this.setResizable(false);
//关闭窗体的同时结束程序
this.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
//显示窗体
this.setVisible(true);
}
public void paint(Graphics g){
for(int i=0;i<4;i++){
g.setColor(new Color(color[i][0],color[i][1],color[i][2]));
g.fillPolygon(x[i], y[i], 3);
}
}
}
//test9_2
public class test9_2 {
public static void main(String[] args){
new Triangle();
}
}
运行结果:
3.编写一个Applet,该程序请求用户输入圆的半径,然后显示该圆的直径、周长和面积。
//test9_3
import javax.swing.*;
import java.awt.*;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
public class test9_3 extends JApplet {
//声明5个标签
private JLabel jLabel1;
private JLabel jLabel2;
private JLabel jLabel3;
private JLabel jLabel4;
private JLabel jLabel5;
//1个单行文本
private JTextField textOfRadius;
//2个按钮
private JButton jButton1;
private JButton jButton2;
//初始化
public void init() {
try {
java.awt.EventQueue.invokeAndWait(new Runnable() {
public void run() {
initComponents();
}
});
} catch (Exception ex) {
ex.printStackTrace();
}
}
private void initComponents() {
//声明8个组件
jLabel1 = new JLabel("输入圆的半径:", SwingConstants.CENTER);
jLabel2 = new JLabel("圆的周长:", SwingConstants.CENTER);
jLabel3 = new JLabel("", SwingConstants.CENTER);
jLabel4 = new JLabel("圆的面积:", SwingConstants.CENTER);
jLabel5 = new JLabel("", SwingConstants.CENTER);
textOfRadius = new JTextField("半径");
jButton1 = new JButton("计算");
jButton2 = new JButton("退出");
//按钮添加监听器
jButton1.addActionListener(new ActionListener() { public void actionPerformed(ActionEvent evt) { jButton1ActionPerformed(evt);
}
});
//按钮添加监听器
jButton2.addActionListener(new ActionListener() { public void actionPerformed(ActionEvent evt) { jButton2ActionPerformed(evt);
}
});
//声明定义内容面板,并且设置其布局格式为:4行2列格子Container c = getContentPane();
c.setLayout(new GridLayout(4, 2));
//将8个组件加入到内容面板
c.add(jLabel1);
c.add(textOfRadius);
c.add(jLabel2);
c.add(jLabel3);
c.add(jLabel4);
c.add(jLabel5);
c.add(jButton1);
c.add(jButton2);
}
// 求周长方法
private String Round(double a) {
double perimeter = a * 2 * 3.14;
String s = new String(String.valueOf(perimeter));
return s;
}
// 求面积方法
private String Area(double a) {
double area = a * a * 3.14;
String s = new String(String.valueOf(area));
return s;
}
//点击“计算”按钮jButton1触发的方法
private void jButton1ActionPerformed(ActionEvent evt) {
//捕获单文本输入非数字的异常
try {
String s = textOfRadius.getText();//获得单文本字符
double a = Double.valueOf(s).floatValue();//字符转化为双精度
jLabel3.setText(Round(a));//标签内容为周长
jLabel5.setText(Area(a));//标签内容为面积
} catch (NumberFormatException r) {
//单文本为非数字弹出提示“输入错误”框
JOptionPane.showMessageDialog(this, "请输入数字类型", "输入错误",JOptionPane.WARNING_MESSAGE);
textOfRadius.setText("");
}
}
//点击“退出”按钮jButton2触发的方法
public void jButton2ActionPerformed(ActionEvent evt) {
System.exit(0);
}
}
运行结果:
编译text9_3.java产生字节码文件test9_3.class,接下来需要编写一个HTML文件text9_3.html来嵌入text9_3.class,代码如下:
将test9_3.html文件和test9_3.class文件放在同一个目录下,在浏览器中打开这个test9_3.html文件,实现的效果如下:
4.编写一个Applet,向其输入五个数,然后以条形图(bar graph)的形式来表示这些数。
5.编写一个绘制圆形的程序,当鼠标在绘制区域中单击时,该正方形的左上角顶点应准确的跟随鼠标光标移动,重绘该圆形。
//MyJFrame类
import java.awt.Graphics;
import java.awt.event.MouseEvent;
import java.awt.event.MouseListener;
import javax.swing.JFrame;
public class MyJFrame extends JFrame implements MouseListener{
int x=50;
int y=50;
int radius=50;
public MyJFrame(){
this.setTitle("绘制圆形");
this.setSize(200,200);
this.setResizable(false);
this.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
this.addMouseListener(this);
this.setVisible(true);
}
public void paint(Graphics g){
g.drawOval(x, y, radius, radius);
}
public void mouseClicked(MouseEvent e) {
// TODO Auto-generated method stub
this.x=e.getX();
this.y=e.getY();
this.repaint();
System.out.println("x: " + e.getX() + "\ny: " + e.getY()); }
public void mouseEntered(MouseEvent e) {
// TODO Auto-generated method stub
}
public void mouseExited(MouseEvent e) {
// TODO Auto-generated method stub
}
public void mousePressed(MouseEvent e) {
// TODO Auto-generated method stub
}
public void mouseReleased(MouseEvent e) {
// TODO Auto-generated method stub
}
}
//test9_5
public class test9_3 {
public static void main(String[] args){
new MyJFrame();
}
}
运行结果:
6.编写一个“猜数”程序:该程序随机在1到100的范围内选择一个供用户猜测的整数,然后改程序显示提示信息,要求用户输入一个1到100之间的整数,根据输入偏大、偏小、正确,程序将显示不同的图标。
//GuessNumber类
import java.awt.GridLayout;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.util.Random;
import javax.swing.JButton;
import javax.swing.JFrame;
import javax.swing.JLabel;
import javax.swing.JOptionPane;
import javax.swing.JTextField;
import javax.swing.SwingConstants;
public class GuessNumber extends JFrame implements ActionListener { int numberOfRandom;// 游戏程序随机数
int numberOfUser;// 玩家输入整数
JLabel label1;// 标签1:“输入一个1到100之间的整数”
JLabel label2;// 标签2:“提示”
JLabel label3;// 标签3:提示的内容(偏大、偏小、正确)
JButton buttonOfSure;// 确定按钮
JButton buttonOfExit;// 退出按钮
JTextField jTextField;// 猜数输入单行文本框
public void init() {
// 窗体的定义
this.setTitle("这是一个猜数游戏");
this.setSize(400, 120);
this.setResizable(false);
this.setLayout(new GridLayout(3, 2));
this.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
// 随机数
Random random = new Random();
numberOfRandom = random.nextInt(100);
// 各组件的定义
label1 = new JLabel("请输入一个1到100之间的整数:");
label2 = new JLabel("提示:", SwingConstants.CENTER);
label3 = new JLabel("猜猜看");
buttonOfSure = new JButton("确定");
this.getRootPane().setDefaultButton(buttonOfSure);// 默认用户按下回车键触发“确定”按钮
buttonOfSure.addActionListener(this);
buttonOfExit = new JButton("退出");
buttonOfExit.addActionListener(this);
jTextField = new JTextField("输入");
// 窗体加入各组件
this.add(label1);
this.add(jTextField);
this.add(label2);
this.add(label3);
this.add(buttonOfSure);
this.add(buttonOfExit);
// 显示窗体
this.setVisible(true);
System.out.println(numberOfRandom);// 偷偷看看随机数,哈哈}
// 事件处理
public void eventHandle() {
//捕获非整型输入异常
try {
numberOfUser = Integer.parseInt(jTextField.getText());//获得用户输入数
if (numberOfUser < 1 || numberOfUser > 100) {
JOptionPane.showMessageDialog(this, "请输入1到100之间的整数");
} else {
if (numberOfUser > numberOfRandom) {
label3.setText("偏大");
jTextField.requestFocus();//清空文本框并使重新获得焦点
}
if (numberOfUser < numberOfRandom) {
label3.setText("偏小");
jTextField.requestFocus();
}
if (numberOfUser == numberOfRandom) {
label3.setText("恭喜你,答对了。");
jTextField.requestFocus();
}
}
} catch (NumberFormatException e) {
JOptionPane.showMessageDialog(this, "请输入整数", "输入错误",
JOptionPane.WARNING_MESSAGE);
jTextField.requestFocus();
}
}
//按钮触发选择
public void actionPerformed(ActionEvent e) {
if (e.getActionCommand() == "确定") {
this.eventHandle();
}
if (e.getActionCommand() == "退出") {
System.exit(0);
}
}
public static void main(String[] args) {
new GuessNumber().init();
}
}
运行结果:
7.练习使用JscrollPane。使用BorderLayout将JFrame布局分为左右两块;左边又使用GridLayout,包含三个按钮,右边在JLabel里显示一幅图画,按钮控制JLabel是否显示滚动条。
//test9_7
import java.awt.BorderLayout;
import java.awt.Button;
import java.awt.Container;
import java.awt.GridLayout;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import javax.swing.ImageIcon;
import javax.swing.JFrame;
import javax.swing.JLabel;
import javax.swing.JOptionPane;
import javax.swing.JPanel;
import javax.swing.JScrollPane;
import javax.swing.ScrollPaneConstants;
public class test9_7 extends JFrame implements ActionListener {
private JPanel jPanel;//左边panel框
private Button button1;
private Button button2;
private Button button3;
private JScrollPane jscrollPane;//右边滚动框
private JLabel label;//滚动框中的标签
public ImageIcon picture = null;//标签中的图标
public boolean whetherCroll = true;//用于切换滚动条的显示
public void init() {
JFrame jFrame = new JFrame("练习使用JscrollPane");
Container pane = jFrame.getContentPane();
this.setDefaultCloseOperation((JFrame.EXIT_ON_CLOSE));
// 定义左边镶板JPanel框和三个按钮
jPanel = new JPanel(new GridLayout(3, 1, 0, 30));
button1 = new Button("滚动");
button1.addActionListener(this);
button2 = new Button("试试");
button2.addActionListener(this);
button3 = new Button("退出");
button3.addActionListener(this);
jPanel.add(button1);
jPanel.add(button2);
jPanel.add(button3);
// 读取图片作为图标
picture = new ImageIcon("D:/image/fuck.jpg/");
// 将图标赋给标签label
label = new JLabel(picture);
// 定义滚动框,总是显示滚动条
jscrollPane = new JScrollPane(label,
ScrollPaneConstants.VERTICAL_SCROLLBAR_ALWAYS,
ScrollPaneConstants.HORIZONTAL_SCROLLBAR_ALWAYS);
// 将左右两边的中间容器放弃JFrame中
pane.add(jPanel, BorderLayout.WEST);
pane.add(jscrollPane, BorderLayout.EAST);
//排版显示
jFrame.pack();
jFrame.setVisible(true);
}
@Override
public void actionPerformed(ActionEvent e) {
// TODO Auto-generated method stub
if (e.getActionCommand() == "滚动") {
if (whetherCroll) {
jscrollPane.setVerticalScrollBarPolicy(JScrollPane.VERTICAL_SCROLLBAR_NEVER);/ /垂直不显示
jscrollPane.setHorizontalScrollBarPolicy(JScrollPane.HORIZONTAL_SCROLLBAR_NEVE R);//水平不显示
whetherCroll = false;
} else {
jscrollPane.setVerticalScrollBarPolicy(JScrollPane.VERTICAL_SCROLLBAR_ALWAYS); //垂直显示
jscrollPane.setHorizontalScrollBarPolicy(JScrollPane.HORIZONTAL_SCROLLBAR_ALWA YS);//水平显示
whetherCroll = true;
}
}
if (e.getActionCommand() == "试试") {
JOptionPane.showMessageDialog(this,
"oh,,,Fuck your teacher? yeal……good!");
}
if (e.getActionCommand() == "退出") {
System.exit(0);
}
}
public static void main(String[] args) {
new test9_7().init();
}
}
运行结果:
显示滚动条
点击“滚动”按钮后,没显示滚动条
8.练习使用JList。建立两个JList,双击其中任何一个中的某一项,此项就会跑到另外一个JList中。
//test9_8
import java.awt.Container;
import java.awt.GridLayout;
import java.awt.event.MouseEvent;
import java.awt.event.MouseListener;
import javax.swing.DefaultListModel;
import javax.swing.JFrame;
import javax.swing.JList;
public class test9_8 extends JFrame implements MouseListener {
public JFrame jFrame;
public JList jList1;
public JList jList2;
public DefaultListModel listModel1;
public DefaultListModel listModel2;
public void init() {
JFrame jFrame = new JFrame("练习使用List");
Container pane = jFrame.getContentPane();
pane.setLayout(new GridLayout(1,2));
jFrame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
listModel1 = new DefaultListModel();
listModel1.addElement("First");
listModel1.addElement("Second");
listModel1.addElement("Third");
listModel2=new DefaultListModel();
listModel2.addElement("one");
listModel2.addElement("two");
listModel2.addElement("three");
jList1 = new JList(listModel1);
jList2=new JList(listModel2);
jList1.addMouseListener(this);
jList2.addMouseListener(this);
pane.add(jList1);
pane.add(jList2);
jFrame.pack();
jFrame.setVisible(true);
}
@Override
public void mouseClicked(MouseEvent e) {
// TODO Auto-generated method stub
if(e.getSource() == jList1){
int index = jList1.locationToIndex(e.getPoint());
Object o = jList1.getModel().getElementAt(index);
listModel2.addElement(o);
}
if(e.getSource()==jList2){
int index = jList2.locationToIndex(e.getPoint());
Object o = jList2.getModel().getElementAt(index);
listModel1.addElement(o);
}
}
@Override
public void mousePressed(MouseEvent e) {
// TODO Auto-generated method stub
}
@Override
public void mouseReleased(MouseEvent e) {
// TODO Auto-generated method stub
}
@Override
public void mouseEntered(MouseEvent e) {
// TODO Auto-generated method stub
}
@Override
public void mouseExited(MouseEvent e) {
// TODO Auto-generated method stub
}
public static void main(String[] args) {
new test9_8().init();
}
}
运行结果:
9.练习使用JComboBox。包括一个JLable、一个JComboBox,可以通过输入或者选择JComboBox 中的某一项来控制JLable中文字的大小。
//test9_9
import java.awt.Container;
import java.awt.Font;
import java.awt.GridLayout;
import java.awt.event.ItemEvent;
import java.awt.event.ItemListener;
import javax.swing.JComboBox;
import javax.swing.JFrame;
import javax.swing.JLabel;
import javax.swing.JOptionPane;
public class test9_9 extends JFrame implements ItemListener {
public JFrame jFrame;
private JLabel jLabel;
private JComboBox jComboBox;
private String[] fontSize = { "8", "14", "20", "28", "32", "40" };
public void init() {
jFrame = new JFrame("练习ComboBox");
Container container = jFrame.getContentPane();
container.setLayout(new GridLayout(2, 1));
jFrame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
jLabel = new JLabel("你好吗?");
jLabel.setFont(new Font("", 0, 10));// 设置字体大小
jComboBox = new JComboBox(fontSize);
jComboBox.setEditable(true);// 设置复选框可以输入
jComboBox.addItemListener(this);// 添加ItemListener监听
// 添加两个组件
container.add(jLabel);
container.add(jComboBox);
jFrame.pack();// 排版
jFrame.setVisible(true);// 显示
}
public void itemStateChanged(ItemEvent e) {
//使用这个判断的目的的是为了避免触发事件总是执行两次的问题
if (e.getStateChange() == ItemEvent.SELECTED) {
try {
String s = jComboBox.getSelectedItem().toString();
int intFontSize = Integer.parseInt(s);
jLabel.setFont(new Font("", 0, intFontSize));
// System.out.println(intFontSize);
} catch (NumberFormatException r) {
JOptionPane.showMessageDialog(this, "请输入整数");
}
}
}
public static void main(String[] args) {
new test9_9().init();
}
}
运行结果:
10.练习使用JTable。包括姓名、学号、语文成绩、数学成绩、总分五项,单击总分会自动将语文数学成绩相加。
import java.awt.event.*;
import javax.swing.*;
import javax.swing.table.*;
public class Test9_10 extends JFrame implements MouseListener {
private JTable jTable;
private Object[][] cellData = { { "姓名", new String("林楚金") },
{ "学号", new String("200905") }, { "语文成绩", new String("86") },
{ "数学成绩", new String("96") }, { "总分", new String("点击出总分") } };
private String[] columnNames = { "col1", "col2" };
public Test9_10() {
DefaultTableModel model = new DefaultTableModel(cellData, columnNames) { public boolean isCellEditable(int row, int column) {
return false;
}
};
jTable = new JTable(model);
jTable.addMouseListener(this);
this.add(jTable);
this.setTitle("表格演示");
this.setSize(300, 350);
this.setLocation(200, 200);
this.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
this.setVisible(true);
}
public void mouseClicked(MouseEvent e) {
DefaultTableModel tableModel = (DefaultTableModel) jTable.getModel();
int row = jTable.getSelectedRow();
int column = jTable.getSelectedColumn();
if(row==4 && column==1){