我在JTable
中有一个单元格,其中JPanel
位于其中。 JPanel
里面有2个标签。单击左侧标签时我想做不同的动作,我想在点击右侧动作时再做一次操作。我不想使用TableCellEditor
,这使我的代码变得如此复杂。我的单元格值有一系列类型。
我编写以下代码以从鼠标事件中获取所选组件,但没有成功。我也试过SwingUtilies.convertMouseEvent
,但它没有改变任何东西。下面的代码有什么问题?为什么JComponent
包含方法不会检查鼠标点。
contSimTable.addMouseListener(new MouseAdapter() {
public void mouseClicked(final MouseEvent event) {
if (SwingUtilities.isLeftMouseButton(event)) {
if (event.getClickCount() == 2) {
JTable target = (JTable) event.getSource();
int row = contSimTable.getSelectedRow();
int column = contSimTable.getSelectedColumn();
/**
* convert from view colum to model.It is column index
* which is stored in table model
*/
int modelColumn = target.convertColumnIndexToModel(column);
Object clickedCell = contSimTable.getValueAt(row, modelColumn);
if (clickedCell instanceof JPanel) {
boolean isSecond = false;
JLabel a = (JLabel) ((JPanel) clickedCell)
.getComponent(0);
JLabel b = (JLabel) ((JPanel) clickedCell)
.getComponent(1);
if (a.contains(event.getPoint())) {
isSecond = false;
}
//
if (b.contains(event.getPoint())) {
isSecond = true;
}
}
}
}
}
});
答案 0 :(得分:2)
TableCellEditor
是正确的做法。有许多方法可以解决不同的数据类型:
默认情况下,正如here所述。
按TableColumn
,如图所示here。
通过getColumnClass()
返回的类型标记,如here所示。
重写getCellEditor()
,如图here所示。
如需更具体的指导,请修改您的问题,以包含代表您选择的方法的sscce。
答案 1 :(得分:0)
您正在将MouseListener添加到JTable。您可以更轻松地将所需的侦听器直接添加到单个JComponent。
实施例
你是怎么做的:
contSimTable.addMouseListener(new MouseAdapter() {
public void mouseClicked(final MouseEvent event)
{
//Coordinate calculation for the jlabels
}
});
尝试:
jlabel.addMouseListener(new MouseAdapter() {
public void mouseClicked(final MouseEvent event)
{
//Do stuff here
}
});
答案 2 :(得分:0)
在评论中澄清contSimTable
和target
变量是相同的JTable
个实例后,我认为语句int modelColumn = target.convertColumnIndexToModel(column);
似乎是您遇到的不当行为的原因。
JTable.getValueAt()
方法已在幕后调用convertColumnIndexToModel()
和convertRowIndexToModel
,因此您可能不应自行调用这些方法。 (顺便说一句,如果由于某种原因你必须手动转换为模型,你应该对该行做同样的事情吗?)。
虽然目前还不清楚你要做什么,因为你的表似乎在其模型中存储了组件(JPanel
)而不是数据。如果您尝试自定义单元格的显示,则应使用TableCellRenderer,如果要编辑单元格,则应使用其他人已建议的TableCellEditor
。理想情况下,您的程序应该只与TableModel
交互,然后在数据更改期间通知表格重新绘制自己。
我希望这会有所帮助