|
日時: 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);
}
}
}
|