2012-08-11 93 views
2

我正在用Java编写一个医院项目,我做了一个JTable,它从SQL数据库获取医院名称和医院图像链接,即"Click to see more"。我的问题是数据已成功从数据库中提取到表中,但我无法单击表格单元格中的链接。如何使一个JTable单元(链接)可点击

如何使链接处于活动状态?

+1

问题是否解决检查点击,确定被点击的链接,或者对已知的链接进行操作?你有什么尝试,你卡在哪里? – 2012-08-11 07:16:42

回答

5

您可以制作一个TableCellEditor,其isCellEditable方法可用于在单击鼠标时激活。坦率地说,这只是混乱。

或者,您可以直接将MouseListener附加到表格并监视mouseClicked事件。

上的点击事件,你可以需要getSelectedColumngetSelectedRow,以确定他们是否点击你想要的列,并从选定单元格链接值,使用getValueAt

你需要采取考虑到表格可能被排序或者列不再以你开始使用它们的顺序(用户可能已经移动它们)。

然后你需要convertColumnIndexToViewconvertRowIndexToModel

简单:d

7

考虑使用JXTable(一类SwingX):它支持超链接渲染器,可以配置做任何动作的基础上,单元格的值

JXTable table = new JXTable(myModel); 
AbstractHyperlinkAction<Object> simpleAction = new AbstractHyperlinkAction<Object>(null) { 

    public void actionPerformed(ActionEvent e) { 
     // here goes what you want to do on activating the hyperlink 
     //LOG.info("hit: " + getTarget()); 
    } 

}; 
TableCellRenderer renderer = new DefaultTableRenderer(
    new HyperlinkProvider(simpleAction)); 
table.getColumnExt(0).setEditable(false); 
table.getColumnExt(0).setCellRenderer(renderer); 
+0

是的这就是我认为的答案。 – 2014-05-15 16:31:57

+0

如何在特定的鼠标事件上触发此操作 - 即右键单击?目前,这将触发任何鼠标左键或右键。 – jeemar 2015-07-13 20:58:51

2

我认为,避免外部库是一个更好的方式去为MadProgrammer建议,但我想swingx仍然是​​纯java。无论如何,我会使用mouseClicked监听器,然后以这个问题How to add hyperlink in JLabel中描述的方式打开uri。

JTable table = new JTable(); 

table.addMouseListener(new MouseAdapter() { 
    public void mouseClicked(MouseEvent e) { 

     int row = table.getSelectedRow(); 
     int col = table.getSelectedColumn(); 

     //build your address/link 

     URI uri = new URI("http: your link here"); 

     //see below 
     open(uri); 
     } 
    }); 

//Then elsewhere as from the McDowell answer 
private static void open(URI uri) { 
    if (Desktop.isDesktopSupported()) { 
    try { 
     Desktop.getDesktop().browse(uri); 
     } catch (IOException e) { /* TODO: error handling */ } 
    } else { /* TODO: error handling */ } 
} 
0

我解决加入可点击在细胞内的按钮,我跟着这个教程Table Button Column来自Rob Camick:

String[] columnNames = {"First Name", "Last Name", ""}; 
Object[][] data = 
{ 
    {"Homer", "Simpson", "delete Homer"}, 
    {"Madge", "Simpson", "delete Madge"}, 
    {"Bart", "Simpson", "delete Bart"}, 
    {"Lisa", "Simpson", "delete Lisa"}, 
}; 

DefaultTableModel model = new DefaultTableModel(data, columnNames); 
JTable table = new JTable(model); 

然后:

Action delete = new AbstractAction() 
{ 
    public void actionPerformed(ActionEvent e) 
    { 
     JTable table = (JTable)e.getSource(); 
     int modelRow = Integer.valueOf(e.getActionCommand()); 
     ((DefaultTableModel)table.getModel()).removeRow(modelRow); 
    } 
}; 

ButtonColumn buttonColumn = new ButtonColumn(table, delete, 2); 
buttonColumn.setMnemonic(KeyEvent.VK_D); 

哪里ButtonColumn类是:

import java.awt.*; 
import java.awt.event.*; 
import javax.swing.*; 
import javax.swing.border.*; 
import javax.swing.table.*; 

/** 
* The ButtonColumn class provides a renderer and an editor that looks like a 
* JButton. The renderer and editor will then be used for a specified column 
* in the table. The TableModel will contain the String to be displayed on 
* the button. 
* 
* The button can be invoked by a mouse click or by pressing the space bar 
* when the cell has focus. Optionally a mnemonic can be set to invoke the 
* button. When the button is invoked the provided Action is invoked. The 
* source of the Action will be the table. The action command will contain 
* the model row number of the button that was clicked. 
* 
*/ 
public class ButtonColumn extends AbstractCellEditor 
    implements TableCellRenderer, TableCellEditor, ActionListener, MouseListener 
{ 
    private JTable table; 
    private Action action; 
    private int mnemonic; 
    private Border originalBorder; 
    private Border focusBorder; 

    private JButton renderButton; 
    private JButton editButton; 
    private Object editorValue; 
    private boolean isButtonColumnEditor; 

    /** 
    * Create the ButtonColumn to be used as a renderer and editor. The 
    * renderer and editor will automatically be installed on the TableColumn 
    * of the specified column. 
    * 
    * @param table the table containing the button renderer/editor 
    * @param action the Action to be invoked when the button is invoked 
    * @param column the column to which the button renderer/editor is added 
    */ 
    public ButtonColumn(JTable table, Action action, int column) 
    { 
     this.table = table; 
     this.action = action; 

     renderButton = new JButton(); 
     editButton = new JButton(); 
     editButton.setFocusPainted(false); 
     editButton.addActionListener(this); 
     originalBorder = editButton.getBorder(); 
     setFocusBorder(new LineBorder(Color.BLUE)); 

     TableColumnModel columnModel = table.getColumnModel(); 
     columnModel.getColumn(column).setCellRenderer(this); 
     columnModel.getColumn(column).setCellEditor(this); 
     table.addMouseListener(this); 
    } 


    /** 
    * Get foreground color of the button when the cell has focus 
    * 
    * @return the foreground color 
    */ 
    public Border getFocusBorder() 
    { 
     return focusBorder; 
    } 

    /** 
    * The foreground color of the button when the cell has focus 
    * 
    * @param focusBorder the foreground color 
    */ 
    public void setFocusBorder(Border focusBorder) 
    { 
     this.focusBorder = focusBorder; 
     editButton.setBorder(focusBorder); 
    } 

    public int getMnemonic() 
    { 
     return mnemonic; 
    } 

    /** 
    * The mnemonic to activate the button when the cell has focus 
    * 
    * @param mnemonic the mnemonic 
    */ 
    public void setMnemonic(int mnemonic) 
    { 
     this.mnemonic = mnemonic; 
     renderButton.setMnemonic(mnemonic); 
     editButton.setMnemonic(mnemonic); 
    } 

    @Override 
    public Component getTableCellEditorComponent(
     JTable table, Object value, boolean isSelected, int row, int column) 
    { 
     if (value == null) 
     { 
      editButton.setText(""); 
      editButton.setIcon(null); 
     } 
     else if (value instanceof Icon) 
     { 
      editButton.setText(""); 
      editButton.setIcon((Icon)value); 
     } 
     else 
     { 
      editButton.setText(value.toString()); 
      editButton.setIcon(null); 
     } 

     this.editorValue = value; 
     return editButton; 
    } 

    @Override 
    public Object getCellEditorValue() 
    { 
     return editorValue; 
    } 

// 
// Implement TableCellRenderer interface 
// 
    public Component getTableCellRendererComponent(
     JTable table, Object value, boolean isSelected, boolean hasFocus, int row, int column) 
    { 
     if (isSelected) 
     { 
      renderButton.setForeground(table.getSelectionForeground()); 
      renderButton.setBackground(table.getSelectionBackground()); 
     } 
     else 
     { 
      renderButton.setForeground(table.getForeground()); 
      renderButton.setBackground(UIManager.getColor("Button.background")); 
     } 

     if (hasFocus) 
     { 
      renderButton.setBorder(focusBorder); 
     } 
     else 
     { 
      renderButton.setBorder(originalBorder); 
     } 

//  renderButton.setText((value == null) ? "" : value.toString()); 
     if (value == null) 
     { 
      renderButton.setText(""); 
      renderButton.setIcon(null); 
     } 
     else if (value instanceof Icon) 
     { 
      renderButton.setText(""); 
      renderButton.setIcon((Icon)value); 
     } 
     else 
     { 
      renderButton.setText(value.toString()); 
      renderButton.setIcon(null); 
     } 

     return renderButton; 
    } 

// 
// Implement ActionListener interface 
// 
    /* 
    * The button has been pressed. Stop editing and invoke the custom Action 
    */ 
    public void actionPerformed(ActionEvent e) 
    { 
     int row = table.convertRowIndexToModel(table.getEditingRow()); 
     fireEditingStopped(); 

     // Invoke the Action 

     ActionEvent event = new ActionEvent(
      table, 
      ActionEvent.ACTION_PERFORMED, 
      "" + row); 
     action.actionPerformed(event); 
    } 

// 
// Implement MouseListener interface 
// 
    /* 
    * When the mouse is pressed the editor is invoked. If you then then drag 
    * the mouse to another cell before releasing it, the editor is still 
    * active. Make sure editing is stopped when the mouse is released. 
    */ 
    public void mousePressed(MouseEvent e) 
    { 
     if (table.isEditing() 
     && table.getCellEditor() == this) 
      isButtonColumnEditor = true; 
    } 

    public void mouseReleased(MouseEvent e) 
    { 
     if (isButtonColumnEditor 
     && table.isEditing()) 
      table.getCellEditor().stopCellEditing(); 

     isButtonColumnEditor = false; 
    } 

    public void mouseClicked(MouseEvent e) {} 
    public void mouseEntered(MouseEvent e) {} 
    public void mouseExited(MouseEvent e) {} 
}