gpt4 book ai didi

java - JXTreeTable 上的固定列

转载 作者:行者123 更新时间:2023-11-30 02:15:23 25 4
gpt4 key购买 nike

我正在尝试在 JXTreeTable 上添加固定列。我用过Fixed Column Table并做了一些调整以使其正常工作,但我遇到了崩溃事件的问题。当我在固定侧折叠节点时,它不会在移动侧折叠。

见下图: Gif showing the problem

有什么办法可以解决吗?

最佳答案

您只需将“TreeExpansionListener”添加到固定的 JXTreeTable 即可。
该监听器将调用主 JXTreeTable 的 ExpandPath() 或 CollapsePath() 方法:

fixed.addTreeExpansionListener(new TreeExpansionListener() {

@Override
public void treeExpanded(TreeExpansionEvent event) {
main.expandPath(event.getPath());
}

@Override
public void treeCollapsed(TreeExpansionEvent event) {
main.collapsePath(event.getPath());
}
});

完整的实现:

import java.beans.PropertyChangeEvent;
import java.beans.PropertyChangeListener;

import javax.swing.JScrollPane;
import javax.swing.JTable;
import javax.swing.JViewport;
import javax.swing.event.ChangeEvent;
import javax.swing.event.ChangeListener;
import javax.swing.event.TreeExpansionEvent;
import javax.swing.event.TreeExpansionListener;
import javax.swing.table.TableModel;

import org.jdesktop.swingx.JXTreeTable;
import org.jdesktop.swingx.table.ColumnFactory;
import org.jdesktop.swingx.table.TableColumnExt;

public class FixedColumnJXTreeTable implements ChangeListener, PropertyChangeListener {
private JXTreeTable main;
private JXTreeTable fixed;
private JScrollPane scrollPane;

/*
* Specify the number of columns to be fixed and the scroll pane
* containing the table.
*/
public FixedColumnJXTreeTable(int fixedColumns, JScrollPane scrollPane) {
this.scrollPane = scrollPane;

main = (JXTreeTable) scrollPane.getViewport().getView();
main.addPropertyChangeListener(this);
main.setColumnFactory(new FixedColumnJXTreeTableFactory(fixedColumns, false));
// Use the existing table to create a new table sharing
// the DataModel and ListSelectionModel

fixed = new JXTreeTable(main.getTreeTableModel());
fixed.setSelectionModel(main.getSelectionModel());
fixed.setFocusable(false);
fixed.setColumnFactory(new FixedColumnJXTreeTableFactory(fixedColumns, true));
fixed.addTreeExpansionListener(new TreeExpansionListener() {

@Override
public void treeExpanded(TreeExpansionEvent event) {
main.expandPath(event.getPath());
}

@Override
public void treeCollapsed(TreeExpansionEvent event) {
main.collapsePath(event.getPath());
}
});

scrollPane.setRowHeaderView(fixed);
scrollPane.setCorner(JScrollPane.UPPER_LEFT_CORNER, fixed.getTableHeader());

// Synchronize scrolling of the row header with the main table

scrollPane.getRowHeader().addChangeListener(this);
}

/*
* Return the table being used in the row header
*/
public JTable getFixedTable() {
return fixed;
}

//
// Implement the ChangeListener
//
@Override
public void stateChanged(ChangeEvent e) {
// Sync the scroll pane scrollbar with the row header

JViewport viewport = (JViewport) e.getSource();
scrollPane.getVerticalScrollBar().setValue(viewport.getViewPosition().y);
}

//
// Implement the PropertyChangeListener
//
@Override
public void propertyChange(PropertyChangeEvent e) {
// Keep the fixed table in sync with the main table

if ("selectionModel".equals(e.getPropertyName())) {
fixed.setSelectionModel(main.getSelectionModel());
}

if ("model".equals(e.getPropertyName())) {
fixed.setModel(main.getModel());
}
}

private final class FixedColumnJXTreeTableFactory extends ColumnFactory {

private int fixedColumns;
private boolean fixedTable;

public FixedColumnJXTreeTableFactory(int fixedColumns, boolean fixedTable) {
this.fixedColumns = fixedColumns;
this.fixedTable = fixedTable;
}

@Override
public TableColumnExt createAndConfigureTableColumn(TableModel model, int modelIndex) {
// JXTreeTable will not add column if we return null here
if ((fixedTable && modelIndex >= fixedColumns) || (!fixedTable && modelIndex < fixedColumns)) {
return null;
}
return super.createAndConfigureTableColumn(model, modelIndex);
}
}
}

关于java - JXTreeTable 上的固定列,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/48696636/

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