我想建一個表,其中包括JComboBoxes作爲渲染器和編輯器兩個組件。這大多工作正常,但有兩件事我似乎無法解決。細胞之間可用性功能JComboBox的內JTable中
- Tab鍵應該做的JComboBox活躍
- 點擊下拉箭頭應立即打開選項列表
關於1,編輯組合應該將嵌入文本字段中的焦點,固定組合應允許向下箭頭打開選項列表。
關於2,我覺得這取決於什麼其他細胞是當前活動有時工作,但其他時間我需要雙擊。我無法使這種行爲保持一致。
爲了方便起見我已經包括其中(I相信)使用用於內JTable中嵌入JComboBoxes建議的方法的明顯例子。
謝謝你的建設性意見。
import java.awt.Component;
import java.util.*;
import javax.swing.*;
import javax.swing.table.*;
public class TableCombos
{
public static void main(String[] args)
{
JFrame frame = new JFrame("Frame");
frame.setDefaultCloseOperation(WindowConstants.EXIT_ON_CLOSE);
AbstractTableModel model = new DefaultTableModel()
{
String[] columnHeaders = new String[]{"label", "combo-edit", "combo-fixed"};
Class<?>[] columnClasses = new Class<?>[]{String.class, Double.class, Double.class};
List<Object[]> data = new ArrayList<>();
{
data.add(new Object[]{"row 1", 1.0d, 2.0d});
data.add(new Object[]{"row 2", 2.0d, 3.0d});
}
@Override
public int getColumnCount()
{
return columnHeaders.length;
}
@Override
public boolean isCellEditable(int row, int column)
{
return column != 0;
}
@Override
public int getRowCount()
{
if (data == null) // race condition
return 0;
return data.size();
}
@Override
public Object getValueAt(int row, int column)
{
return data.get(row)[column];
}
@Override
public void setValueAt(Object aValue, int row, int column)
{
data.get(row)[column] = aValue;
}
@Override
public Class<?> getColumnClass(int column)
{
return columnClasses[column];
}
@Override
public String getColumnName(int column)
{
return columnHeaders[column];
}
};
JTable table = new JTable(model);
table.setSurrendersFocusOnKeystroke(true);
TableColumn c1 = table.getColumnModel().getColumn(1);
TableColumn c2 = table.getColumnModel().getColumn(2);
JComboBox<Double> editorComboEditable = new JComboBox<>(new Double[]{1.0d, 2.0d, 3.0d});
editorComboEditable.setEditable(true);
c1.setCellEditor(new DefaultCellEditor(editorComboEditable));
c2.setCellEditor(new DefaultCellEditor(new JComboBox<>(new Double[]{1.0d, 2.0d, 3.0d})));
final JComboBox<Double> rendererComboEditable = new JComboBox<>(new Double[]{1.0d, 2.0d, 3.0d});
rendererComboEditable.setEditable(true);
final JComboBox<Double> rendererComboFixed = new JComboBox<>(new Double[]{1.0d, 2.0d, 3.0d});
c1.setCellRenderer(new TableCellRenderer()
{
@Override
public Component getTableCellRendererComponent(JTable t, Object value, boolean isSelected, boolean hasFocus, int row, int column)
{
rendererComboEditable.setSelectedItem(value);
return rendererComboEditable;
}
});
c2.setCellRenderer(new TableCellRenderer()
{
@Override
public Component getTableCellRendererComponent(JTable t, Object value, boolean isSelected, boolean hasFocus, int row, int column)
{
rendererComboFixed.setSelectedItem(value);
return rendererComboFixed;
}
});
frame.getContentPane().add(new JScrollPane(table));
frame.pack();
frame.setVisible(true);
}
}
*「我已經包含了一個明顯的例子」 *很好的例子。不過,要更好地解決(包括)進口問題。我通常發現所有'java.awt','java.awt.event'和'javax.swing'都可以在沒有衝突的情況下導入,所以這隻需要再多3行代碼就可以編譯一個GUI示例,並且不會出現ifs或buts'.. – 2013-05-05 03:44:49
謝謝@AndrewThompson我試圖保持簡短。已包括進口和類別十二月。 – pstanton 2013-05-05 03:57:13
嗯..'列表