Это нормальное поведение. При показе JPopupMenu "фокус ввода" у ячейки проподает поэтому синяя граница у ячейки и не отрисовывается. Впринцыпе можно пошаманить с методом JTable.prepareRenderer().
| Код | import java.awt.Component; import java.awt.event.MouseAdapter; import java.awt.event.MouseEvent; import javax.swing.JFrame; import javax.swing.JMenuItem; import javax.swing.JPopupMenu; import javax.swing.JScrollPane; import javax.swing.JTable; import javax.swing.SwingUtilities; import javax.swing.table.DefaultTableModel; import javax.swing.table.TableCellRenderer;
public class JVingradExample extends JFrame {
public static void main(String[] args) { SwingUtilities.invokeLater(new Runnable() { @Override public void run() { new JVingradExample().setVisible(true); } }); }
public JVingradExample() { super("Vingrad Example"); setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
final JPopupMenu popupMenu = new JPopupMenu("PopupMenu"); popupMenu.add(new JMenuItem("MenuItem1")); popupMenu.add(new JMenuItem("MenuItem2")); popupMenu.add(new JMenuItem("MenuItem3"));
JTable table = new JTable(new DefaultTableModel(new String[]{"A", "B", "C", "D", "E"}, 10)) { @Override public Component prepareRenderer(TableCellRenderer renderer, int row, int column) { Object value = getValueAt(row, column);
boolean isSelected = false; boolean hasFocus = false;
boolean isTemporaryFocusLost = popupMenu.isVisible();
// Only indicate the selection and focused cell if not printing if (!isPaintingForPrint()) { isSelected = isCellSelected(row, column);
boolean rowIsLead = (selectionModel.getLeadSelectionIndex() == row); boolean colIsLead = (columnModel.getSelectionModel().getLeadSelectionIndex() == column);
hasFocus = (rowIsLead && colIsLead) && (isTemporaryFocusLost || isFocusOwner()); }
return renderer.getTableCellRendererComponent(this, value, isSelected, hasFocus, row, column); } }; table.addMouseListener(new MouseAdapter() { @Override public void mousePressed(MouseEvent e) { JTable table = (JTable) e.getSource(); if (SwingUtilities.isRightMouseButton(e)) { int row = table.rowAtPoint(e.getPoint()); int column = table.columnAtPoint(e.getPoint()); if (row >= 0 && column >= 0) { if (table.isEditing() && !table.getCellEditor().stopCellEditing()) { return ; } table.changeSelection(row, column, false, false); } } showPopupMenu(e); }
@Override public void mouseReleased(MouseEvent e) { showPopupMenu(e); }
void showPopupMenu(MouseEvent e) { if (e.isPopupTrigger()) { popupMenu.show(e.getComponent(), e.getX(), e.getY()); } } });
add(new JScrollPane(table)); pack(); setLocationRelativeTo(null); }
}
|
Код метод prepareRenderer полностью взят из исходников Swing-а. |