这可能是之前提出的问题.我在帖子之前搜索了很多,但是找不到任何可接受的.
有人可以告诉我如何做到这一点.我只需要在单击单元格时得到一个下拉菜单,这样我就必须从中选择一个值(作为限制用户选择的方法).
如果有人可以帮助我,我相信它会帮助很多人.有很多类似的问题,但没有任何明确的答案.请回答一下细节.一个例子将非常感谢..
谢谢!
首先,抱歉发布一些可能有点过于具体的内容,但我对Swing不是很有经验,似乎无法找到符合我需求的好例子.
所以我试图找出实现动态GUI的最佳方法,以便在Swing中选择过滤条件:

底层模型是一个类,其中包含可以否定的标准列表(即应用NOT前缀),以及指示这些标准是否应与AND或OR组合的属性.
GUI将允许用户添加,更改或删除标准,并选择组合运算符(和/或).第一个标准自然没有组合选择器,第三个和后续标准将简单地使用与第二个标准相同的组合运算符.
右侧的X按钮将用于删除标准.按下"添加"按钮后,将在底部添加一个新的组件行.随着更改,这些将反映在基础模型中.
当然,我可以通过简单地将组件添加到JPanel然后相应地更新模型来实现"原始",但我更喜欢更简洁的解决方案,例如TableModel提供的解决方案.
所以我想知道一个带有自定义TableModel和TableCellRenderer/Editor的表是否是最好的方法,或者是否有更好的方法来实现这样的东西.如果table确实是最好的方法,我会很感激指出如何使用TableCellRenderers或-Editors来实现这一目标.
提前致谢.
如果我采用a JTable并在其模型上指定列的classtype,如下所示:
DefaultTableModel model = new DefaultTableModel(columnNames, 100) {
@Override
public Class<?> getColumnClass(int columnIndex) {
return Integer.class;
}};
Run Code Online (Sandbox Code Playgroud)
然后,只要用户尝试double在表中输入值,Swing就会自动拒绝输入并将单元格的轮廓设置为红色.
当某人输入单元格的"负数或0"输入时,我希望发生相同的效果.我有这个:
@Override
public void setValueAt(Object val, int rowIndex, int columnIndex) {
if (val instanceof Number && ((Number) val).doubleValue() > 0) {
super.setValueAt(val, rowIndex, columnIndex);
}
}
}
Run Code Online (Sandbox Code Playgroud)
这可以防止单元格接受任何非正值,但不会将颜色设置为红色并使单元格保持可编辑状态.
我试着调查JTable默认情况下是如何做出拒绝的,但我似乎无法找到它.
如何拒绝非正输入与拒绝非整数输入相同?
谢谢
我发现很难添加JComboBox到a的一个单元格中JTable,我尝试了下面的代码,但它不起作用..
如何将jcombobox添加到特定单元格?
按下enter新的jcombobox应自动添加到所需的列.
jTable1 = new javax.swing.JTable();
mod=new DefaultTableModel();
mod.addColumn("No");
mod.addColumn("Item ID");
mod.addColumn("Units");
mod.addColumn("Amount");
mod.addColumn("UOM");
mod.addColumn("Delivery Date");
mod.addColumn("Total Amount");
mod.addColumn("Notes");
mod.addColumn("Received");
mod.addRow(new Object [][] {
{1, null, null, null, null, null, null, null, null}
});
jTable1.setModel(mod);
jTable1.getColumnModel().getColumn(1).setCellEditor(new DefaultCellEditor(generateBox()));
jTable1.setColumnSelectionAllowed(true);
Code to generate ComboBox
private JComboBox generateBox()
{
JComboBox bx=null;
Connection con=CPool.getConnection();
try
{
Statement st=con.createStatement();
String query="select distinct inid from inventory where company_code="+"'"+ims.MainWindow.cc+"'";
ResultSet rs=st.executeQuery(query);
bx=new JComboBox();
while(rs.next()){
bx.addItem(rs.getString(1));
} …Run Code Online (Sandbox Code Playgroud) 我创建了一个带有自定义表格渲染和自定义单元格编辑器的JTable,它可以在图像中显示结果

我使用扩展JPanel的单独类创建了第一个表格单元格中显示的面板.并将表值添加为,
tbl.setCellEditor(new customCell());
tbl.getColumnModel().getColumn(0).setCellRenderer(new customCell());
DefaultTableModel dtm = (DefaultTableModel) tbl.getModel();
Vector v = new Vector();
v.add(new Panel());
v.add("Test");
dtm.addRow(v);
v.clear();
v.add(new Panel());
v.add("Test 2");
dtm.addRow(v);
Run Code Online (Sandbox Code Playgroud)
这是我的表自定义类来创建这个表,
class customCell extends DefaultTableModel implements TableCellRenderer, TableCellEditor {
public Component getTableCellRendererComponent(JTable table, Object value, boolean isSelected, boolean hasFocus, int row, int column) {
Panel p = new Panel();
table.setRowHeight(row, p.getHeight());
return p;
}
public Component getTableCellEditorComponent(JTable table, Object value, boolean isSelected, int row, int column) {
return new Panel();
}
public Object getCellEditorValue() …Run Code Online (Sandbox Code Playgroud) 在我的应用程序中,我使用了一个类似于这个例子的java表.我的问题是当我更改单元格的值时(即使在上面的示例中),在我单击不同的单元格之前,数据模型不会更新.即使我在更改单元格值后单击表格下方的灰色区域,模型也不会更改.我认为原因是细胞保持专注,直到我点击不同的细胞.如何避免这种情况并更新模型而不单击表格单元格.提前致谢
我编辑了上面的示例代码以反映问题
public class JTableDemo extends JApplet {
private JTextArea txt = new JTextArea(4, 20);
// The TableModel controls all the data:
class DataModel extends AbstractTableModel {
Object[][] data = { { "one", "two", "three", "four" },
{ "five", "six", "seven", "eight" },
{ "nine", "ten", "eleven", "twelve" }, };
// Prints data when table changes:
class TML implements TableModelListener {
public void tableChanged(TableModelEvent e) {
txt.setText(""); // Clear it
for (int i = 0; i < data.length; …Run Code Online (Sandbox Code Playgroud) 你们在我的上一个问题上指出了正确的方向,你们真是太棒了,我在这里有一些原始问题的扩展:
如何将JTable列设置为String并排序为Double?
我现在通过使用我的自定义单元格渲染器将我的价格列格式化为$ ###,## 0.00,我现在也为单元格设置了一个JTextField编辑器.编辑单元格工作正常,除了更新值时,我的自定义渲染器中设置的数字格式似乎不再格式化单元格(我在编辑提交后丢失了$).即使在初始显示数据之后,此渲染器是否也不应渲染单元格?
我试过使用以下但没有运气:
((AbstractTableModel) table.getModel()).fireTableDataChanged();
Run Code Online (Sandbox Code Playgroud)
我希望这会强制表重新验证并使用自定义渲染器重新绘制单元格以呈现新值,但遗憾的是这不起作用...
我错过了什么......显然,但是什么?
我有一个可编辑的JTable,并设置了一个DefaultCellEditor,如下所示:
colModel.getColumn( 1 ).setCellEditor( new DefaultCellEditor( txtEditBox ) {
// ...
@Override
public void cancelCellEditing() {
super.cancelCellEditing();
// handling the event
}
// ...
}
Run Code Online (Sandbox Code Playgroud)
但是,在编辑此列中的单元格时按下escape时,虽然编辑模式已完成,但不会调用此方法.有什么想法吗?难道我做错了什么?有没有办法处理这个(除了手动添加KeyListener)?
我想在a中使用a JComboBox作为单元格编辑器JXTreeTable.它与标准工作正常DefaultCellEditor(即点击计数开始等于2).
现在我希望只需单击一下就可以编辑该列.所以我cellEditor.setClickCountToStart(1);在我的代码中添加了一个声明.
这是我的SSCCE:
import java.awt.BorderLayout;
import java.awt.Dimension;
import javax.swing.DefaultCellEditor;
import javax.swing.JComboBox;
import javax.swing.JFrame;
import org.jdesktop.swingx.JXTreeTable;
import org.jdesktop.swingx.treetable.DefaultMutableTreeTableNode;
import org.jdesktop.swingx.treetable.DefaultTreeTableModel;
public class TestCellEditorForJXTreeTable {
/** The JXTreeTable */
JXTreeTable treeTable;
/** The model */
DefaultTreeTableModel treeTableModel;
/** Constructor */
public TestCellEditorForJXTreeTable() {
treeTable = new JXTreeTable();
treeTableModel = new DefaultTreeTableModel() {
@Override
public String getColumnName(int column) {
switch (column) {
case 0:
return "A";
case 1:
return …Run Code Online (Sandbox Code Playgroud) 我这里有一个非常简单的问题.
当用户在我选择了一行后单击"编辑"按钮时JTable,软件会检查是否允许编辑该行.
如果是,我想将焦点放在该行的第一个单元格中,并使用闪烁的光标,以便用户可以直接在单元格中键入内容.
由于isEditable()方法,我可以成功设置行是否可编辑,我table.editCellAt(selectedRow, 0)用来开始编辑.
然而
1)该单元格中没有闪烁的光标
2)用户无法立即输入单元格(他仍然需要双击单元格)
有关如何实现这一目标的任何建议?
//////////////////// UPDATE //////////////////////
虽然MadProgrammer的评论解决了这个问题,但它只解决了部分问题,但那是因为我还不够精确.
实际上,当我执行他用"经典JTable"描述的步骤时,即:
table.editCellAt(selectedRow, 0);
table.setSurrendersFocusOnKeystroke(true);
table.getEditorComponent().requestFocus();
Run Code Online (Sandbox Code Playgroud)
我得到闪烁的光标和立即键入的能力.
然而,缺少的部分是我给用户2个选项.
1)他可以直接手动选择表格中的一行,为此解决方案很好.
2)但我也为用户提供了使用JTextField更容易找到他正在搜索的行的能力.为此,我使用带有regexFilter的TableRowSorter来过滤显示的行.当我在那里尝试MadProgrammer的解决方案(带过滤)时,我得到了一个java.lang.NullPointerException,并且没有进行进一步的编辑.
这是一个例外:
Exception in thread "AWT-EventQueue-0" java.lang.NullPointerException
at dialogs.DialogEditCouleurs.actionPerformed(DialogEditCouleurs.java:229)
at javax.swing.AbstractButton.fireActionPerformed(Unknown Source)
at javax.swing.AbstractButton$Handler.actionPerformed(Unknown Source)
at javax.swing.DefaultButtonModel.fireActionPerformed(Unknown Source)
at javax.swing.DefaultButtonModel.setPressed(Unknown Source)
at javax.swing.plaf.basic.BasicButtonListener.mouseReleased(Unknown Source)
at java.awt.AWTEventMulticaster.mouseReleased(Unknown Source)
at java.awt.AWTEventMulticaster.mouseReleased(Unknown Source)
at java.awt.Component.processMouseEvent(Unknown Source)
at javax.swing.JComponent.processMouseEvent(Unknown Source)
at java.awt.Component.processEvent(Unknown Source)
at java.awt.Container.processEvent(Unknown Source)
at java.awt.Component.dispatchEventImpl(Unknown Source)
at java.awt.Container.dispatchEventImpl(Unknown Source)
at java.awt.Component.dispatchEvent(Unknown Source)
at java.awt.LightweightDispatcher.retargetMouseEvent(Unknown Source)
at …Run Code Online (Sandbox Code Playgroud) java ×10
tablecelleditor ×10
swing ×9
jtable ×8
jcombobox ×2
focus ×1
jxtreetable ×1
swingx ×1
tablemodel ×1
validation ×1