JavaSwing_4.8:JTable(表)
142041 ワード
このリンクは次のとおりです.http://blog.csdn.net/xietansheng/article/details/78079806
Java Swingグラフィックインタフェース開発(ディレクトリ)
1.概要
公式JavaDocsApi:javax.swing.JTable
2.簡単な表を作成する
結果:
表コンポーネントは、他の一般的なコンポーネントと同様に、中間コンテナに追加する必要があります.表をコンテナに追加するには、次の2つの方法があります.は通常の中間コンテナに追加され(上記のコード例で示すように は、
3.JTableでよく使われる操作方法
JTableの一般的な構造方法:
JTableフォントとグリッド色の設定:
JTableヘッダの設定:
JTable行列に関する設定:
JTableデータ関連操作:
4.スクロールバー付きテーブルの作成
スクロールバー付きテーブルを作成するには、次の手順に従います.
完全なインスタンスコード:
結果:
5.テーブルモデル(Table Model)
Table Modelインタフェースは、JTableがテーブル形式のデータモデルを問い合わせる方法を指定します.Table Modelはテーブル内の各種データをカプセル化し、テーブル表示にデータを提供する.上記の例では、行データとヘッダを直接使用してテーブルを作成していますが、実際にはJTable内部で自動的に入力された行データとヘッダがTable Modelにカプセル化されています.
データ・モデルにTableModelインタフェースが実装されている限り、次の2行のコード設定JTableでモデルを表示できます.
Table Modelインタフェースのメソッド:
JREでよく使用される実装済みTableModelインタフェースのクラスは2つあります.
(1)javax.swing.table.AbstractTableModel
この抽象クラスは、Table Modelインタフェースのほとんどのメソッドにデフォルトの実装を提供します.リスナーを管理し、TableModelEventsを生成し、リスナーにスケジュールするのに便利です.AbstractTable Modelのサブクラスとして特定のTable Modelを作成するには、次の3つの方法を実装します.
(2)javax.swing.table.DefaultTableModel
これは、複数のVectorからなるセルの値オブジェクトを格納するためのVectorを使用するTable Modelの実装です.DefaultTable Modelでは、行列の追加や削除など、テーブルデータの操作を容易にする方法も多く追加されています.
AbstractTable Modelを使用してテーブルを作成します.
結果:
対応するセルをマウスでクリックすると、AbstractTable ModelでisCellEditable(...)メソッドの実装はfalse、すなわちセルが編集できないため、セルが編集できないことがわかります.一部のセルが編集をサポートする必要がある場合は、isCellEditable(...)メソッドを書き換えて、対応するセルに対してtrueを返すことができます.
6.テーブルデータ変更の傍受(TableModelListener)
テーブルのデータメンテナンス、データのリスニングは、すべてテーブルモデル(Table Model)によってメンテナンスされ、テーブルモデルリスナー(Table ModelListener)を設定することで、テーブルセルデータの変更、テーブル列の増加、削除をリスニングできます.
テーブルモデルリスナーのプライマリコードを設定します.
コードの例:
結果は、単科点数を修正し、車に戻って、総点数の変化を見ることを示した.
7.表セレクタ(ListSelectionModel)
表データの選択はListSelectionModelセレクタモデルを使用して維持され、ユーザーが異なるモードで表のデータを選択できるようにします.
ListSelectionModelの使用:
8.セルのレンダラー(Table CellRenderer)
セルレンダラーは、各セルの表示スタイルを指定します.
次のコードインスタンスでは、テーブルの偶数行の背景を白に、奇数行の背景をグレーに、最初の列の内容を水平に中央に、最後の列の内容を水平に右に、他の列の内容を水平に左に揃えます.
結果:
9.セルデータのエディタ(Table CellEditor)
レンダラーは、セルのデータを通常表示するときに表示コンポーネントを提供し、エディタはセルのデータを編集するときに表示(使用)するコンポーネントです.
エディタを使用して、セルに入力されたコンテンツのフォーマットを制御したり、入力されたコンテンツの変化を傍受したりすることができます.
よく使われる編集コンポーネントはJTextField(テキストボックス)で、編集コンポーネントとしてJCheckBox(オプションボックス)、JComboBox(テキストボックス)などのコンポーネントを使用することもできます.
エディタインタフェースは
次のコードでは、DefaultCellEditorをベースクラスとして使用して、数値しか入力できないエディタをカスタマイズします.
結果:
10.テーブルデータのソート(RowSorter)
JTableはまた、ヘッダーをクリックして列を昇順または降順にソートすることをサポートし、テーブルにテーブル行ソート器
コードの例:
結果:
Java Swingグラフィックインタフェース開発(ディレクトリ)
1.概要
公式JavaDocsApi:javax.swing.JTable
JTable
、表.JTableは、通常の2 Dユニットテーブルを表示および編集するために使用されます.2.簡単な表を作成する
package com.xiets.swing;
import javax.swing.*;
import java.awt.*;
public class Main {
public static void main(String[] args) {
JFrame jf = new JFrame(" ");
jf.setDefaultCloseOperation(WindowConstants.EXIT_ON_CLOSE);
// ,
JPanel panel = new JPanel(new BorderLayout());
// ( )
Object[] columnNames = {" ", " ", " ", " ", " "};
//
Object[][] rowData = {
{" ", 80, 80, 80, 240},
{"John", 70, 80, 90, 240},
{"Sue", 70, 70, 70, 210},
{"Jane", 80, 70, 60, 210},
{"Joe", 80, 70, 60, 210}
};
// ,
JTable table = new JTable(rowData, columnNames);
// ( , )
panel.add(table.getTableHeader(), BorderLayout.NORTH);
//
panel.add(table, BorderLayout.CENTER);
jf.setContentPane(panel);
jf.pack();
jf.setLocationRelativeTo(null);
jf.setVisible(true);
}
}
結果:
表コンポーネントは、他の一般的なコンポーネントと同様に、中間コンテナに追加する必要があります.表をコンテナに追加するには、次の2つの方法があります.
JPanel
に追加されます)、このとき追加されたjTable
は表の行の内容にすぎず、ヘッダー(jTable.getTableHeader()
)は追加で追加する必要があります.この追加方式は表の行数の決定に適しており、データ量が小さく、一度に表示できる表である.JScrollPane
スクロールコンテナに追加されます.この追加方法では、ヘッダを追加する必要はありません.jTable
をjScrollPane
に追加すると、ヘッダは自動的にスクロールコンテナの上部に追加され、行コンテンツのスクロールがサポートされます(行コンテンツをスクロールすると、ヘッダは常に上部に表示されます).3.JTableでよく使われる操作方法
JTableの一般的な構造方法:
// ,
JTable()
// , (A, B, C ...)
JTable(int numRows, int numColumns)
// ,
JTable(Object[][] rowData, Object[] columnNames)
//
JTable(TableModel dm)
JTableフォントとグリッド色の設定:
//
void setFont(Font font)
//
void setForeground(Color fg)
// ( )
void setSelectionForeground(Color selectionForeground)
//
void setSelectionBackground(Color selectionBackground)
//
void setGridColor(Color gridColor)
//
void setShowGrid(boolean showGrid)
//
void setShowHorizontalLines(boolean showHorizontalLines)
//
void setShowVerticalLines(boolean showVerticalLines)
JTableヘッダの設定:
//
JTableHeader jTableHeader = jTable.getTableHeader();
//
jTableHeader.setFont(Font font);
//
jTableHeader.setForeground(Color fg);
// 。
jTableHeader.setResizingAllowed(boolean resizingAllowed);
// , 。
jTableHeader.setReorderingAllowed(boolean reorderingAllowed);
JTable行列に関する設定:
//
void setRowHeight(int rowHeight)
//
void setRowHeight(int row, int rowHeight)
/**
* , , :
* JTable.AUTO_RESIZE_ALL_COLUMNS , 。
* JTable.AUTO_RESIZE_LAST_COLUMN , 。
* JTable.AUTO_RESIZE_NEXT_COLUMN UI , 。
* JTable.AUTO_RESIZE_OFF ; 。
* JTable.AUTO_RESIZE_SUBSEQUENT_COLUMNS UI , ; 。
*/
void setAutoResizeMode(int mode)
/*
*
*/
//
TableColumn tableColumn = jTable.getColumnModel().getColumn(int columnIndex);
// 、 、 、
tableColumn.setWidth(int width);
tableColumn.setPreferredWidth(int preferredWidth);
tableColumn.setMinWidth(int minWidth);
tableColumn.setMaxWidth(int maxWidth);
// , 。
tableColumn.sizeWidthToFit();
//
tableColumn.setResizable(boolean isResizable);
//
tableColumn.setHeaderValue(Object headerValue);
JTableデータ関連操作:
/*
*
*/
//
jTable.getModel().setValueAt(Object aValue, int rowIndex, int columnIndex);
//
Object value = jTable.getModel().getValueAt(int rowIndex, int columnIndex);
4.スクロールバー付きテーブルの作成
スクロールバー付きテーブルを作成するには、次の手順に従います.
//
JTable table = new JTable(...);
/* */
// ( , )
table.setPreferredScrollableViewportSize(new Dimension(int width, int height));
// , ( )
JScrollPane scrollPane = new JScrollPane(table);
/* scrollPane */
完全なインスタンスコード:
package com.xiets.swing;
import javax.swing.*;
import java.awt.*;
public class Main {
public static void main(String[] args) {
JFrame jf = new JFrame(" ");
jf.setDefaultCloseOperation(WindowConstants.EXIT_ON_CLOSE);
//
JPanel panel = new JPanel();
// ( )
String[] columnNames = {" ", " ", " ", " ", " ", " "};
//
Object[][] rowData = {
{1, " ", 80, 80, 80, 240},
{2, "John", 70, 80, 90, 240},
{3, "Sue", 70, 70, 70, 210},
{4, "Jane", 80, 70, 60, 210},
{5, "Joe_05", 80, 70, 60, 210},
{6, "Joe_06", 80, 70, 60, 210},
{7, "Joe_07", 80, 70, 60, 210},
{8, "Joe_08", 80, 70, 60, 210},
{9, "Joe_09", 80, 70, 60, 210},
{10, "Joe_10", 80, 70, 60, 210},
{11, "Joe_11", 80, 70, 60, 210},
{12, "Joe_12", 80, 70, 60, 210},
{13, "Joe_13", 80, 70, 60, 210},
{14, "Joe_14", 80, 70, 60, 210},
{15, "Joe_15", 80, 70, 60, 210},
{16, "Joe_16", 80, 70, 60, 210},
{17, "Joe_17", 80, 70, 60, 210},
{18, "Joe_18", 80, 70, 60, 210},
{19, "Joe_19", 80, 70, 60, 210},
{20, "Joe_20", 80, 70, 60, 210}
};
// ,
JTable table = new JTable(rowData, columnNames);
//
table.setForeground(Color.BLACK); //
table.setFont(new Font(null, Font.PLAIN, 14)); //
table.setSelectionForeground(Color.DARK_GRAY); //
table.setSelectionBackground(Color.LIGHT_GRAY); //
table.setGridColor(Color.GRAY); //
//
table.getTableHeader().setFont(new Font(null, Font.BOLD, 14)); //
table.getTableHeader().setForeground(Color.RED); //
table.getTableHeader().setResizingAllowed(false); //
table.getTableHeader().setReorderingAllowed(false); //
//
table.setRowHeight(30);
// 40
table.getColumnModel().getColumn(0).setPreferredWidth(40);
// ( , )
table.setPreferredScrollableViewportSize(new Dimension(400, 300));
// ( )
JScrollPane scrollPane = new JScrollPane(table);
//
panel.add(scrollPane);
//
jf.setContentPane(panel);
jf.pack();
jf.setLocationRelativeTo(null);
jf.setVisible(true);
}
}
結果:
5.テーブルモデル(Table Model)
Table Modelインタフェースは、JTableがテーブル形式のデータモデルを問い合わせる方法を指定します.Table Modelはテーブル内の各種データをカプセル化し、テーブル表示にデータを提供する.上記の例では、行データとヘッダを直接使用してテーブルを作成していますが、実際にはJTable内部で自動的に入力された行データとヘッダがTable Modelにカプセル化されています.
データ・モデルにTableModelインタフェースが実装されている限り、次の2行のコード設定JTableでモデルを表示できます.
TableModel myData = new MyTableModel();
JTable table = new JTable(myData);
Table Modelインタフェースのメソッド:
package javax.swing.table;
import javax.swing.*;
import javax.swing.event.*;
public interface TableModel {
/** */
public int getRowCount();
/** */
public int getColumnCount();
/** ( ) */
public String getColumnName(int columnIndex);
/** , 。JTable 。 */
public Class<?> getColumnClass(int columnIndex);
/** */
public boolean isCellEditable(int rowIndex, int columnIndex);
/** */
public Object getValueAt(int rowIndex, int columnIndex);
/** */
public void setValueAt(Object aValue, int rowIndex, int columnIndex);
/** */
public void addTableModelListener(TableModelListener l);
/** */
public void removeTableModelListener(TableModelListener l);
}
JREでよく使用される実装済みTableModelインタフェースのクラスは2つあります.
(1)javax.swing.table.AbstractTableModel
この抽象クラスは、Table Modelインタフェースのほとんどのメソッドにデフォルトの実装を提供します.リスナーを管理し、TableModelEventsを生成し、リスナーにスケジュールするのに便利です.AbstractTable Modelのサブクラスとして特定のTable Modelを作成するには、次の3つの方法を実装します.
public int getRowCount();
public int getColumnCount();
public Object getValueAt(int row, int column);
(2)javax.swing.table.DefaultTableModel
これは、複数のVectorからなるセルの値オブジェクトを格納するためのVectorを使用するTable Modelの実装です.DefaultTable Modelでは、行列の追加や削除など、テーブルデータの操作を容易にする方法も多く追加されています.
AbstractTable Modelを使用してテーブルを作成します.
package com.xiets.swing;
import javax.swing.*;
import javax.swing.table.AbstractTableModel;
import java.awt.*;
public class Main {
public static void main(String[] args) {
JFrame jf = new JFrame(" ");
jf.setDefaultCloseOperation(WindowConstants.EXIT_ON_CLOSE);
// ,
JPanel panel = new JPanel(new BorderLayout());
//
JTable table = new JTable(new MyTableModel());
// ( , )
panel.add(table.getTableHeader(), BorderLayout.NORTH);
//
panel.add(table, BorderLayout.CENTER);
jf.setContentPane(panel);
jf.pack();
jf.setLocationRelativeTo(null);
jf.setVisible(true);
}
/**
* ,
*/
public static class MyTableModel extends AbstractTableModel {
/**
* ( )
*/
private Object[] columnNames = {" ", " ", " ", " ", " "};
/**
*
*/
private Object[][] rowData = {
{" ", 80, 80, 80, 240},
{"John", 70, 80, 90, 240},
{"Sue", 70, 70, 70, 210},
{"Jane", 80, 70, 60, 210},
{"Joe", 80, 70, 60, 210}
};
/**
*
*/
@Override
public int getRowCount() {
return rowData.length;
}
/**
*
*/
@Override
public int getColumnCount() {
return columnNames.length;
}
/**
* ( ),AbstractTableModel
* A , 。
*/
@Override
public String getColumnName(int column) {
return columnNames[column].toString();
}
/**
*
*/
@Override
public Object getValueAt(int rowIndex, int columnIndex) {
return rowData[rowIndex][columnIndex];
}
}
}
結果:
対応するセルをマウスでクリックすると、AbstractTable ModelでisCellEditable(...)メソッドの実装はfalse、すなわちセルが編集できないため、セルが編集できないことがわかります.一部のセルが編集をサポートする必要がある場合は、isCellEditable(...)メソッドを書き換えて、対応するセルに対してtrueを返すことができます.
6.テーブルデータ変更の傍受(TableModelListener)
テーブルのデータメンテナンス、データのリスニングは、すべてテーブルモデル(Table Model)によってメンテナンスされ、テーブルモデルリスナー(Table ModelListener)を設定することで、テーブルセルデータの変更、テーブル列の増加、削除をリスニングできます.
テーブルモデルリスナーのプライマリコードを設定します.
//
TableModel tableModel = table.getModel();
//
tableModel.addTableModelListener(new TableModelListener() {
@Override
public void tableChanged(TableModelEvent e) {
// ( , )
int firstRow = e.getFirstRow();
int lastRow = e.getLastRow();
//
int column = e.getColumn();
// , :
// TableModelEvent.INSERT
// TableModelEvent.UPDATE
// TableModelEvent.DELETE
int type = e.getType();
}
});
コードの例:
package com.xiets.swing;
import javax.swing.*;
import javax.swing.event.TableModelEvent;
import javax.swing.event.TableModelListener;
import javax.swing.table.AbstractTableModel;
import javax.swing.table.TableModel;
import java.awt.*;
public class Main {
public static void main(String[] args) {
JFrame jf = new JFrame(" ");
jf.setDefaultCloseOperation(WindowConstants.EXIT_ON_CLOSE);
// ,
JPanel panel = new JPanel(new BorderLayout());
// ( )
final Object[] columnNames = {" ", " ", " ", " ", " "};
//
final Object[][] rowData = {
{" ", 80, 80, 80, 240},
{"John", 70, 80, 90, 240},
{"Sue", 70, 70, 70, 210},
{"Jane", 80, 70, 60, 210},
{"Joe", 80, 70, 60, 210}
};
// ,
JTable table = new JTable(new AbstractTableModel() {
@Override
public int getRowCount() {
return rowData.length;
}
@Override
public int getColumnCount() {
return rowData[0].length;
}
@Override
public String getColumnName(int column) {
return columnNames[column].toString();
}
@Override
public boolean isCellEditable(int rowIndex, int columnIndex) {
// 4, , ,
// 、 、 ,
return columnIndex != 4;
}
@Override
public Object getValueAt(int rowIndex, int columnIndex) {
return rowData[rowIndex][columnIndex];
}
@Override
public void setValueAt(Object newValue, int rowIndex, int columnIndex) {
// , ,
// UI getValueAt(...)
rowData[rowIndex][columnIndex] = newValue;
// , UI( ),
fireTableCellUpdated(rowIndex, columnIndex);
}
});
/*
* AbstractTableModel , ,
* ( , UI , ), DefaultTableModel ,
* TableModel , , UI ,
* , / 。 , , :
*/
// DefaultTableModel tableModel = new DefaultTableModel(rowData, columnNames);
// JTable table = new JTable(tableModel);
//
final TableModel tableModel = table.getModel();
//
tableModel.addTableModelListener(new TableModelListener() {
@Override
public void tableChanged(TableModelEvent e) {
// ( , )
int firstRow = e.getFirstRow();
int lastRow = e.getLastRow();
//
int column = e.getColumn();
// , :
// TableModelEvent.INSERT
// TableModelEvent.UPDATE
// TableModelEvent.DELETE
int type = e.getType();
//
if (type == TableModelEvent.UPDATE) {
// 、 、 ( 1、2、3)
if (column < 1 || column > 3) {
return;
}
// ,
for (int row = firstRow; row <= lastRow; row++) {
// 、 、
Object chineseObj = tableModel.getValueAt(row, 1);
Object mathObj = tableModel.getValueAt(row, 2);
Object englishObj = tableModel.getValueAt(row, 3);
//
int chinese = 0;
try {
chinese = Integer.parseInt("" + chineseObj);
} catch (Exception ex) {
ex.printStackTrace();
}
int math = 0;
try {
math = Integer.parseInt("" + mathObj);
} catch (Exception ex) {
ex.printStackTrace();
}
int english = 0;
try {
english = Integer.parseInt("" + englishObj);
} catch (Exception ex) {
ex.printStackTrace();
}
//
int totalScore = chinese + math + english;
// ( 4)
tableModel.setValueAt(totalScore, row, 4);
}
}
}
});
// ( , )
panel.add(table.getTableHeader(), BorderLayout.NORTH);
//
panel.add(table, BorderLayout.CENTER);
jf.setContentPane(panel);
jf.pack();
jf.setLocationRelativeTo(null);
jf.setVisible(true);
}
}
結果は、単科点数を修正し、車に戻って、総点数の変化を見ることを示した.
7.表セレクタ(ListSelectionModel)
表データの選択はListSelectionModelセレクタモデルを使用して維持され、ユーザーが異なるモードで表のデータを選択できるようにします.
ListSelectionModelの使用:
//
final JTable table = new JTable(...);
// , false
table.setCellSelectionEnabled(boolean cellSelectionEnabled);
// table
ListSelectionModel selectionModel = table.getSelectionModel();
// , :
// ListSelectionModel.MULTIPLE_INTERVAL_SELECTION ( )
// ListSelectionModel.SINGLE_INTERVAL_SELECTION
// ListSelectionModel.SINGLE_SELECTION
selectionModel.setSelectionMode(int selectionMode);
// ( )
selectionModel.addListSelectionListener(new ListSelectionListener() {
@Override
public void valueChanged(ListSelectionEvent e) {
//
int selectedRow = table.getSelectedRow();
//
int selectedRow = table.getSelectedColumn();
//
int[] selectedRows = table.getSelectedRows();
//
int[] selectedColumns = table.getSelectedColumns();
}
});
8.セルのレンダラー(Table CellRenderer)
セルレンダラーは、各セルの表示スタイルを指定します.
次のコードインスタンスでは、テーブルの偶数行の背景を白に、奇数行の背景をグレーに、最初の列の内容を水平に中央に、最後の列の内容を水平に右に、他の列の内容を水平に左に揃えます.
package com.xiets.swing;
import javax.swing.*;
import javax.swing.table.DefaultTableCellRenderer;
import javax.swing.table.TableColumn;
import java.awt.*;
public class Main {
public static void main(String[] args) {
JFrame jf = new JFrame(" ");
jf.setDefaultCloseOperation(WindowConstants.EXIT_ON_CLOSE);
// ,
JPanel panel = new JPanel(new BorderLayout());
// ( )
Object[] columnNames = {" ", " ", " ", " ", " "};
//
Object[][] rowData = {
{" ", 80, 80, 80, 240},
{"John", 70, 80, 90, 240},
{"Sue", 70, 70, 70, 210},
{"Jane", 80, 70, 60, 210},
{"Joe_01", 80, 70, 60, 210},
{"Joe_02", 80, 70, 60, 210},
{"Joe_03", 80, 70, 60, 210},
{"Joe_04", 80, 70, 60, 210},
{"Joe_05", 80, 70, 60, 210}
};
// ,
JTable table = new JTable(rowData, columnNames);
//
MyTableCellRenderer renderer = new MyTableCellRenderer();
// ,
for (int i = 0; i < columnNames.length; i++) {
//
TableColumn tableColumn = table.getColumn(columnNames[i]);
//
tableColumn.setCellRenderer(renderer);
}
// ,
// table.getTableHeader().setDefaultRenderer(headerRenderer);
// ( , )
panel.add(table.getTableHeader(), BorderLayout.NORTH);
//
panel.add(table, BorderLayout.CENTER);
jf.setContentPane(panel);
jf.pack();
jf.setLocationRelativeTo(null);
jf.setVisible(true);
}
/**
* , DefaultTableCellRenderer
*/
public static class MyTableCellRenderer extends DefaultTableCellRenderer {
/**
* , , ,
*/
@Override
public Component getTableCellRendererComponent(JTable table, Object value, boolean isSelected, boolean hasFocus, int row, int column) {
// ,
if (row % 2 == 0) {
setBackground(Color.WHITE);
} else {
setBackground(Color.LIGHT_GRAY);
}
// , ,
if (column == 0) {
setHorizontalAlignment(SwingConstants.CENTER);
} else if (column == (table.getColumnCount() - 1)) {
setHorizontalAlignment(SwingConstants.RIGHT);
} else {
setHorizontalAlignment(SwingConstants.LEFT);
}
// , (row, column)
setToolTipText(" : " + row + ", " + column);
// PS: , , , 。
/*
* , DefaultTableCellRenderer
* JLabel, JLabel API 。
*
* super.getTableCellRendererComponent(...) (this), JLabel ,
* JLabel 。
*
* ( 、 、 ),
* 。
*/
//
return super.getTableCellRendererComponent(table, value, isSelected, hasFocus, row, column);
}
}
}
結果:
9.セルデータのエディタ(Table CellEditor)
レンダラーは、セルのデータを通常表示するときに表示コンポーネントを提供し、エディタはセルのデータを編集するときに表示(使用)するコンポーネントです.
エディタを使用して、セルに入力されたコンテンツのフォーマットを制御したり、入力されたコンテンツの変化を傍受したりすることができます.
よく使われる編集コンポーネントはJTextField(テキストボックス)で、編集コンポーネントとしてJCheckBox(オプションボックス)、JComboBox(テキストボックス)などのコンポーネントを使用することもできます.
エディタインタフェースは
TableCellEditor
で、指定したセルに編集コンポーネントを提供する方法は1つしかありません.インタフェースが実装されたデフォルトエディタDefaultCellEditor
は、通常、実際に使用される.次のコードでは、DefaultCellEditorをベースクラスとして使用して、数値しか入力できないエディタをカスタマイズします.
package com.xiets.swing;
import javax.swing.*;
import javax.swing.table.TableColumn;
import java.awt.*;
public class Main {
public static void main(String[] args) {
JFrame jf = new JFrame(" ");
jf.setDefaultCloseOperation(WindowConstants.EXIT_ON_CLOSE);
// ,
JPanel panel = new JPanel(new BorderLayout());
// ( )
Object[] columnNames = {" ", " ", " ", " ", " "};
//
Object[][] rowData = {
{" ", 80, 80, 80, 240},
{"John", 70, 80, 90, 240},
{"Sue", 70, 70, 70, 210},
{"Jane", 80, 70, 60, 210},
{"Joe", 80, 70, 60, 210}
};
// ,
JTable table = new JTable(rowData, columnNames);
// ,
MyCellEditor cellEditor = new MyCellEditor(new JTextField());
// ,
for (int i = 1; i < columnNames.length; i++) {
//
TableColumn tableColumn = table.getColumn(columnNames[i]);
//
tableColumn.setCellEditor(cellEditor);
}
// ( , )
panel.add(table.getTableHeader(), BorderLayout.NORTH);
//
panel.add(table, BorderLayout.CENTER);
jf.setContentPane(panel);
jf.pack();
jf.setLocationRelativeTo(null);
jf.setVisible(true);
}
/**
*
*/
public static class MyCellEditor extends DefaultCellEditor {
public MyCellEditor(JTextField textField) {
super(textField);
}
public MyCellEditor(JCheckBox checkBox) {
super(checkBox);
}
public MyCellEditor(JComboBox comboBox) {
super(comboBox);
}
@Override
public boolean stopCellEditing() {
//
Component comp = getComponent();
//
Object obj = getCellEditorValue();
// , false( , , )
if (obj == null || !obj.toString().matches("[0-9]*")) {
// ,
comp.setForeground(Color.RED);
return false;
}
// ,
comp.setForeground(Color.BLACK);
//
return super.stopCellEditing();
}
}
}
結果:
10.テーブルデータのソート(RowSorter)
JTableはまた、ヘッダーをクリックして列を昇順または降順にソートすることをサポートし、テーブルにテーブル行ソート器
TableRowSorter
(辞書順にソート)を設定するだけです.コードの例:
package com.xiets.swing;
import javax.swing.*;
import javax.swing.table.DefaultTableModel;
import javax.swing.table.TableModel;
import javax.swing.table.TableRowSorter;
import java.awt.*;
public class Main {
public static void main(String[] args) {
JFrame jf = new JFrame(" ");
jf.setDefaultCloseOperation(WindowConstants.EXIT_ON_CLOSE);
// ,
JPanel panel = new JPanel(new BorderLayout());
// ( )
Object[] columnNames = {" ", " ", " ", " ", " "};
//
Object[][] rowData = {
{" ", 80, 80, 80, 240},
{"John", 70, 80, 90, 240},
{"Sue", 70, 70, 70, 210},
{"Jane", 80, 70, 60, 210},
{"Joe", 80, 70, 60, 210}
};
// ,
TableModel tableModel = new DefaultTableModel(rowData, columnNames);
//
JTable table = new JTable(tableModel);
// (TableRowSorter RowSorter)
RowSorter<TableModel> rowSorter = new TableRowSorter<TableModel>(tableModel);
//
table.setRowSorter(rowSorter);
// ( , )
panel.add(table.getTableHeader(), BorderLayout.NORTH);
//
panel.add(table, BorderLayout.CENTER);
jf.setContentPane(panel);
jf.pack();
jf.setLocationRelativeTo(null);
jf.setVisible(true);
}
}
結果: