2012-05-23 3 views
0

Я хочу отобразить текст над ячейкой JTable, когда кто-то редактирует ячейку. Текст почти такой же, как всплывающая подсказка с исключением, что текст должен отображаться только при редактировании ячейки, и текст должен оставаться до тех пор, пока редактирование не будет закончено.Как отображать текст над ячейкой JTable при редактировании

Как я мог достичь такого поведения?

То, что я пробовал до сих пор, заключается в переопределении метода getCellEditorJTable, но это будет только стандартная подсказка, но мне нужно постоянно отображать текст на время редактирования.

@Override 
public TableCellEditor getCellEditor(int row, int column) { 
    TableCellEditor editor = super.getCellEditor(row, column); 
    Component component = editor.getTableCellEditorComponent(this, getValueAt(row, column), isCellSelected(row, column), row, column); 
    if(component instanceof JTextField) { 
     JTextField textfield = (JTextField) component; 
     textfield.setToolTipText("tooltip"); 
    } 
    return editor; 
} 

ответ

5

Другим вариантом было бы также добавить JLabel (или любой компонент), когда вы начнете редактировать ячейку. Всякий раз, когда он останавливается, вы удаляете компонент.

Поскольку вы хотите, чтобы всплывающая подсказка/метка отображалась над отредактированной ячейкой, для первой строки требуется небольшой трюк.

Вот пример, показывающий, что я имею в виду:

import java.awt.Container; 
import java.awt.Point; 
import java.util.EventObject; 

import javax.swing.JComponent; 
import javax.swing.JFrame; 
import javax.swing.JLabel; 
import javax.swing.JScrollPane; 
import javax.swing.JTable; 
import javax.swing.SwingUtilities; 
import javax.swing.event.ChangeEvent; 
import javax.swing.table.DefaultTableModel; 

public class TestTable { 

    public JFrame f; 
    private JLabel tooltip; 
    private MyTable table; 

    public class MyTable extends JTable { 

     @Override 
     public boolean editCellAt(int row, int column, EventObject e) { 
      boolean editCellAt = super.editCellAt(row, column, e); 
      if (editCellAt) { 
       Point editedCellLocation = getCellRect(getEditingRow(), getEditingColumn(), true).getLocation(); 
       if (tooltip != null) { 
        removeTooltip(); 
       } 
       tooltip = new JLabel("Hello some nice tooltip"); 
       tooltip.setOpaque(true); 
       tooltip.setSize(tooltip.getPreferredSize()); 
       if (getEditingRow() == 0) { 
        tooltip.setLocation(editedCellLocation.x, getTableHeader().getHeight() - tooltip.getHeight()); 
        getTableHeader().add(tooltip); 
       } else { 
        tooltip.setLocation(editedCellLocation.x, editedCellLocation.y - tooltip.getHeight()); 
        add(tooltip); 
       } 
       ((JComponent) tooltip.getParent()).repaint(tooltip.getBounds()); 
      } 
      return editCellAt; 
     } 

     @Override 
     public void editingStopped(ChangeEvent e) { 
      super.editingStopped(e); 
      removeTooltip(); 
     } 

     protected void removeTooltip() { 
      if (tooltip != null) { 
       Container parent = tooltip.getParent(); 
       parent.remove(tooltip); 
       ((JComponent) parent).repaint(tooltip.getBounds()); 
       tooltip = null; 
      } 
     } 
    } 

    public static void main(String[] args) { 
     SwingUtilities.invokeLater(new Runnable() { 

      @Override 
      public void run() { 
       new TestTable().initUI(); 
      } 
     }); 
    } 

    protected void initUI() { 
     table = new MyTable(); 
     table.setModel(new TestTableModel()); 
     f = new JFrame(); 
     f.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); 
     f.setSize(300, 300); 
     f.setLocationRelativeTo(null); 
     f.add(new JScrollPane(table)); 
     f.setVisible(true); 
    } 

    public class TestTableModel extends DefaultTableModel { 

     public TestTableModel() { 
      super(new String[] { "DATA" }, 3); 
      setValueAt(Double.valueOf(-0.1), 0, 0); 
      setValueAt(Double.valueOf(+0.1), 1, 0); 
      setValueAt(Double.valueOf(0), 2, 0); 
     } 
    } 

} 
+0

Идеальное решение. Только то, что я искал. – flash

+0

+1 [для всплывающего окна JLabel] (http://stackoverflow.com/a/5957405/714968) – mKorbel

Смежные вопросы