У меня есть требование визуализации выделенных/сфокусированных ячеек в JTable
с JComboBox
, если рассматриваемый столбец использует комбо в качестве редактора. Цель этого - дать подсказку пользователям о том, что ячейки в столбце редактируются с помощью комбо, а не JTextField
.Render TableCell с JComboBox и фоном выбора
Моя проблема в том, что для других LookAndFeels
, чем Металл, невозможно установить выделение фона таблицы в поле со списком. Если щелкнуть или перейти с клавиатуры на «комбинированный столбец», выбранная ячейка будет отображаться комбо с фоном по умолчанию.
Metal L & F работает так, как я хочу, но это не вариант, так как наши клиенты используют либо вещество/Nimbus/Windows L & F, и это не работает ни для одного из них.
Надеюсь, что я был достаточно ясен, любая помощь приветствуется!
Выберите ячейки в «Combo колонке» этого SSCCE, чтобы увидеть, что я имею в виду:
import java.awt.Component;
import javax.swing.DefaultCellEditor;
import javax.swing.DefaultComboBoxModel;
import javax.swing.JComboBox;
import javax.swing.JFrame;
import javax.swing.JScrollPane;
import javax.swing.JTable;
import javax.swing.ListSelectionModel;
import javax.swing.SwingUtilities;
import javax.swing.UIManager;
import javax.swing.table.DefaultTableCellRenderer;
import javax.swing.table.DefaultTableModel;
import javax.swing.table.TableCellRenderer;
import javax.swing.table.TableModel;
import com.sun.java.swing.plaf.nimbus.NimbusLookAndFeel;
public class RenderSelectedCellWithComboSSCCE extends JFrame
{
RenderSelectedCellWithComboSSCCE()
{
setDefaultCloseOperation(DISPOSE_ON_CLOSE);
add(new JScrollPane(createTable()));
pack();
}
private JTable createTable()
{
TableModel model = new DefaultTableModel(
new Object [][] {{"A", "Item 0"},
{"B", "Item 1"},
{"C", "Item 2"},
{"D", "Item 3"},
{"E", "Item 4"}},
new String [] {"TextField", "Combo"});
JTable table = new JTable(model);
table.setSelectionMode(ListSelectionModel.SINGLE_SELECTION);
DefaultCellEditor editor = new DefaultCellEditor(new JComboBox(new Object[]{"Item 0", "Item 1", "Item 2", "Item 3", "Item 4"}));
editor.setClickCountToStart(2);
table.getColumnModel().getColumn(1).setCellEditor(editor);
table.getColumnModel().getColumn(1).setCellRenderer(new ComboCellRenderer());
return table;
}
/**
* Renderer that demonstrates problem rendering selected cells with a combo with selection background.
*/
private static class ComboCellRenderer implements TableCellRenderer
{
final TableCellRenderer defaultRenderer;
final JComboBox combo;
ComboCellRenderer()
{
defaultRenderer = new DefaultTableCellRenderer();
combo = new JComboBox();
}
@Override
public Component getTableCellRendererComponent(JTable table, Object value, boolean isSelected, boolean hasFocus, int row, int column)
{
if (hasFocus && table != null && table.isCellEditable(row, column))
{
combo.setModel(new DefaultComboBoxModel(new Object[]{value}));
combo.setSelectedItem(value);
combo.setBackground(table.getSelectionBackground()); // This only have desired effect for Metal L&F
return combo;
}
else
{
return defaultRenderer.getTableCellRendererComponent(table, value, isSelected, hasFocus, row, column);
}
}
}
public static void main(String[] args)
{
SwingUtilities.invokeLater(new Runnable()
{
@Override
public void run()
{
setLookAndFeel();
new RenderSelectedCellWithComboSSCCE().setVisible(true);
}
private void setLookAndFeel()
{
try
{
//UIManager.setLookAndFeel(UIManager.getCrossPlatformLookAndFeelClassName()); // Metal works fine
UIManager.setLookAndFeel(new NimbusLookAndFeel());
//UIManager.setLookAndFeel(new WindowsLookAndFeel());
//UIManager.setLookAndFeel(UIManager.getSystemLookAndFeelClassName());
//UIManager.setLookAndFeel("org.jvnet.substance.SubstanceLookAndFeel");
}
catch (Exception e)
{
throw new RuntimeException("Failed to set LookAndFeel", e);
}
}
});
}
}
hmmmm, just question -> why setOpaque (true); для извлеченных JComponents для TableCellRenderer, может быть, я ошибаюсь, но если TableCell содержит другой JComponet в качестве JLabel, тогда я добавляю для Nimbus L & F всюду setOpaque (false); +1 – mKorbel
+1 Возможно, некоторые проблемы с границами будут исправлены – StanislavL