- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
我有一个 JTable,我将三个 JComboBox 添加到三个不同的列。现在我想为我的每一行设置所选项目。问题是,我需要每一行的 ID 才能做到这一点。所以我尝试了不同的监听器,最好的结果是使用 FocusListener,但是我总是必须先单击该行,然后单击 JComboBox,这很费力。这是一个例子:
JTable table = new JTable();
Vector<ArrayList<Object>> data = new Vector<ArrayList<Object>>();
for (int i = 0; i < 5; i++)
{
ArrayList<Object> object = new ArrayList<Object>();
object.add(i);
object.add("name");
object.add(i+1);
object.add(i+1);
object.add(i+1);
data.add(object);
}
DefaultTableModel tableModel = new DefaultTableModel() {
/**
*
*/
private static final long serialVersionUID = 1L;
@Override
public boolean isCellEditable(int row, int column) {
if (column < 2)
return false;
return true;
}
};
tableModel.setColumnIdentifiers(new String[] {"ID", "Name", "OK", "Other", "Error"});
tableModel.addTableModelListener(new TableModelListener()
{
@Override
public void tableChanged(TableModelEvent e)
{
if (e.getType() == TableModelEvent.UPDATE)
{
int row = e.getFirstRow();
int column = e.getColumn();
TableModel table_model = (TableModel) e.getSource();
ArrayList<Object> changed_data = (ArrayList<Object>) table_model.getValueAt(row, column);
String row_id = String.valueOf(table_model.getValueAt(row, 0));
for (ArrayList<Object> list : data)
{
String compare_id = String.valueOf(list.get(0));
if (row_id.equals(compare_id))
{
list.set(column, String.valueOf(changed_data.get(0)));
for (int i = table_model.getRowCount()-1; i >= 0 ; i--)
{
tableModel.removeRow(i);
}
for (ArrayList<Object> object : data)
{
Vector<String> vector = new Vector<String>();
vector.addElement(String.valueOf(object.get(0)));
vector.addElement(String.valueOf(object.get(1)));
vector.addElement(String.valueOf(object.get(2)));
vector.addElement(String.valueOf(object.get(3)));
vector.addElement(String.valueOf(object.get(4)));
tableModel.addRow(vector);
}
TableColumn column_ok = table.getColumnModel().getColumn(2);
TableColumn column_other = table.getColumnModel().getColumn(3);
TableColumn column_error = table.getColumnModel().getColumn(4);
JComboBox<ArrayList<Object>> combobox_ok = new JComboBox<ArrayList<Object>>(data);
JComboBox<ArrayList<Object>> combobox_other = new JComboBox<ArrayList<Object>>(data);
JComboBox<ArrayList<Object>> combobox_error = new JComboBox<ArrayList<Object>>(data);
column_ok.setCellEditor(new DefaultCellEditor(combobox_ok));
column_other.setCellEditor(new DefaultCellEditor(combobox_other));
column_error.setCellEditor(new DefaultCellEditor(combobox_error));
break;
}
}
}
}
});
table.setModel(tableModel);
for (ArrayList<Object> object : data)
{
Vector<String> vector = new Vector<String>();
vector.addElement(String.valueOf(object.get(0)));
vector.addElement(String.valueOf(object.get(1)));
vector.addElement(String.valueOf(object.get(2)));
vector.addElement(String.valueOf(object.get(3)));
vector.addElement(String.valueOf(object.get(4)));
tableModel.addRow(vector);
}
TableColumn column_ok = table.getColumnModel().getColumn(2);
TableColumn column_other = table.getColumnModel().getColumn(3);
TableColumn column_error = table.getColumnModel().getColumn(4);
JComboBox<ArrayList<Object>> combobox_ok = new JComboBox<ArrayList<Object>>(data);
JComboBox<ArrayList<Object>> combobox_other = new JComboBox<ArrayList<Object>>(data);
JComboBox<ArrayList<Object>> combobox_error = new JComboBox<ArrayList<Object>>(data);
column_ok.setCellEditor(new DefaultCellEditor(combobox_ok));
column_other.setCellEditor(new DefaultCellEditor(combobox_other));
column_error.setCellEditor(new DefaultCellEditor(combobox_error));
JScrollPane scrollPane = new JScrollPane();
scrollPane.getViewport().add(table);
JFrame frame = new JFrame();
frame.add(scrollPane);
frame.setSize(400, 200);
frame.setVisible(true);
现在,在第一行第三列(“确定”)中,您可以在 JComboBox 中选择代表一行的不同条目。因此一行有三个引用另一行的 JComboBox。如果您单击此类 JComboBox,您会注意到它始终选择第一个条目,而不是您在单击之前看到的编号的条目。
也许现在你明白我想做什么了?
最佳答案
If you click in such a
JComboBox
, you will notice it always chooses the first entry and not the entry with the number you saw before clicking at it.
重点关注问题的这方面,以下简化、完整的示例始终在单元格编辑器处于 Activity 状态时显示选定的条目。您可以替换组合的 default renderer根据需要显示不同的结果。此外,
重写getPreferredScrollableViewportSize()
以建立所需的表格大小。
尽可能使用类型参数;根据需要重写 getColumnClass()
,对于 example .
请注意下面 isCellEditable()
的简化实现。
import java.awt.Dimension;
import java.awt.EventQueue;
import java.util.Arrays;
import java.util.Vector;
import javax.swing.DefaultCellEditor;
import javax.swing.JComboBox;
import javax.swing.JFrame;
import javax.swing.JScrollPane;
import javax.swing.JTable;
import javax.swing.table.DefaultTableModel;
import javax.swing.table.TableColumn;
/**
* @see https://stackoverflow.com/q/39993746/230513
*/
public class TableComboTest {
private Vector<Vector<String>> createData() {
Vector<Vector<String>> data = new Vector<Vector<String>>();
for (int i = 0; i < 5; i++) {
Vector<String> rowVector = new Vector<String>();
rowVector.add(String.valueOf(i));
rowVector.add("name");
rowVector.add(String.valueOf(i + 1));
rowVector.add(String.valueOf(i + 1));
rowVector.add(String.valueOf(i + 1));
data.add(rowVector);
}
return data;
}
private void display() {
Vector<Vector<String>> data = createData();
Vector<String> names = new Vector<>(Arrays.asList("ID", "Name", "OK", "Other", "Error"));
DefaultTableModel tableModel = new DefaultTableModel(data, names) {
@Override
public boolean isCellEditable(int row, int column) {
return column > 1;
}
};
JTable table = new JTable(tableModel) {
@Override
public Dimension getPreferredScrollableViewportSize() {
return new Dimension(getPreferredSize().width, getRowHeight() * 4);
}
};
TableColumn column_ok = table.getColumnModel().getColumn(2);
TableColumn column_other = table.getColumnModel().getColumn(3);
TableColumn column_error = table.getColumnModel().getColumn(4);
String[] choices = new String[]{"1", "2", "3", "4", "5"};
JComboBox<String> combobox_ok = new JComboBox<>(choices);
JComboBox<String> combobox_other = new JComboBox<String>(choices);
JComboBox<String> combobox_error = new JComboBox<String>(choices);
column_ok.setCellEditor(new DefaultCellEditor(combobox_ok));
column_other.setCellEditor(new DefaultCellEditor(combobox_other));
column_error.setCellEditor(new DefaultCellEditor(combobox_error));
JFrame frame = new JFrame();
frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
frame.add(new JScrollPane(table));
frame.pack();
frame.setVisible(true);
}
public static void main(String[] args) {
EventQueue.invokeLater(new TableComboTest()::display);
}
}
关于java - JTable 中 JCombobox 的 setSelectedItem,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/39993746/
我在使用 JComboBox 的 setSelectedItem 方法时遇到问题。它只是不起作用。这是我的代码;我的站类和分区类都还可以。所以他们不包括在内。无论我尝试什么,我都无法将项目设置为组合框
我创建了一个包含三个项目的组合框。我正在尝试按索引和值设置所选项目。 当我执行 setSelectedIndex () 时,代码运行良好。 我正在尝试按值设置所选项目。所以我尝试创建另一个具有相同值(
我在设置自定义 JComboBox 的精确值时遇到问题。如果我从以下类的 initialize() 方法调用 setSelectedItem(),它不会选择特定值。 扩展的 JComboBox 类是:
设置所选项目的原始代码是: public void setSelectedItem(Object anObject) { Object oldSelection = selectedItemR
我的 jTable 第 8 列是美国州列。这是我的代码,用于使用适当的项目设置 jComboBox 以显示状态。 当我使用 Buffered Reader 填充 Jtable 时,下面的代码可以很好地
我试图在填充组合框之后在我的 JPanel 类的构造函数中设置 JComboBox 的 setSelectedItem。 我为文本框设置了值,但我不明白为什么 setSelectedItem 似乎不起
我的代码很简单......我想当我按下按钮时将面板中所有标签的文本设置为“”(无)/正在工作/并将所有组合框设置为值1。//这不起作用。它仅将 ArrayList amout 中的第一个组合框(七个组
我有一个JComboBox JComboBox tableChoose = new JComboBox(); tableChoose.addItem("Bill"); tableChoose.addI
我在 JDialog 中有一个以 JComboBox 开头的表单: myJComboBox = new JComboBox(itemOfBox); myJpanel.add(myJComboBox);
我有一个 JTable,我将三个 JComboBox 添加到三个不同的列。现在我想为我的每一行设置所选项目。问题是,我需要每一行的 ID 才能做到这一点。所以我尝试了不同的监听器,最好的结果是使用 F
我有一个包含多个组合框的程序,每个组合框都有自己的 Action 监听器。从任一组合框中选择一项将更改一个或多个其他组合框中的项目。我遇到的问题是,为一个组合框调用 setSelectedItem()
这个问题已经有答案了: What is a NullPointerException, and how do I fix it? (12 个回答) 已关闭 7 年前。 我无法理解为什么这段代码不起作用
本文整理了Java中org.pentaho.ui.xul.components.XulMenuList.setSelectedItem()方法的一些代码示例,展示了XulMenuList.setSel
我有一个在 JComboBox 中值更改事件时调用的方法 public void actionPerformed( ActionEvent e ) { Object source = e.ge
请看下面的代码片段, String[] choices = {"Apple", "Banana", "Custard"}; JComboBox fruits = new JCombo
我是一名优秀的程序员,十分优秀!