JListと比較すると、JTableは明らかにはるかに複雑です。JTabelは、Javaの一貫した設計スタイルも継承し、データモデルをテーブルの描画から分離します。デフォルトのスタイルがあり、多くのインターフェースも提供されています。これにより、Javaのテーブル設計のアイデアが明確になるだけでなく、ほとんどすべてのパーソナライズされたニーズを満たすことができます。
欠点は、Javaライブラリにカプセル化されているメソッドが多すぎることです。できるだけ理解しやすくするために、メソッド名と定数名が非常に長いため、Javaコードは非常に冗長で美しくありません。しかし、これは強力なIDEのコードヒント関数で解決できます。
1.工法に従ってJTabelを作成します。テーブルの内容(2桁の配列)を渡すことができます。
下のヘッダー(1次元の配列)は、当校の募集ボランティアのリストです。名前はばかげています。
class JTabelFrame extends JFrame
{
private String[] libVol= {
"姓名","学号","联系方式","志愿楼层","时间段"};
private Object[][] text= {
//名字纯属瞎掰
{
"楚寒冰", "07190221" ,"18602511184", "二东,二西,七西,七东" ,"周六1,周六3,周日1,周三3"},
{
"云天明", "12180243","18602511185","二东,二西,七东,七西","周二3,周四3,周日3"},
{
"陈欣"," 05181343"," 18602511211"," 五东、五西、四东、四西、三东、三西 ","周一1、周二3、周四3"},
{
"郑语嫣"," 25190133"," 18602511228"," 二东,二西,七东,七西"," 周二2、周五2"}
{
"何碧","010223","18952249826","二东,七西","周二3,周六2"}
};
public JTabelFrame(String title)
{
super(title);
setDefaultCloseOperation(EXIT_ON_CLOSE);
//应用JTable的构造方法JTabel(Object[][],Object[]);
*
JTable table=new JTable(text,libVol);
//设置列排列器,点击列头可对列排序
tabel.setAutoCreateRowSorter(true);
JPanel panel=new JPanel();
panel.add(new JScrollPane(table));
add(panel,BorderLayout.CENTER);
pack();
}
}
2.カスタマイズされたデータモデル、セルレンダラー
JListと同様に、Javaはカスタムセルレンダラーとデータモデルをサポートします。データモデルでは、セルが編集可能かどうかを書き換えることができます。
public boolean isCellEditable(int r,int c)
{
return c==0||c==1||c==2||c==3;
}
セルレンダラーとJListプロセスが完了します。getTableCellRendererComponentメソッドが実装された後、Componentオブジェクトが返され、paintComponentメソッドでセルが描画されます。ここでは、一般的に使用される文字列測定テクノロジを使用して、文字列を適切な位置に配置します。 。
さらに、セルエディタも使用できます。コンボボックスやイベントの追加など、セルに対してより深い操作を実行します。これはより複雑です。APIドキュメントと「JavaCoreTechnology」を参照できます。
例を挙げる:
package JTable;
import java.awt.BorderLayout;
import java.awt.Color;
import java.awt.Component;
import java.awt.EventQueue;
import java.awt.Font;
import java.awt.FontMetrics;
import java.awt.Graphics;
import java.sql.Date;
import javax.swing.AbstractCellEditor;
import javax.swing.DefaultCellEditor;
import javax.swing.ImageIcon;
import javax.swing.JComboBox;
import javax.swing.JFrame;
import javax.swing.JPanel;
import javax.swing.JScrollPane;
import javax.swing.JTable;
import javax.swing.UIManager;
import javax.swing.table.AbstractTableModel;
import javax.swing.table.DefaultTableCellRenderer;
import javax.swing.table.DefaultTableModel;
import javax.swing.table.TableCellRenderer;
import javax.swing.table.TableModel;
public class IdolTabel {
public static void main(String[] args)
{
EventQueue.invokeLater(()->{
IdolTableFrame frame=new IdolTableFrame("idol");
frame.setVisible(true);
});
}
}
class IdolTableFrame extends JFrame
{
private static final int DEFDAULT_WIDTH=700;
private static final int DEFDAULT_HEIGHT=500;
private JTable table;
public IdolTableFrame(String title)
{
super(title);
setSize(DEFDAULT_WIDTH, DEFDAULT_HEIGHT);
TableModel model=new IdolModel();
//添加数据模型
table=new JTable(model);
//设置默认排序器,点击表头可排序
table.setAutoCreateRowSorter(true);
table.setRowHeight(240);
table.setRowSelectionAllowed(false);
//添加单元格渲染器,对String类单元格渲染
table.setDefaultRenderer(String.class, new MyRenderer());
//对图片框单独设置
JComboBox<Integer> comb=new JComboBox<>();
for(int i=1;i<=40;i++)
comb.addItem(i);
table.getColumnModel().getColumn(2).setCellEditor(new DefaultCellEditor(comb));
table.getColumnModel().getColumn(4).setMinWidth(150);
table.getColumnModel().getColumn(4).setMinWidth(200);
add(new JScrollPane(table),BorderLayout.CENTER);
}
}
class MyRenderer extends JPanel implements TableCellRenderer
{
private static Color background;
private static String text;
private Font font=new Font(Font.SANS_SERIF,Font.PLAIN,17);
@Override
public Component getTableCellRendererComponent(JTable table, Object value, boolean isSelected, boolean hasFocus,
int row, int column) {
this.text=(String) value;
background=isSelected?new Color(64, 0, 64):column%2==1?new Color(255, 255, 225):Color.WHITE;
if(hasFocus)
{
setBorder(UIManager.getBorder("Table.focusCellHighlightBorder"));
}else setBorder(null);
return this;
}
public void paintComponent(Graphics g)
{
g.setColor(background);
g.fillRect(0, 0, getWidth(), getHeight());
g.setColor(new Color(165, 107, 77));
g.drawRect(0, 0, getWidth(), getHeight());
FontMetrics fm=g.getFontMetrics(font);
g.setColor(Color.BLACK);
g.drawString(text, (getWidth()-fm.stringWidth(text))/2, (getHeight()-fm.getHeight())/2);
}
}
class IdolModel extends AbstractTableModel
{
private String[] colnumNames= {
"姓名","国籍","年龄","出生日期","照片"};
private Object[][] cells= {
{
"白石麻衣","日本","22","1998.8.10",new ImageIcon(getClass().getResource("bsmy.jpg"))},
{
"Emma Watson","英国","30","1990.4.15",new ImageIcon(getClass().getResource("emma.jfif"))},
{
"文彩元","韩国","33","1986.11.13",new ImageIcon(getClass().getResource("wcy.jfif"))}
};
@Override
public int getRowCount() {
return cells.length;
}
@Override
public int getColumnCount() {
return cells[0].length;
}
public String getColumnName(int c)
{
return colnumNames[c];
}
@Override
public Object getValueAt(int rowIndex, int columnIndex) {
return cells[rowIndex][columnIndex];
}
public Class<?> getColumnClass(int c)
{
return cells[0][c].getClass();
}
public boolean isCellEditable(int r,int c)
{
return c==0||c==1||c==2||c==3;
}
}
写真は次のとおりです。
JavaのSwingコンポーネントは非常に強力であり、設計は複雑ではありません。カスタマイズを完了するには、対応するインターフェースを実装するだけで済みます。