gpt4 book ai didi

java - JTable 单元格中的 JComboBox。选择更改会影响其他行中的 JComboBox

转载 作者:太空宇宙 更新时间:2023-11-04 06:12:31 25 4
gpt4 key购买 nike

我已经在这里潜伏了几年左右,以前从来不需要问问题,因为我总是在别人的问题中找到答案。谢谢!

我想潜伏已经结束了。我见过类似的问题,但不完全是这里的情况:我有一个 2 列 JTable,第一列中有一个 JComboBox,第二列中有一个整数。JComboBox 设置了 ItemListener,以便当 JComboBox 中的选择更改时,Integer 列中的值将设置为组合框选定的索引。右键单击表格将使用 addRow() 作为 MouseEvent 呈现 JPopupMenu。

只要我在设置 DefaultTableModel 时添加我想要的所有行,它就可以正常工作。但是,如果我仅使用一行启动模型并使用 MouseEvent(或除在 DefaultTableModel 的参数中添加行之外的任何其他添加行的方法)来添加行,那么当我们开始更改组合框中的选择时,它将更改其他行中的整数值。

例如:如果我运行程序并立即通过 MouseEvent 添加两行,然后我从第 0 行的组合中选择“0”,从第 1 行的组合中选择“1”,从第 2 行的组合中选择“2”。到目前为止一切正常...然后我回到第 0 行,一旦激活组合框(我还没有选择一个项目...),它就会将第 2 行中的整数更改为 0。谁能告诉我如何阻止整数以这种方式改变?这是一个试用代码:

import java.awt.EventQueue;
import java.awt.event.ActionEvent;
import java.awt.event.ItemEvent;
import java.awt.event.MouseAdapter;
import java.awt.event.MouseEvent;
import javax.swing.DefaultCellEditor;
import javax.swing.JComboBox;
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.UIManager;
import javax.swing.UnsupportedLookAndFeelException;
import javax.swing.table.DefaultTableModel;
import javax.swing.table.TableColumnModel;

public class JComboBoxInJTable {

public static void main(String[] args) {
new JComboBoxInJTable();
}

public JComboBoxInJTable() {
EventQueue.invokeLater(() -> {
try {
UIManager.setLookAndFeel(UIManager.getSystemLookAndFeelClassName());
} catch (ClassNotFoundException | InstantiationException | IllegalAccessException | UnsupportedLookAndFeelException ex) {
ex.printStackTrace();
}

DefaultTableModel model = new DefaultTableModel(new Object[]{"ComboBox", "Index"}, 1);
JTable table = new JTable(model);

//popup menu to add row
JPopupMenu popup = new JPopupMenu();
JMenuItem newRow;
newRow = new JMenuItem("New Row");
newRow.setToolTipText("Add new row.");
newRow.addActionListener((ActionEvent nr) -> {
model.addRow(new Object[]{"", ""});
});
popup.add(newRow);

//set up right-click to open popup menu
table.addMouseListener(new MouseAdapter() {
@Override
public void mousePressed(MouseEvent rc) {
if (SwingUtilities.isRightMouseButton(rc)) {
if (table.getSelectedRow() >= 0) {
popup.show(table, rc.getX(), rc.getY());
}
}
}
});

JComboBox combo = new JComboBox(new Object[]{"Zero", "One", "Two", "Three"});
combo.addItemListener((ItemEvent e) -> {
if (e.getStateChange() == ItemEvent.SELECTED) {
//sets value of cell to left of combobox to comboboxe's selected index
table.setValueAt(combo.getSelectedIndex(), table.getSelectedRow(), 1);
} else {
//do nothing...
}
});

DefaultCellEditor comboEditor = new DefaultCellEditor(combo);

TableColumnModel tcm = table.getColumnModel();
tcm.getColumn(0).setCellEditor(comboEditor);

JFrame frame = new JFrame("Testing");
frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
frame.add(new JScrollPane(table));
frame.pack();
frame.setLocationRelativeTo(null);
frame.setVisible(true);
});
}
}

像往常一样,我确信这是我所缺少的简单内容。再次感谢您过去和将来的帮助!

最佳答案

  • 不要使用 MouseListener 显示弹出菜单,不同的操作系统对弹出窗口有不同的触发器,并且并非所有弹出菜单都由 mousePressed 触发。而是使用 JComponent#setComponentPopupMenu 并让 API 处理它
  • 不要通过编辑器修改模型的状态。这可能会将模型置于无效状态并导致其他副作用,就像您现在所遇到的那样。似乎发生的情况是,当选择新行时,编辑器会使用行单元格值进行更新,但行选择尚未设置,因此表仍然认为前一行仍被选中。相反,请使用模型 setValueAt 方法来决定第一列值更改后要执行的操作。

例如...

import java.awt.Color;
import java.awt.EventQueue;
import java.awt.event.ActionEvent;
import java.util.ArrayList;
import java.util.Arrays;
import java.util.List;
import javax.swing.DefaultCellEditor;
import javax.swing.JComboBox;
import javax.swing.JFrame;
import javax.swing.JMenuItem;
import javax.swing.JPopupMenu;
import javax.swing.JScrollPane;
import javax.swing.JTable;
import javax.swing.UIManager;
import javax.swing.UnsupportedLookAndFeelException;
import javax.swing.table.DefaultTableModel;
import javax.swing.table.TableColumnModel;

public class JComboBoxInJTable {

public static void main(String[] args) {
new JComboBoxInJTable();
}

private List<String> comboData;

public JComboBoxInJTable() {
EventQueue.invokeLater(() -> {
try {
UIManager.setLookAndFeel(UIManager.getSystemLookAndFeelClassName());
} catch (ClassNotFoundException | InstantiationException | IllegalAccessException | UnsupportedLookAndFeelException ex) {
ex.printStackTrace();
}

DefaultTableModel model = new DefaultTableModel(new Object[]{"ComboBox", "Index"}, 1) {

@Override
public void setValueAt(Object aValue, int row, int column) {
super.setValueAt(aValue, row, column);
if (column == 0) {
String value = aValue == null ? null : aValue.toString();
if (aValue == null) {
super.setValueAt(null, row, 1);
} else {
super.setValueAt(comboData.indexOf(aValue), row, 1);
}
}
}

};
JTable table = new JTable(model);
table.setFillsViewportHeight(true);
table.setGridColor(Color.GRAY);

//popup menu to add row
JPopupMenu popup = new JPopupMenu();
JMenuItem newRow;
newRow = new JMenuItem("New Row");
newRow.setToolTipText("Add new row.");
newRow.addActionListener((ActionEvent nr) -> {
model.addRow(new Object[]{"", ""});
});
popup.add(newRow);

table.setComponentPopupMenu(popup);

comboData = new ArrayList<>(Arrays.asList(new String[]{"Zero", "One", "Two", "Three"}));

JComboBox combo = new JComboBox(comboData.toArray(new String[comboData.size()]));
// combo.addItemListener((ItemEvent e) -> {
// if (e.getStateChange() == ItemEvent.SELECTED) {
// //sets value of cell to left of combobox to comboboxe's selected index
// System.out.println("Selected row = " + table.getSelectedRow());
// table.setValueAt(combo.getSelectedIndex(), table.getSelectedRow(), 1);
// } else {
// //do nothing...
// }
// });

DefaultCellEditor comboEditor = new DefaultCellEditor(combo);

TableColumnModel tcm = table.getColumnModel();
tcm.getColumn(0).setCellEditor(comboEditor);

JFrame frame = new JFrame("Testing");
frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
frame.add(new JScrollPane(table));
frame.pack();
frame.setLocationRelativeTo(null);
frame.setVisible(true);
});
}
}

关于java - JTable 单元格中的 JComboBox。选择更改会影响其他行中的 JComboBox,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/28524546/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com