CSDN博客

img nxyc_twz

Swing 问答

发表于2004/6/26 18:39:00  2312人阅读

Swing 问答

翻译nxyc_twz@163.com

 

 

 

 

  1. 我在哪里可以找到适合于初学者的信息?

   可以参考 Java 指南的 Swing 页面: http://java.sun.com/docs/books/tutorial/uiswing/

  1. 当我进入一个单元格时,它为什么不能获得焦点?

   当单击单元格时,它就获得了焦点;但当移动光标到单元格时,它并不能获得焦点。在J2SE 1.4中新增了一个名为        surrendersFocusOnKeystroke属性来解决这个问题,并且维持向后兼容。

   相关信息可参考: http://java.sun.com/j2se/1.4/docs/guide/swing/SwingChanges.html#JTable

  1. 我怎样设置单元格行、列的颜色?

   每个单元格都使用 DefaultTableCellRenderer 构建, 通过该类的子类你可以作特定的修改。

   下面的代码演示了怎样实现。它有如此多的可扩充性,以致于 MyCellRenderer 可以包括设置行、列、边框以及文本设置等信息。

   import javax.swing.*;
   import javax.swing.table.*;
   import java.awt.Component;
   import java.awt.Color;

   class TableTest extends JFrame {

     TableTest() {

     final MyCellRenderer mcr = new MyCellRenderer();

     JTable myTable = new JTable(new MyTableModel()) {
      public TableCellRenderer getCellRenderer(int row, int column) {
         return mcr;
       }
     };

      getContentPane().add(new JScrollPane(myTable));
      setSize(640, 480);
      show();
     }

     public static void main(String args[]) {

      new TableTest();
     }
   }

   class MyTableModel extends AbstractTableModel {

     String[] columnNames = {"Name", "Age", "Sex"};
     String[][] columnData = { {"Bob", "23" , "M"}, {"Claire", "99", "F"}, {"Spot", "7", "F"}, {"Phil", "69", "M"}, };

     public Object getValueAt(int row, int col) {return columnData[row][col];}
     public String getColumnName(int col) { return columnNames[col];}
     public int getColumnCount() { return columnNames.length;}
     public int getRowCount() { return columnData.length; }
    }

    class MyCellRenderer extends DefaultTableCellRenderer {

     public Component getTableCellRendererComponent
 (JTable table, Object value, boolean isSelected, boolean hasFocus, int row, int column) {

      // 获取默认的设置
      Component cell = super.getTableCellRendererComponent ( table, value,isSelected, hasFocus, row, column);

      if (row % 2 == 0) cell.setBackground(Color.blue);
      else cell.setBackground(Color.gray);

      if (column % 2 == 0) cell.setBackground(Color.green);

      return cell;
     }
   }

  1. 在表中我怎样创建一行表头列?

      请查看文件:[ RowHeaderExample.java]

   该解决方案用来创建一个位于JScrollPane行头的组件。该组件将JList添加到行头。

   JList 有:
   - ListModel; 定义列表数据
 
   - RowHeaderRenderer; 定义每个单元格的感观

  1. 我应该选择哪种表格模式?

   表格模型层次提供了:
 
   javax.swing.table.TableModel (接口)
    javax.swing.table.AbstractTableModel (实现TableModel的类)
    javax.swing.table.DefaultTableModel (继承自AbstractTableModel的类)

   javax.swing.table.TableModel

   该接口提供了: Listener 注册, 单元值存取, 列命名, 列存取及创建表模型基础等功能。

   使用实现 TableModel 接口的主要优势是方法的定义可以被定制以及内部数据描述可被扩充 ,实现可变的应用。

   javax.swing.table.AbstractTableModel

   AbstractTableModel 是一种使用表格形数据的简单方法,只需简单的通过重载三个方法 getValueAt, getColumnCount getRowCount 即可。

   AbstractTable 模型也提供了事件处理,如 fireTableDataChanged, fireRowsUpdated 等等...

   AbstractTableModel 构建于 TableModel 之上, 其数据的内部描述可以是静态的(可节省存储空间) 或动态的,这取决于具体的应用。

   通过使用缓冲机制 getValueAt 方法取得具体的内容, 可以使显示和滚动方面的性能得到极大的提高。

   javax.swing.table.DefaultTableModel

   如果在JTable的构造函数中不指定参数,它将使默认的表格模式。

   DefaultTableModels 内部数据描述是向量体系。如果数据不是表格形式,这倒是个很好的方法。

   虽然设置了数据,但执行如滚动、显示应该和数据缓冲时一样。如果数据量大或已经缓冲(比如数据库),那么已缓冲数据的复制品可能是个不合适的选择。

   使用 DefaultTableModel 的一个建议是注意它的易变性。setValueAt 的实现和对其 / 修改包括了插入、添加、删除,以及表格构建后所有易变的数据。

   其它建议是要有一个好的设计。

  1. 怎样禁止用户移动表头或重置列大小?

   要限制列动作,使用 table.getTableHeader().setReorderingAllowed(false);

   要限制列重置大小,使用 table.getTableHeader().setResizingAllowed(false);

   要限制个别列重置大小 table.getColumnModel().getColumn(index).setResizable(false/true);

    注意:这些并不适用于J2SE 1.3 以前的版本。

   (待续一……

0 0

相关博文

我的热门文章

img
取 消
img