gpt4 book ai didi

Java 表格单元格渲染器仅在第一次单击后才激活

转载 作者:行者123 更新时间:2023-12-01 15:00:14 25 4
gpt4 key购买 nike

我创建了一个用于立即交互的表格(对于数独解算器),但只有在我单击单元格后,鼠标事件(进入、退出、单击)才会到达单元格渲染器。 (对于每个单元格,我必须在激活渲染器之前单击一次。稍后返回该单元格,它将立即工作。)

如何更改代码以立即激活表格单元格?或者我可以找出第一次鼠标单击时到底发生了什么,以便我可以在创建表后立即执行这些操作吗? (我 try catch UI 层次结构所有级别上的鼠标事件,但找不到。)

我已将表格缩小到最小 1x1,并删除了所有不必要的代码。其余代码显示如下。请注意,鼠标悬停(显示一个小黑色方 block )仅在单击一次后才处于 Activity 状态。 (代码完整,可以直接编译。)

import javax.swing.*;
import javax.swing.event.CellEditorListener;
import javax.swing.table.*;
import java.awt.*;
import java.awt.event.MouseEvent;
import java.awt.event.MouseListener;
import java.util.EventObject;


public class GUI extends JFrame
{
private class Table extends JTable
{
public Table()
{
super(new AbstractTableModel()
{
public int getRowCount() { return 1; }
public int getColumnCount() { return 1; }
public Object getValueAt(int x, int y) { return null; }
@Override public boolean isCellEditable(int x, int y) { return true; }
});
}
@Override public TableCellRenderer getCellRenderer(int x, int y) { return new Editor(); }
@Override public TableCellEditor getCellEditor(int x, int y) { return new Editor(); }
}

private class Editor extends JComponent implements TableCellEditor, TableCellRenderer, MouseListener
{
private boolean hasFocus = false;

public Editor()
{
addMouseListener(this);
}

@Override public void paintComponent(Graphics g)
{
if (hasFocus)
{
g.fillRect(0, 0, 9, 9);
}
}

public void mouseEntered(MouseEvent e)
{
hasFocus = true;
repaint();
}

public void mouseExited(MouseEvent e)
{
hasFocus = false;
repaint();
}

public void mouseClicked(MouseEvent e) { }
public void mousePressed(MouseEvent e) { }
public void mouseReleased(MouseEvent e) { }

public Object getCellEditorValue() { return 0; }
public boolean isCellEditable(EventObject e) { return true; }
public boolean shouldSelectCell(EventObject e) { return false; }
public boolean stopCellEditing() { return true; }
public void cancelCellEditing() { }
public void addCellEditorListener(CellEditorListener l) { }
public void removeCellEditorListener(CellEditorListener l) { }
public Component getTableCellEditorComponent(JTable t, Object v, boolean s, int x, int y) { return this; }
public Component getTableCellRendererComponent(JTable t, Object v, boolean s, boolean f, int x, int y) { return this; }
}

public static void main(String[] args)
{
new GUI();
}

public GUI()
{
setContentPane(new Table());
setDefaultCloseOperation (WindowConstants.EXIT_ON_CLOSE);
pack();
setVisible(true);
}
}

最佳答案

那是因为渲染器不应该处理事件。渲染器是一个独特的组件,仅用于绘制表或列中的每个单元格。

当表格自行绘制时,它会迭代单元格。对于每个单元格,修改渲染器组件,然后获取渲染器组件的“屏幕截图”并将其粘贴到表格单元格中。所以它无法处理事件。您应该在表本身上添加一个事件监听器。不在渲染器上。

单击后,它会起作用,因为您的渲染器也是一个编辑器,并且编辑器可以处理事件。但在我看来,你的表格实际上是不可编辑的,而且你根本不应该有编辑器。相反,在表上添加一个监听器。

关于Java 表格单元格渲染器仅在第一次单击后才激活,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/13762758/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com