- iOS/Objective-C 元类和类别
- objective-c - -1001 错误,当 NSURLSession 通过 httpproxy 和/etc/hosts
- java - 使用网络类获取 url 地址
- ios - 推送通知中不播放声音
我想使用 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 "B";
}
return null;
}
@Override
public Object getValueAt(Object node, int column) {
switch (column) {
case 0:
return ((DefaultMutableTreeTableNode) node).getUserObject();
case 1:
return "Value in B";
}
return null;
}
@Override
public int getColumnCount() {
return 2;
}
@Override
public boolean isCellEditable(Object node, int column) {
return column == 1;
}
};
treeTable.setTreeTableModel(treeTableModel);
}
public static void main(String[] args) {
TestCellEditorForJXTreeTable test = new TestCellEditorForJXTreeTable();
// Root node
DefaultMutableTreeTableNode root = new DefaultMutableTreeTableNode("root");
test.treeTableModel.setRoot(root);
// New nodes/rows
DefaultMutableTreeTableNode node = new DefaultMutableTreeTableNode("child_node");
test.treeTableModel.insertNodeInto(node, root, 0);
DefaultMutableTreeTableNode node2 = new DefaultMutableTreeTableNode("child_node2");
test.treeTableModel.insertNodeInto(node2, root, 1);
// Showing the frame
showTable(test.treeTable);
// Setting the cell editor
DefaultCellEditor cellEditor = new DefaultCellEditor(new JComboBox(new String[]{"1", "2", "3"}));
cellEditor.setClickCountToStart(1);
test.treeTable.getColumn(1).setCellEditor(cellEditor);
}
/** Shows a JXTreeTable in a frame */
private static void showTable(JXTreeTable table) {
JFrame frame = new JFrame("Testing cell editor for JXTreeTable");
frame.setPreferredSize(new Dimension(640, 480));
frame.setLayout(new BorderLayout());
frame.add(table, BorderLayout.CENTER);
frame.pack();
frame.setVisible(true);
frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
}
}
但是现在看起来很丑:
当我点击一个可编辑的单元格时,它会打开 JComboBox
弹出菜单(太棒了!这正是我所期待的!),但是这个弹出菜单立即关闭(< em>Erf!)。它闪烁。我必须在选定的单元格上再次单击才能最终打开它。
每次我在可编辑列中选择另一个单元格时,问题都会重复。
如何才能在第一次单击后真正打开 JComboBox
弹出菜单?
谢谢。
这里是同一个例子,但是使用了 JTable
。 JComboBox
弹出菜单不会闪烁。
import java.awt.BorderLayout;
import java.awt.Dimension;
import javax.swing.DefaultCellEditor;
import javax.swing.JComboBox;
import javax.swing.JFrame;
import javax.swing.JTable;
import javax.swing.table.DefaultTableModel;
public class TestCellEditorForJTable {
/** The JTable */
JTable table;
/** The model */
DefaultTableModel tableModel;
/** Constructor */
public TestCellEditorForJTable() {
table = new JTable();
tableModel = new DefaultTableModel(new String[] {"A", "B"}, 0) {
@Override
public boolean isCellEditable(int row, int column) {
return column == 1;
}
};
table.setModel(tableModel);
}
public static void main(String[] args) {
TestCellEditorForJTable test = new TestCellEditorForJTable();
// New rows
test.tableModel.insertRow(0, new String[] {"Value1 in A", "Value1 in B"});
test.tableModel.insertRow(1, new String[] {"Value2 in A", "Value2 in B"});
// Showing the frame
showTable(test.table);
// Setting the cell editor
DefaultCellEditor cellEditor = new DefaultCellEditor(new JComboBox(new String[]{"1", "2", "3"}));
cellEditor.setClickCountToStart(1);
test.table.getColumnModel().getColumn(1).setCellEditor(cellEditor);
}
/** Shows a table in a frame */
private static void showTable(JTable table) {
JFrame frame = new JFrame("Testing cell editor for JTable");
frame.setPreferredSize(new Dimension(640, 480));
frame.setLayout(new BorderLayout());
frame.add(table, BorderLayout.CENTER);
frame.pack();
frame.setVisible(true);
frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
}
}
我忘了说我使用的是 Java 1.6。
使用 kleopatra's answer 的 ContainerListener
和 FocusListener
,并运行相同的执行流程,我通过 JXTreeTable
SSCCE 获得以下输出:
// first click
24.01.2014 13:10:59 my.pkg.TestCellEditorForJXTreeTable$2 componentAdded
INFO: java.awt.event.ContainerEvent[COMPONENT_ADDED...JXTreeTable...
24.01.2014 13:10:59 my.pkg.TestCellEditorForJXTreeTable$3 focusGained
INFO: java.awt.FocusEvent[FOCUS_GAINED...JXTreeTable...
24.01.2014 13:10:59 my.pkg.TestCellEditorForJXTreeTable$2 componentRemoved
INFO: java.awt.event.ContainerEvent[COMPONENT_REMOVED...JXTreeTable...
24.01.2014 13:10:59 my.pkg.TestCellEditorForJXTreeTable$3 focusLost
INFO: java.awt.FocusEvent[FOCUS_LOST...JXTreeTable...
// second click
24.01.2014 13:11:02 my.pkg.TestCellEditorForJXTreeTable$2 componentAdded
INFO: java.awt.event.ContainerEvent[COMPONENT_ADDED...JXTreeTable...
24.01.2014 13:11:02 my.pkg.TestCellEditorForJXTreeTable$3 focusGained
INFO: java.awt.FocusEvent[FOCUS_GAINED...JXTreeTable...
24.01.2014 13:11:02 my.pkg.TestCellEditorForJXTreeTable$2 componentRemoved
INFO: java.awt.event.ContainerEvent[COMPONENT_REMOVED...JXTreeTable...
24.01.2014 13:11:02 my.pkg.TestCellEditorForJXTreeTable$3 focusLost
INFO: java.awt.FocusEvent[FOCUS_LOST...JXTreeTable...
最佳答案
Tricky bugger - 我认为这确实是一个核心问题。
让我们首先准确定义它发生了什么/什么时候发生:以普通表格为例(顺便说一句:+1 表示漂亮简洁的 SSCCE!)
挖掘揭示了可能的原因:它是一个无序的 focusLost 收到之后组合被再次添加为编辑组件。要查看,请将 containerListener 注册到表,将 focusListener 注册到组合并打印事件
ContainerListener containerL = new ContainerListener() {
@Override
public void componentRemoved(ContainerEvent e) {
LOG.info("" + e);
}
@Override
public void componentAdded(ContainerEvent e) {
LOG.info("" + e);
}
};
table.addContainerListener(containerL);
FocusListener focusL = new FocusListener() {
@Override
public void focusGained(FocusEvent e) {
LOG.info("" + e);
// following line is a hack around: force the popup open
// ((JComboBox) cellEditor.getComponent()).setPopupVisible(true);
}
@Override
public void focusLost(FocusEvent e) {
LOG.info("" + e);
}
};
cellEditor.getComponent().addFocusListener(focusL);
输出:
// first click
24.01.2014 12:13:44 org.jdesktop.swingx.table.TestCellEditorForJTable$2 componentAdded
INFO: java.awt.event.ContainerEvent[COMPONENT_ADDED,child=null] on javax.swing.JTable...
24.01.2014 12:13:44 org.jdesktop.swingx.table.TestCellEditorForJTable$3 focusGained
INFO: java.awt.FocusEvent[FOCUS_GAINED,permanent,opposite=javax.swing.JTable
// second click
24.01.2014 12:13:49 org.jdesktop.swingx.table.TestCellEditorForJTable$2 componentRemoved
INFO: java.awt.event.ContainerEvent[COMPONENT_REMOVED,child=null] on javax.swing.JTable
24.01.2014 12:13:49 org.jdesktop.swingx.table.TestCellEditorForJTable$2 componentAdded
INFO: java.awt.event.ContainerEvent[COMPONENT_ADDED,child=null] on javax.swing.JTable
// here's the problem: focusLost _after_ added again
24.01.2014 12:13:49 org.jdesktop.swingx.table.TestCellEditorForJTable$3 focusLost
INFO: java.awt.FocusEvent[FOCUS_LOST,permanent,opposite=javax.swing.JTable
24.01.2014 12:13:49 org.jdesktop.swingx.table.TestCellEditorForJTable$3 focusGained
INFO: java.awt.FocusEvent[FOCUS_GAINED,permanent,opposite=javax.swing.JTable
一个快速的 hack 可能是强制在 focusListener 中打开弹出窗口。不过,没有检查副作用。
关于java - 如何仅单击一次鼠标即可编辑 JXTreeTable 单元格?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/21309528/
这里仍然是一个 Java 新手,为了我自己的利益,我正在努力尝试一些过于先进的东西。不过,这是我需要做的:JXTreeTable 中的一个复选框。我的主要类(class): package info.
我正在尝试理解 JXTreeTable ,因为我引用了一个站点来进行简单的 JXTreeTable 实现:下面是修改后的代码(我从一个站点中选择它) import java.awt.BorderLay
在 JXTreeTable 中是否可以有可变大小的行,如果是那么如何? ,我正在尝试更改 TreeExpansionEvent 上行的高度(如下所示): public void treeExpande
来自SwingLabs Forum ,似乎没有计划让 JXTreeTable 可排序。 从线程中,另一种选择是 “您可以使用 JXTable 和 GlazedLists TreeList 来制作 Tr
我正在尝试在 JXTreeTable 上添加固定列。我用过Fixed Column Table并做了一些调整以使其正常工作,但我遇到了崩溃事件的问题。当我在固定侧折叠节点时,它不会在移动侧折叠。 见下
当底层模型发生变化时,我无法找到重新绘制 JxTreeTable 的最佳方法。 对于表中的每个节点,我都有一个对应的模型对象,因此如果模型发生变化,我可以获得该节点。 此后,给定一个节点,您如何触发表
我正在使用默认情况下对表进行行条纹的外观。当我放入 JXTreeTable 时,我注意到由于某种原因它没有自动获取行 strip 化。 所以我使用荧光笔提出了一种解决方法,但看起来我遇到了重画故障:
可编辑的 JxTreeTable 是否有任何工作示例。我确实尝试了一些方法。但没有运气......只有第一列是可编辑的。 如何使所有列都可编辑? 对不起各位, 这是我的源代码: /* * To cha
这真的让我很困惑。到目前为止我将展示我的代码。我正在尝试使某些字段可编辑。这是最终目标,但我只是尝试放入 JCheckBox 只是为了测试。但即使这样似乎也不起作用。 你能看一下这个吗?我真的很感激。
我有一个 JXTreeTable,它的左侧有一棵节点树(不同的数据类型),右侧有一个网格(默认)。 现在我希望所有显示的值(还有树标题)均取自 getValueAt(row,column) 方法,而不
使用 Java 代码,我试图操作另一个外部 Java swing 应用程序,但我无法访问该应用程序的任何有关其编码方式的信息。具体来说,我正在尝试操作 JXTreeTable。其中 boolean 类
谁能提供一个具体的例子来说明如何使 JXTreeTable 可编辑? 具体来说,我想让一列中的所有单元格都可编辑。开箱即用似乎并不支持此功能。 最佳答案 JXTreeTable具有常规 JTable
我有一个带有自定义单元格渲染器的 JXTreeTable。当一行中的字段与上一行中的字段不同时,我试图让一行的背景颜色发生变化。例如,该行包含“1”作为 ID。如果前一行也包含“1”,我希望这一行被涂
我想创建一个简单的 JXTreeTable,所以我构建了以下代码: public static void main(String[] args){ JTreeTable table = new
要防止 JTree 节点折叠,您可以使用 setExpandedState() 方法。 我没有看到 SwingX JXTreeTable 类的类似方法,并且 JXTreeTable 似乎没有扩展 JX
我将尝试为 JXTreeTable 实现 RowFilter,但它不起作用。我的实现是这样的: public class CustomRowFilter extends RowFilter { @Ov
我正在使用JXTreeTable来制作树表结构,现在我想动态更改特定单元格的颜色。如何改变单元格的颜色? 我发现这段代码可以改变颜色,但这不起作用。 这里是代码: leftTree.setDefaul
我正在尝试为 JXTreeTable 的树列设置自定义树单元格编辑器,但由于某种原因,我的编辑器从未被调用。 这是应该设置编辑器的位: dataTable.setDefaultEditor(DataE
我正在使用 JXTreeTabble 构建一个 treetable,我想根据所选值禁用/启用 menu 项目。所以,我尝试将此代码放入我的表模型中: public Object getValueAt(
我想使用 JComboBox 作为 JXTreeTable 中的单元格编辑器.它适用于标准 DefaultCellEditor(即 开始点击次数 等于 2)。 现在我希望只需单击一次 即可编辑该列。所
我是一名优秀的程序员,十分优秀!