如何为 JTable
中的每条记录启用超链接?
我想要做的是让用户可以点击超链接,然后显示他们可以编辑/更新的信息。
或者,我如何启用表格数据的就地编辑?
另一个问题是我目前正在使用以下方式来显示不同的屏幕。但这不是一种优雅的方式,我理解我们应该使用 cardlayout,但具体如何去做呢?
mainPanel.setVisible(false);
createBlogEntryPanel.setVisible(true);
setComponent(createBlogEntryPanel);
最佳答案
要解决 JTable
消耗事件的问题,您可以将自己的 MouseListener
(或 MouseAdapter
)添加到 JTable
并在此监听器中进行操作。以下是您可以实现的示例:
public class Main extends JFrame {
public Main() {
super();
DefaultTableModel dt = new DefaultTableModel(
new String[][] { { "http://google.com" }, { "http://gmail.com" } }, new String[] { "Url" });
final JTable t = new JTable(dt);
t.addMouseListener(new MouseAdapter() {
@Override
public void mouseClicked(MouseEvent e) {
int row = t.rowAtPoint(new Point(e.getX(), e.getY()));
int col = t.columnAtPoint(new Point(e.getX(), e.getY()));
System.out.println(row + " " + col);
String url = (String) t.getModel().getValueAt(row, col);
System.out.println(url + " was clicked");
// DO here what you want to do with your url
}
@Override
public void mouseEntered(MouseEvent e) {
int col = t.columnAtPoint(new Point(e.getX(), e.getY()));
if (col == 0) {
t.setCursor(new Cursor(Cursor.HAND_CURSOR));
}
}
@Override
public void mouseExited(MouseEvent e) {
int col = t.columnAtPoint(new Point(e.getX(), e.getY()));
if (col != 0) {
t.setCursor(new Cursor(Cursor.DEFAULT_CURSOR));
}
}
});
add(new JScrollPane(t));
t.getColumnModel().getColumn(0).setCellRenderer(new TableCellRenderer() {
@Override
public Component getTableCellRendererComponent(JTable table, final Object value, boolean arg2,
boolean arg3, int arg4, int arg5) {
final JLabel lab = new JLabel("<html><a href=\"" + value + "\">" + value + "</a>");
return lab;
}
});
setSize(700, 500);
setLocationRelativeTo(null);
setVisible(true);
setDefaultCloseOperation(EXIT_ON_CLOSE);
}
public static void main(String[] args) {
try {
UIManager.setLookAndFeel(UIManager.getSystemLookAndFeelClassName());
} catch (Exception e) {
e.printStackTrace();
}
new Main();
}
}
关于java - 单击 jtable 中的超链接?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/4256680/