当我使用JXTable渲染和编辑我的数据时,CellEditors的一些输入会丢失.如果我单击JXTable-ColumnHeader的Resizing-Divider或更改JFrame的宽度,CellEditor将终止而不提交值.如果我使用JTable,则保存这些值.
我想使用JXTable因为它的其他功能,所以有没有办法修复JXTable?
例:
package table.columnresize;
import javax.swing.JFrame;
import javax.swing.JScrollPane;
import javax.swing.JTable;
import javax.swing.table.DefaultTableModel;
import org.jdesktop.swingx.JXTable;
/**
* Demo of differing behaviour of JXTable and JTable. JXTable loses input in a TableCell where JTable persists
* it.
* <p>
* <table border=1>
* <tr>
* <th></th>
* <th>JXTable</th>
* <th>JTable</th>
* </tr>
* <tr>
* <td>Click on TableColumnHeader</td>
* <td>saved</td>
* <td>saved</td>
* </tr>
* <tr>
* <td>Resizing with Divider of TableColumnHeader</td>
* <td>lost</td>
* <td>saved</td>
* </tr>
* <tr>
* …
Run Code Online (Sandbox Code Playgroud) 我试图根据某些行项的值覆盖JXTable的突出显示颜色.这是一个示例,如果行项值有高亮显示为绿色getNumber() % 2 == 0
.
它适用于JTable,但对于JXTable,看起来表格单元格渲染器不起作用,除非选择了相关的行.为什么它会这样,我该如何解决?
import java.awt.Color;
import java.awt.Component;
import javax.swing.JFrame;
import javax.swing.JPanel;
import javax.swing.JScrollPane;
import javax.swing.JTable;
import javax.swing.table.DefaultTableCellRenderer;
import javax.swing.table.TableCellRenderer;
import javax.swing.table.TableColumnModel;
import org.jdesktop.swingx.JXTable;
import ca.odell.glazedlists.BasicEventList;
import ca.odell.glazedlists.EventList;
import ca.odell.glazedlists.SortedList;
import ca.odell.glazedlists.gui.TableFormat;
import ca.odell.glazedlists.swing.EventTableModel;
public class TableRendererExample {
static public enum ItemKey {
NAME("name") {
@Override public String getStringFromItem(Item item) {
return item.getName();
}
},
NUMBER("#") {
@Override public String getStringFromItem(Item item) {
return Integer.toString(item.getNumber());
}
},
PARENT("parent") {
@Override public String getStringFromItem(Item item) { …
Run Code Online (Sandbox Code Playgroud) 我使用的JXTable
是SwingX组件.如果我使用setSortable(boolean flag)
方法,那么它将启用或禁用所有列的排序.
根据我的要求,我想禁用几列的排序并启用其他列的排序.
任何人都可以帮助实现此功能?
感谢您的回复.你可以帮我使用setSorterClass(String sorterClassName)
禁用一列的排序吗?你能给我任何代码examplex吗?这对我很有帮助.
我想在JXTreeTable中合并两个单元格.这可能吗?我已经阅读了在JTable中合并单元格的解决方案,但这对JXTreeTables不起作用.
合并单元格的意思是什么:我想创建一个这样的结构:
node 1 | title for 3 cells | title for 3 cells |
subnode | c1 | c2 | c3 | c1 | c2 | c3 |
subnode | c1 | c2 | c3 | c1 | c2 | c3 |
因此,通过在同一行/节点上合并3个不同的单元来创建"3个单元的标题".
我试图使JXTable中的列成为一个组合框.很难解释我面临的问题.当您单击下拉列表时,下拉列表有时不会保持打开足够长的时间以便您选择该值.它只是关闭并选择了一些值.有时它会保持开放状态供您选择一个值.这是SSCCE:
import java.awt.Color;
import javax.swing.ComboBoxModel;
import javax.swing.DefaultCellEditor;
import javax.swing.DefaultComboBoxModel;
import javax.swing.JComboBox;
import javax.swing.table.DefaultTableModel;
import org.jdesktop.swingx.JXFrame;
import org.jdesktop.swingx.JXTable;
import org.jdesktop.swingx.renderer.CellContext;
import org.jdesktop.swingx.renderer.ComponentProvider;
import org.jdesktop.swingx.renderer.DefaultTableRenderer;
public class Test {
public static void main(String[] args) {
JXFrame frame=new JXFrame();
Object[][] rows = new Object[10][];
for (int i = 0; i < rows.length; i++) {
rows[i] = new Object[]{
"Test data ","Yes"};
}
DefaultTableModel model = new DefaultTableModel(rows,
new String[]{
"Title 1", "Title 2"
});
final JXTable table = new JXTable(model);
DefaultComboBoxModel cmodel = …
Run Code Online (Sandbox Code Playgroud) 我面临着重复行的问题JXTable
.如果我JXTable
在插入新行时对数据进行排序JXTable
,则最终结果会JXTable
显示在表中产生无效结果的重复行.即使它也显示已插入的行的正确计数但有些行完全丢失,而某些行被发现重复JXTable
.
如果我JXTable
已经成功插入了所有数据,那么它显示正确的数据,即没有重复的行,也没有丢失的行.
代码示例:我有一个方法,我传递defaultTableModel,这里是在表中添加项目
public void addingItems(DefaultTableModel defaultTableModel)
{
for(int i=0;i< numberofItems;i++){
Vector vobject = new Vector();
vobject.add("...");
vobject.add("xxx");
vobject.add("yyy");
...
..
vobject.add("");
defaultTableModel.addRow(vobject);
}
Run Code Online (Sandbox Code Playgroud)
另一方面,我在tableHeader actionlistener中添加了排序代码
tableheader.addMouseListener(new MouseListener() {
public void mouseClicked(MouseEvent e) {
Vector data = defaultTableModel.getDataVector();
Collections.sort(data, new ColumnSorter(colIndex, ascending));
}
Run Code Online (Sandbox Code Playgroud)
});
我已将代码放入synchronized
块中但未获得成功.
请提供更好的解决方案来解决此问题.
我的应用程序由几个JTables组成.JXTables.目标是存储列宽并在启动时重新加载它们.
但是下面的代码对表的列宽没有任何改变:
tblTasks.getColumn(1).setWidth(36);
Run Code Online (Sandbox Code Playgroud)
而且这个没有做任何事情:
tblTasks.getColumn(1).setPreferredWidth(36);
Run Code Online (Sandbox Code Playgroud)
有任何想法吗 ?
我有一个JXtable.我想阻止排名前三行.基本上,前3行应始终位于顶部,其余的应根据其值进行排序.
在SO上有一个类似的问题,但我不知道如何真正将它应用于我的使用 Sort ROW,除了最后一行
主要区别在于我正在使用JXTable.有一种简单的方法可以做到这一点,我错过了吗?
这是我的JXtable代码
jTable1 = new JXTable();
if (isClickable) {
jTable1.getTableHeader().setCursor(Cursor.getPredefinedCursor(Cursor.HAND_CURSOR));
//set the sorter here
} else {
jTable1.setSortable(false);
}
Run Code Online (Sandbox Code Playgroud) 我的问题是如何将JXTable列(仅适用于一个/特定列)的超链接转换为我的默认桌面Web浏览器的"_blank"链接.
我使用JXTable和DefaultTableModel,我也从sqlite数据库调用数据.我在互联网,谷歌,[...]进行了研究,我发现了很多信息,如果我没有犯错:
***注意:该列每个单元只有1个链接,没有任何文本,只有链接.
现在我已经实现了这个代码来做一个双击单元格的动作.请有人可以帮我实现一个列超链接,这个超链接在默认浏览器中打开,就像在这个例子中一样(但我不知道如何调整,因为数据不是从数据库中调用的).
Table_Employee.addMouseListener(new MouseAdapter() {
public void mouseClicked(MouseEvent e) {
if (e.getClickCount() == 2) {
JXTable target = (JXTable)e.getSource();
int row = target.getSelectedRow();
int column = target.getSelectedColumn();
JFrame newFrame = new JFrame(); //I want to open an distinc link
newFrame.setTitle("Detail Screen"); //for every cell along one column
newFrame.setVisible(true); //in the web browser, not a frame.
}
}
});
Run Code Online (Sandbox Code Playgroud)
编辑1 @Kleopatra编辑2的代码对我的应用程序有一些问题.此外,我做了另一个尝试,如下面的代码,瞧 - 当涉及第一次点击时链接是存在的,但没有反应(没有浏览器打开).@Kleopatra,您能否向我提供有关您的建议的更多信息,因为当我尝试放置该代码时,IDE无法识别hyperlinkColumn.
Table_Employee.addMouseListener(new MouseAdapter() {
public void mouseClicked(MouseEvent e) …
Run Code Online (Sandbox Code Playgroud) 我已经更新了这个问题,以便更准确地描述我的问题的原因,并且包含了一个比我最初使用的更简单的例子.
我在下面添加了一个简单的示例来说明我遇到的性能问题.当我使用普通的ArrayList支持我的JXTable时,它的表现相当不错.但是,如果我为EventList切换ArrayList并使用EventTableModel构建表,则排序要慢得多(在这种情况下慢约10倍).
如果使用Maven或Gradle,这里是我正在使用的工件坐标.
apply plugin: 'java'
apply plugin: 'application'
mainClassName = "SortPerfMain"
dependencies {
compile "net.java.dev.glazedlists:glazedlists_java15:1.8.0"
compile "org.swinglabs.swingx:swingx-core:1.6.4"
}
Run Code Online (Sandbox Code Playgroud)
这是一个例子.我试图使用EventList的唯一原因是因为我想要一个我可以在TableModel之外修改并且发生必要通知的数据结构.
import ca.odell.glazedlists.BasicEventList;
import ca.odell.glazedlists.EventList;
import ca.odell.glazedlists.gui.TableFormat;
import ca.odell.glazedlists.swing.EventTableModel;
import org.jdesktop.swingx.JXTable;
import org.jdesktop.swingx.renderer.*;
import org.jdesktop.swingx.table.TableColumnExt;
import javax.swing.*;
import javax.swing.table.*;
import java.awt.*;
import java.math.BigDecimal;
import java.text.NumberFormat;
import java.util.ArrayList;
import java.util.List;
import static javax.swing.WindowConstants.EXIT_ON_CLOSE;
/* This class creates a JFrame with two JXTables displayed side by side. Both
* tables have a single column that holds Item objects. Each Item has one …
Run Code Online (Sandbox Code Playgroud) 我正在使用JXTable,我想以编程方式隐藏列.
有没有方便的方法来做到这一点(没有设置miniman/maximal/preferd宽度)?
谢谢.