gpt4 book ai didi

java - JComponent 的运行时对齐 + 链接到 RowFilters

转载 作者:行者123 更新时间:2023-12-01 16:03:31 25 4
gpt4 key购买 nike

我目前正在开发一个相当复杂的应用程序。我的工作是构建 GUI 的一部分。
主区域是为 JTable 派生的,包含所有应用程序相关数据。表格顶部有一些元素,允许用户控制数据在表格中的显示方式。
与当前任务相关的选项是:

  • 更改列数,
  • 独立更改列宽(不通过 JTableHeader)和
  • 每列输入一个过滤条件以选择特定的数据行。

此场景的主要目标是为当前 View 设置中的每一列创建一个组件(可能是 JTextField),该组件与该列精确对齐(尽管它在运行时更改大小)。

第一个问题:

对齐不起作用。我无法使 TextFields 的宽度与列的宽度相匹配。
我如何让它工作?

第二个问题:

我希望将各个过滤器链接起来。也就是说,如果用户决定输入多个过滤字符串,则应针对各自的列评估所有这些字符串,并且仅应显示与所有过滤器匹配的行。到目前为止,第二个 TextField 中的输入删除了第一个过滤器(使用 RowFilter.regexFilter 正常工作)。
我该如何让它发挥作用?

请告诉我哪些代码片段对您有用,我很乐意发布它们。

预先感谢您提供的任何帮助。

问候,DK

最佳答案

I can't get the width of the TextFields to match the width of the columns

这个示例应该可以帮助您入门:

import java.awt.*;
import java.awt.event.*;
import javax.swing.*;
import javax.swing.event.*;
import javax.swing.table.*;

public class TableFilterRow extends JFrame implements TableColumnModelListener
{
private JTable table;
private JPanel filterRow;

public TableFilterRow()
{
table = new JTable(3, 5);
table.setPreferredScrollableViewportSize(table.getPreferredSize());
JScrollPane scrollPane = new JScrollPane( table );
getContentPane().add( scrollPane );
table.getColumnModel().addColumnModelListener( this );

// Panel for text fields

filterRow = new JPanel( new FlowLayout(FlowLayout.CENTER, 0 , 0) );

for (int i = 0; i < table.getColumnCount(); i ++)
filterRow.add( new JTextField("" + i) );

columnMarginChanged( new ChangeEvent(table.getColumnModel()) );
getContentPane().add(filterRow, BorderLayout.NORTH);
}

// Implement TableColumnModelListener methods
// (Note: instead of implementing a listener you should be able to
// override the columnMarginChanged and columMoved methods of JTable)

public void columnMarginChanged(ChangeEvent e)
{
TableColumnModel tcm = table.getColumnModel();
int columns = tcm.getColumnCount();

for (int i = 0; i < columns; i ++)
{
JTextField textField = (JTextField)filterRow.getComponent( i );
Dimension d = textField.getPreferredSize();
d.width = tcm.getColumn(i).getWidth();
textField.setPreferredSize( d );
}

SwingUtilities.invokeLater(new Runnable()
{
public void run()
{
filterRow.revalidate();
}
});
}

public void columnMoved(TableColumnModelEvent e)
{
Component moved = filterRow.getComponent(e.getFromIndex());
filterRow.remove(e.getFromIndex());
filterRow.add(moved, e.getToIndex());
filterRow.validate();
}

public void columnAdded(TableColumnModelEvent e) {}
public void columnRemoved(TableColumnModelEvent e) {}
public void columnSelectionChanged(ListSelectionEvent e) {}

public static void main(String[] args)
{
JFrame frame = new TableFilterRow();
frame.setDefaultCloseOperation( EXIT_ON_CLOSE );
frame.pack();
frame.setLocationRelativeTo( null );
frame.setVisible(true);
}
}

only the rows that match all filters should be shown

阅读 JTable API 并点击有关“如何使用表”的 Swing 教程的链接,您可以在其中找到 TableFilterDemo。您可以轻松修改代码以使用“and”过滤器。代码类似于:

// rf = RowFilter.regexFilter(filterText.getText(), 0);
List<RowFilter<Object,Object>> filters = new ArrayList<RowFilter<Object,Object>>(2);
filters.add(RowFilter.regexFilter(filterText.getText(), 0));
filters.add(RowFilter.regexFilter(filterText.getText(), 1));
rf = RowFilter.andFilter(filters);

此示例共享一个文本字段,在多个列中查找相同的字符串。显然,您会使用个人文本字段。

关于java - JComponent 的运行时对齐 + 链接到 RowFilters,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/3202890/

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