[Java] Advanced Swing-JTable

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コンポーネントは非常に強力であり、設計は複雑ではありません。カスタマイズを完了するには、対応するインターフェースを実装するだけで済みます。

おすすめ

転載: blog.csdn.net/m0_47202518/article/details/108369691