2012-08-11 88 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) {} 
}