《Java编程语言:原理与范例》课后实验源代码

package ch09;

import java.awt.BorderLayout; import java.awt.event.ActionEvent; import java.awt.event.ActionListener; import java.io.IOException;

import javax.swing.JComboBox; import javax.swing.JEditorPane; import javax.swing.JFrame;

import javax.swing.JOptionPane; import javax.swing.JScrollPane; import javax.swing.JTextField;

public class Exp8_2 extends JFrame { String home = \首页 JComboBox cb = new JComboBox(); // 地址栏 JEditorPane page; // 页面展现面板 void initUI() throws IOException { cb.setEditable(true); cb.addItem(home); // 输入网址并回车,或选择不同选项时的时间监听器 cb.addActionListener(new ActionListener() { public void actionPerformed(ActionEvent e) { // 获得输入的网址(去掉首尾空格) String s = ((JTextField) cb.getEditor().getEditorComponent()).getText().trim(); if (s != null && s.length() > 0) { // 写回地址栏 ((JTextField) cb.getEditor().getEditorComponent()).setText(s); try { page.setPage(s); // 加载页面 } catch (IOException e1) { JOptionPane.showMessageDialog(Exp8_2.this, \加载页面出错,请检查输入的地址!\ return; } int count = cb.getItemCount(); // 得到所有下拉列表选项 boolean exist = false; // 判断输入的地址是否已存在 for (int i = 0; i < count; i++) { Object item = cb.getItemAt(i); if (item.toString().equalsIgnoreCase(s)) {

exist = true; break; } } if (!exist) { // 不存在加入下拉列表 cb.addItem(s); } } } }); setLayout(new BorderLayout()); add(cb, BorderLayout.NORTH); page = new JEditorPane(home); page.setEditable(false); add(new JScrollPane(page), BorderLayout.CENTER); setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); setSize(600, 400); setVisible(true); } public static void main(String[] args) throws IOException { Exp8_2 t = new Exp8_2(); t.initUI(); } }

实验三

/*********************************

3. 编写手机库存管理界面,具体要求如下。

① 表格(中间3列)的初始数据存于二维数组中,其中单价和总价列为Float类型,数量列为Integer类型。

② 编号列从1开始递增,总价列为计算列(即根据单价和数量求得)。 ③ 根据输入的商品名称,以某种背景色高亮显示所有包含该名称的行。

④ 点击删除按钮,在表格中删除选中的行(若未有选中行,则该按钮不可用),并保证编号列的递增。

⑤ 点击增加按钮,在表格最后新增一行以输入数据(当焦点离开该行的商品名称列时,需检查输入的名称是否与其他商品名称重复)。 **********************************/ package ch09;

import java.awt.BorderLayout; import java.awt.Color;

import java.awt.Component; import java.awt.FlowLayout;

import java.awt.event.ActionEvent; import java.awt.event.ActionListener;

import javax.swing.BorderFactory; import javax.swing.JButton; import javax.swing.JFrame; import javax.swing.JLabel;

import javax.swing.JOptionPane; import javax.swing.JPanel; import javax.swing.JTable; import javax.swing.JTextField;

import javax.swing.ListSelectionModel;

import javax.swing.event.ListSelectionEvent; import javax.swing.event.ListSelectionListener; import javax.swing.table.AbstractTableModel;

import javax.swing.table.DefaultTableCellRenderer; import javax.swing.table.TableColumnModel;

// 表格模型类

class MobilePhoneTableModel extends AbstractTableModel { String[] columnNames; // 列名称 Class[] columnTypes; // 列类型 Object[][] data; // 行数据 // 构造方法 public MobilePhoneTableModel(String[] columnNames, Class[] columnTypes, Object[][] data) { this.columnNames = columnNames; this.columnTypes = columnTypes; this.data = data; } // data 字段的读写方法 public Object[][] getData() { return data; } public void setData(Object[][] data) { this.data = data; } /*** 以下是重写父类的方法(AbstractTableModel实现了TableModel接口) ***/

public int getRowCount() {// 得到表格总行数 return data.length; } public int getColumnCount() {// 得到表格总列数 return columnNames.length; } public String getColumnName(int col) {// 得到指定列的名称 return columnNames[col]; } public Class getColumnClass(int col) {// 得到指定列的类型 return columnTypes[col]; } public Object getValueAt(int row, int col) {// 得到指定行列的数据 if (col == 0) { // 行号列 return row + 1; } else if (col == 4) { // 总价列 return (Float) data[row][1] * (Integer) data[row][2]; } return data[row][col - 1]; // 其余列 } public boolean isCellEditable(int row, int col) {// 设置指定行列是否可编辑 return col != 0 && col != 4; // 行号和总价列不允许修改 } // 编辑表格单元时触发此方法 public void setValueAt(Object value, int row, int col) { if (col == 1) { // 名称列 value = ((String) value).trim(); // 名称去掉首尾空格 if (((String) value).length() < 1) { JOptionPane.showMessageDialog(JFrame.getFrames()[0], \商品名称不能为空!\提示\ return; } // 检查是否与其他名称相同 for (int i = 0; i < getRowCount(); i++) { if (i == row) { // 不与自己比较 continue; } String name = (String) getValueAt(i, 1);

if (((String) value).equalsIgnoreCase(name)) { JOptionPane.showMessageDialog(JFrame.getFrames()[0], \商品名称已存在!\提示\ return; } } } // 检查通过,修改相应数据 data[row][col - 1] = value; fireTableDataChanged();// 通知表格更新 fireTableCellUpdated(row, col); } }

// 表格渲染器类

class MobilePhoneTableRenderer extends DefaultTableCellRenderer { private int[] rowSelected; // 标记每一行是否被选择 // get和set方法 public int[] getRowSelected() { return rowSelected; } public void setRowSelected(int[] rowSelected) { this.rowSelected = rowSelected; } // 渲染每个单元格时都会执行此方法 public Component getTableCellRendererComponent(JTable table, Object value, boolean isSelected, boolean hasFocus, int row, int column) { if (rowSelected[row] == 0) { // 未选中的行 setBackground(Color.WHITE); } else { setBackground(Color.LIGHT_GRAY); } return super.getTableCellRendererComponent(table, value, isSelected, hasFocus, row, column); } }

public class Exp8_3 extends JFrame { String[] columnNames = { \编号\商品名称\单价\数量\总价\ Class[] columnTypes = { Integer.class, String.class, Float.class, Integer.class, Float.class };

联系客服:779662525#qq.com(#替换为@) 苏ICP备20003344号-4