Skip to content

Instantly share code, notes, and snippets.

@firstspring1845
Created January 19, 2014 15:50
Show Gist options
  • Save firstspring1845/8506671 to your computer and use it in GitHub Desktop.
Save firstspring1845/8506671 to your computer and use it in GitHub Desktop.
package com.orekyuu.javatter.view;
import java.awt.Component;
import java.awt.Dimension;
import java.awt.Point;
import java.awt.event.MouseEvent;
import java.awt.event.MouseListener;
import java.lang.reflect.Method;
import javax.swing.JPanel;
import javax.swing.JTable;
import javax.swing.SwingUtilities;
import javax.swing.table.DefaultTableModel;
import javax.swing.table.TableCellRenderer;
public class TimelineTable extends JTable
{
private static final long serialVersionUID = 1L;
Method m;
public DefaultTableModel model = new DefaultTableModel(new Object[]{""}, 0);
public TimelineTable()
{
super();
this.setTableHeader(null);
this.setIntercellSpacing(new Dimension(0, 0));
this.setDefaultEditor(Object.class, null);
this.setModel(model);
this.setDefaultRenderer(Object.class, new TableCellRenderer(){
public Component getTableCellRendererComponent(JTable table, Object value, boolean select, boolean focus, int row, int column){
JPanel p = (JPanel)value;
p.setMinimumSize(null);
p.setPreferredSize(null);
p.setMaximumSize(null);
p.setSize(p.getPreferredSize()); //processMouseEventのために必要
int height = p.getPreferredSize().height;
//呼び出しがループするのを防ぐ
if(table.getRowHeight(row) != height)
{
table.setRowHeight(row, p.getPreferredSize().height);
}
return p;
}
});
try
{
m = Component.class.getDeclaredMethod("processMouseEvent",MouseEvent.class);
m.setAccessible(true);
}
catch(Exception e)
{
}
}
public boolean dirty = true;
public void addTop(Object o)
{
model.insertRow(0, new Object[]{o});
}
public void addLast(Object o)
{
model.addRow(new Object[]{o});
}
@Override
public void processMouseEvent(MouseEvent e)
{
Component c = null;
try
{
int row = rowAtPoint(new Point(e.getX(), e.getY()));
c = prepareRenderer(this.getCellRenderer(row, 0), row, 0);
int height = 0;
for(int i = 0; i < row; i++)
{
height += getRowHeight(i);
}
//PopupMenu等のためにaddして終わったらremoveしてやる(親コンポーネントを要求するので)
this.add(c);
c.setLocation(0, height);
MouseEvent me = new MouseEvent(c, e.getID(), e.getWhen(), e.getModifiers(), e.getX(), e.getY()-height, e.getClickCount(), e.isPopupTrigger());
Component cc = SwingUtilities.getDeepestComponentAt(c, e.getX(), e.getY()-height);
m.invoke(cc, SwingUtilities.convertMouseEvent(c, me, cc));
}
catch(Throwable t)
{
//t.printStackTrace();
}
finally
{
this.remove(c);
this.repaint();
}
}
}
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment