ソース掲示板




すべてから検索

キーワード   条件 表示 現行ログ 過去ログ トピックス 名前 本文
FSCalenderCombo(javaカレンダーコンボ) を Table内でのCellEditorとして使用
日時: 2013/10/17 00:31
名前: lightbox



細かい実用コントロールは行っていませんが、とりあえず実装のみ



拡張子:
import java.awt.BorderLayout;
import java.awt.Component;
import java.awt.EventQueue;
import java.util.EventObject;
import java.util.HashMap;

import javax.swing.DefaultCellEditor;
import javax.swing.JFrame;
import javax.swing.JPanel;
import javax.swing.JScrollPane;
import javax.swing.border.EmptyBorder;
import javax.swing.event.CellEditorListener;
import javax.swing.table.DefaultTableModel;
import javax.swing.table.TableCellEditor;
import javax.swing.table.TableCellRenderer;
import javax.swing.table.TableColumn;
import javax.swing.JTable;

import jp.co.flatsoft.fscomponent.FSCalenderCombo;
import javax.swing.JButton;
import java.awt.event.ActionListener;
import java.awt.event.ActionEvent;
import java.awt.event.ItemEvent;
import java.awt.event.ItemListener;

public class MyApp extends JFrame {

	private JPanel contentPane;
	private LboxTable table;

	/**
	 * Launch the application.
	 */
	public static void main(String[] args) {
		EventQueue.invokeLater(new Runnable() {
			public void run() {
				try {
					MyApp frame = new MyApp();
					frame.setVisible(true);
				} catch (Exception e) {
					e.printStackTrace();
				}
			}
		});
	}

	/**
	 * Create the frame.
	 */
	public MyApp() {
		setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
		setBounds(100, 100, 450, 300);
		contentPane = new JPanel();
		contentPane.setBorder(new EmptyBorder(5, 5, 5, 5));
		setContentPane(contentPane);
		contentPane.setLayout(null);
		
		table = new LboxTable();
		table.setBounds(33, 50, 366, 198);
		contentPane.add(table);
		
		JButton btnNewButton = new JButton("New button");
		btnNewButton.addActionListener(new ActionListener() {
			public void actionPerformed(ActionEvent arg0) {
				Object text = table.getValueAt(0, 0);
				System.out.println(text);
				text = table.getValueAt(1, 0);
				System.out.println(text);
				text = table.getValueAt(2, 0);
				System.out.println(text);
				text = table.getValueAt(0, 2);
				System.out.println(text);
				text = table.getValueAt(1, 2);
				System.out.println(text);
				text = table.getValueAt(2, 2);
				System.out.println(text);
			}
		});
		btnNewButton.setBounds(12, 10, 91, 21);
		contentPane.add(btnNewButton);
		
		table.addColumn("A01");
		table.addColumn("A02");
		table.addColumn("A03");
		table.addColumn("A04");
		table.addRow();
		table.addRow();
		table.addRow();
		table.setColumnCombo("A01");
		table.setColumnCombo("A03");
		
		table.setValueAt("20131001", 0, 0);
		table.setValueAt("20131002", 1, 0);
		table.setValueAt("20131003", 2, 0);
		
	}
	
	public class LboxTable extends JTable {

		private static final long serialVersionUID = 1L;
		public JScrollPane root = null;

		// ***************************************************
		// コンストラクタ
		// ***************************************************
		public LboxTable () {
			super(0,0);

			// テーブル作成と同時にスクロールを実装する
			this.root = new JScrollPane(this);

			// 必要な時にスクロールバーを表示する
			this.root.setVerticalScrollBarPolicy(
			JScrollPane.VERTICAL_SCROLLBAR_AS_NEEDED);
			this.root.setHorizontalScrollBarPolicy(
			JScrollPane.HORIZONTAL_SCROLLBAR_AS_NEEDED);
		}

		// ***************************************************
		// カラム追加
		// ***************************************************
		public void addColumn(String name) {

			// まず JTable が直接管理しているカラムを作る。
			TableColumn col = new TableColumn();
			this.addColumn(col);

			// データモデルにも指定した名前(Identifier)で追加する
			((DefaultTableModel)this.dataModel).addColumn(name);


		}
		public void addColumn(String name, boolean flg) {

			// まず JTable が直接管理しているカラムを作る。
			TableColumn col = new TableColumn();
			this.addColumn(col);

			// データモデルにも指定した名前(Identifier)で追加する
			((DefaultTableModel)this.dataModel).addColumn(name);

		}

		// ***************************************************
		// コンボボックスカラムの追加
		// ***************************************************
		public void setColumnCombo(String name) {

			int column = (this.getColumn(name)).getModelIndex();
			TableColumn col = this.getColumnModel().getColumn(column);
			FSCalenderCombo combo = new FSCalenderCombo();
			col.setCellRenderer(new MyComboBoxRenderer());
			col.setCellEditor(new MyComboBoxEditor(combo));

		}

		// ***************************************************
		// セル内コンボボックス表示用
		// ***************************************************
		private class MyComboBoxRenderer extends FSCalenderCombo implements TableCellRenderer {

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

				String data = (String)table.getValueAt(row,column);
				this.setDate((String)data);
				
				return this;
			}
		}
		
		// ***************************************************
		// セル内コンボボックス入力用
		// ***************************************************
		private class MyComboBoxEditor implements TableCellEditor {
			private FSCalenderCombo _combo;
			private JTable jt = null;
			private int row;
			private int column;
			private Boolean flg = false;
			public MyComboBoxEditor(FSCalenderCombo combo ) {
				super();
				_combo = combo;
				
				_combo.addItemListener(new ItemListener() {
					
					@Override
					public void itemStateChanged(ItemEvent e) {
						
						String data = _combo.getDateStr();
						jt.setValueAt(data, row, column);
						
					}
				});
			}

			@Override
			public void addCellEditorListener(CellEditorListener arg0) {
				
			}
			@Override
			public void cancelCellEditing() {
				
			}
			@Override
			public Object getCellEditorValue() {
				return null;
			}
			@Override
			public boolean isCellEditable(EventObject arg0) {
				return true;
			}
			@Override
			public void removeCellEditorListener(CellEditorListener arg0) {
				
			}
			@Override
			public boolean shouldSelectCell(EventObject arg0) {
				return true;
			}
			@Override
			public boolean stopCellEditing() {
				return true;
			}
			@Override
			public Component getTableCellEditorComponent(JTable arg0,
					Object arg1, boolean arg2, int arg3, int arg4) {
				
				
				jt = arg0;
				row = arg3;
				column = arg4;

				String data = (String)table.getValueAt(row,column);
				_combo.setDate(data);
				
				return _combo;
			}
		}

		// ***************************************************
		//  行追加
		// ***************************************************
		public void addRow( ) {

			// 追加は空で良い
			Object obj [] = null;

			// データモデルに追加
			((DefaultTableModel)this.dataModel).addRow(obj);
			

		}

	}
}
メンテナンス


日時: 2013/10/17 00:31
名前: lightbox