我如何创建两个具有相同 Columnmodel 但具有不同模型的 Jtables
How can i create two Jtables which have same Columnmodel, but they have different models
我设计了两个具有相同 columnmodel 的 jtables,因此它们会相应地调整大小,这两个 jtables 应该具有相同的列号,我希望它们以相同的方式运行,当我们调整列的大小或更改滚动条时。现在我遇到问题,当我调整第二个 table 大小时,行上的列不会改变它们的大小并且滚动条不会相应地运行。
我的代码就是这样
import java.awt.BorderLayout;
import java.awt.Dimension;
import javax.swing.JFrame;
import javax.swing.JPanel;
import javax.swing.JTable;
import javax.swing.event.ChangeEvent;
import javax.swing.table.DefaultTableModel;
import javax.swing.table.TableColumn;
import javax.swing.table.TableModel;
import javax.swing.JScrollPane;
public class CompFilteredTable extends JPanel{
private JTable tblFilter;
private JTable tblData;
private JScrollPane scrollPane;
private JScrollPane scrollPane_1;
public CompFilteredTable() {
setLayout(new BorderLayout(0, 0));
add(getScrollPane_1(), BorderLayout.NORTH);
add(getScrollPane(), BorderLayout.CENTER);
}
public JTable getTblFilter() {
if (tblFilter == null) {
tblFilter = new MyTable(new TestTableModel2());
tblFilter.setAutoResizeMode(JTable.AUTO_RESIZE_OFF);
tblFilter.setTableHeader (null);
}
return tblFilter;
}
public JTable getTblData() {
if (tblData == null) {
tblData = new MyTable(new TestTableModel());
tblData.setAutoResizeMode(JTable.AUTO_RESIZE_OFF);
tblFilter.setColumnModel(tblData.getColumnModel());
}
return tblData;
}
private class MyTable extends JTable {
private MyTable (final TableModel model) {
super (model);
}
private boolean isColumnMarginChangeInProgress=false;
@Override
public void columnMarginChanged(final ChangeEvent e) {
if (isColumnMarginChangeInProgress) {
return;
}
isColumnMarginChangeInProgress = true;
if (isEditing()) {
removeEditor();
}
TableColumn resizingColumn = null;
if (tableHeader != null) {
resizingColumn = tableHeader.getResizingColumn();
}
if (resizingColumn != null) {
if (autoResizeMode == AUTO_RESIZE_OFF) {
resizingColumn.setPreferredWidth(resizingColumn.getWidth());
} else { // this else block is missing in jdk1.4 as compared to 1.3
doLayout();
repaint();
}
} else {
resizeAndRepaint();
}
isColumnMarginChangeInProgress = false;
}
}
public static void main(String[] args) {
JFrame frame = new JFrame();
frame.setPreferredSize(new Dimension(600, 400));
CompFilteredTable compFilteredTable = new CompFilteredTable();
frame.getContentPane().add(compFilteredTable);
frame.pack();
frame.setVisible(true);
}
private class TestTableModel extends DefaultTableModel {
@Override
public int getRowCount () {
return 10;
}
@Override
public int getColumnCount () {
return 10;
}
@Override
public String getColumnName (final int column) {
return "Col-"+column;
}
@Override
public Object getValueAt (final int row, final int column) {
return (row * column) + "";
}
}
private class TestTableModel2 extends DefaultTableModel {
@Override
public int getRowCount () {
return 1;
}
@Override
public int getColumnCount () {
return 10;
}
@Override
public String getColumnName (final int column) {
return "Col-"+column;
}
@Override
public Object getValueAt (final int row, final int column) {
return (row * column) + "";
}
}
private JScrollPane getScrollPane() {
if (scrollPane == null) {
scrollPane = new JScrollPane();
scrollPane.setViewportView(getTblData());
}
return scrollPane;
}
private JScrollPane getScrollPane_1() {
if (scrollPane_1 == null) {
scrollPane_1 = new JScrollPane();
scrollPane_1.setViewportView(getTblFilter());
}
return scrollPane_1;
}
}
在贡献 deepak 后更新了代码(我不知道如何显示我的更新,因此我在下面添加)
我更新了代码,现在图片上有两个问题。第二个table的header没看到,table之间差距很大
import java.awt.BorderLayout;
import java.awt.Dimension;
import javax.swing.JFrame;
import javax.swing.JPanel;
import javax.swing.JTable;
import javax.swing.event.ChangeEvent;
import javax.swing.table.DefaultTableModel;
import javax.swing.table.TableColumn;
import javax.swing.table.TableModel;
import javax.swing.JScrollPane;
import java.awt.GridLayout;
public class CompFilteredTable extends JPanel{
private JTable tblFilter;
private JTable tblData;
private JScrollPane scrollPane;
private JPanel panel;
public CompFilteredTable() {
setLayout(new BorderLayout(0, 0));
add(getScrollPane(), BorderLayout.CENTER);
}
public JTable getTblFilter() {
if (tblFilter == null) {
tblFilter = new MyTable(new TestTableModel2());
tblFilter.setAutoResizeMode(JTable.AUTO_RESIZE_OFF);
tblFilter.setTableHeader (null);
}
return tblFilter;
}
public JTable getTblData() {
if (tblData == null) {
tblData = new MyTable(new TestTableModel());
tblData.setAutoResizeMode(JTable.AUTO_RESIZE_OFF);
tblFilter.setColumnModel(tblData.getColumnModel());
}
return tblData;
}
private class MyTable extends JTable {
private MyTable (final TableModel model) {
super (model);
}
private boolean isColumnMarginChangeInProgress=false;
@Override
public void columnMarginChanged(final ChangeEvent e) {
if (isColumnMarginChangeInProgress) {
return;
}
isColumnMarginChangeInProgress = true;
if (isEditing()) {
removeEditor();
}
TableColumn resizingColumn = null;
if (tableHeader != null) {
resizingColumn = tableHeader.getResizingColumn();
}
if (resizingColumn != null) {
if (autoResizeMode == AUTO_RESIZE_OFF) {
resizingColumn.setPreferredWidth(resizingColumn.getWidth());
} else { // this else block is missing in jdk1.4 as compared to 1.3
doLayout();
}
repaint();
} else {
resizeAndRepaint();
}
isColumnMarginChangeInProgress = false;
}
}
public static void main(String[] args) {
JFrame frame = new JFrame();
frame.setPreferredSize(new Dimension(600, 400));
CompFilteredTable compFilteredTable = new CompFilteredTable();
frame.getContentPane().add(compFilteredTable);
frame.pack();
frame.setVisible(true);
}
private class TestTableModel extends DefaultTableModel {
@Override
public int getRowCount () {
return 10;
}
@Override
public int getColumnCount () {
return 10;
}
@Override
public String getColumnName (final int column) {
return "Col-"+column;
}
@Override
public Object getValueAt (final int row, final int column) {
return (row * column) + "";
}
}
private class TestTableModel2 extends DefaultTableModel {
@Override
public int getRowCount () {
return 1;
}
@Override
public int getColumnCount () {
return 10;
}
@Override
public String getColumnName (final int column) {
return "Col-"+column;
}
@Override
public Object getValueAt (final int row, final int column) {
return (row * column) + "";
}
}
private JScrollPane getScrollPane() {
if (scrollPane == null) {
scrollPane = new JScrollPane();
scrollPane.setViewportView(getPanel());
}
return scrollPane;
}
private JPanel getPanel() {
if (panel == null) {
panel = new JPanel();
panel.setLayout(new GridLayout(2, 1, 0, 0));
panel.add(getTblFilter());
panel.add(getTblData());
}
return panel;
}
}
输出屏幕
在 columnMarginChanged
事件上使用方法 setPreferredWidth
设置 TableColumn
的首选宽度将更新 JTableHeader
组件。所以 table header 正在按照观察到的大小进行调整。
在设置所需属性后显式调用 repaint()
将触发更改应用于 table 的每个组件。
因此,这里是使它按您预期的方式运行所需的更改。
if (autoResizeMode == AUTO_RESIZE_OFF) {
resizingColumn.setPreferredWidth(resizingColumn.getWidth());
repaint();
} else { // this else block is missing in jdk1.4 as compared to 1.3
此外,repaint()
也可以移出条件块。
问题 1:第二个 table 的 header 没有看到。
原因:table header 被设置为 null
,如发布的代码所示。
public JTable getTblFilter() {
if (tblFilter == null) {
tblFilter = new MyTable(new TestTableModel2());
tblFilter.setAutoResizeMode(JTable.AUTO_RESIZE_OFF);
tblFilter.setTableHeader (null);
}
return tblFilter;
}
解决方案是不要将 table header 设置为空。删除部分代码
tblFilter.setTableHeader (null);
应该可以。
问题2:table之间差距很大
有不同的 LayoutManagers 可用,可用于根据您的需要设计 UI。使用 2 行 1 列的 GridLayout 在这里应该有所帮助。
public CompFilteredTable() {
setLayout(new GridLayout(2, 1));
add(getScrollPane_1());
add(getScrollPane());
}
可以将单个JTable添加到单个JScrollPane中,解决tableheaders在UI中不显示的问题。
要管理 table 之间的间隙,GridBagLayout 可以提供帮助。 GridBagLayout 是 GridBagLayout 中最灵活的布局管理器 class.The object 垂直、水平或沿其基线对齐组件 ,而不需要相同大小的组件。
我解决了所有问题,table之间有一点差距。我想将其用作一个组件,根据上层 table 的值过滤 table。这个组件有什么改进吗?也许过滤功能可以添加到这个组件。
组件输出画面:
import java.awt.BorderLayout;
import java.awt.Dimension;
import javax.swing.JFrame;
import javax.swing.JPanel;
import javax.swing.JTable;
import javax.swing.event.ChangeEvent;
import javax.swing.table.DefaultTableModel;
import javax.swing.table.TableColumn;
import javax.swing.table.TableModel;
import javax.swing.JScrollPane;
import javax.swing.ScrollPaneConstants;
public class CompFilteredTable extends JPanel{
private JTable tblFilter;
private JTable tblData;
private JScrollPane scrollPane;
private JPanel panel;
private JScrollPane scrollPane_1;
private JScrollPane scrollPane_2;
public CompFilteredTable() {
setLayout(new BorderLayout(0, 0));
add(getScrollPane(), BorderLayout.CENTER);
}
public JTable getTblFilter() {
if (tblFilter == null) {
tblFilter = new FilteredTable(new TestTableModel2());
tblFilter.setPreferredScrollableViewportSize(new Dimension(0, 0));
tblFilter.setAutoResizeMode(JTable.AUTO_RESIZE_OFF);
tblFilter.setTableHeader (null);
}
return tblFilter;
}
public JTable getTblData() {
if (tblData == null) {
tblData = new FilteredTable(new TestTableModel());
tblData.setAutoResizeMode(JTable.AUTO_RESIZE_OFF);
tblFilter.setColumnModel(tblData.getColumnModel());
}
return tblData;
}
public static void main(String[] args) {
JFrame frame = new JFrame();
frame.setPreferredSize(new Dimension(600, 400));
CompFilteredTable compFilteredTable = new CompFilteredTable();
frame.getContentPane().add(compFilteredTable);
frame.pack();
frame.setVisible(true);
}
private class TestTableModel extends DefaultTableModel {
@Override
public int getRowCount () {
return 10;
}
@Override
public int getColumnCount () {
return 10;
}
@Override
public String getColumnName (final int column) {
return "Col-"+column;
}
@Override
public Object getValueAt (final int row, final int column) {
return (row * column) + "";
}
}
private class TestTableModel2 extends DefaultTableModel {
@Override
public int getRowCount () {
return 1;
}
@Override
public int getColumnCount () {
return 10;
}
@Override
public String getColumnName (final int column) {
return "Col-"+column;
}
@Override
public Object getValueAt (final int row, final int column) {
return (row * column) + "";
}
}
private JScrollPane getScrollPane() {
if (scrollPane == null) {
scrollPane = new JScrollPane();
scrollPane.setViewportView(getPanel());
}
return scrollPane;
}
private JPanel getPanel() {
if (panel == null) {
panel = new JPanel();
panel.setLayout(new BorderLayout(0, 0));
panel.add(getScrollPane_2(), BorderLayout.NORTH);
panel.add(getScrollPane_1());
}
return panel;
}
private JScrollPane getScrollPane_1() {
if (scrollPane_1 == null) {
scrollPane_1 = new JScrollPane();
scrollPane_1.setVerticalScrollBarPolicy(ScrollPaneConstants.VERTICAL_SCROLLBAR_NEVER);
scrollPane_1.setHorizontalScrollBarPolicy(ScrollPaneConstants.HORIZONTAL_SCROLLBAR_NEVER);
scrollPane_1.setViewportView(getTblData());
Dimension d = tblData.getPreferredSize();
scrollPane_1.setPreferredSize(new Dimension(d.width,tblData.getRowHeight()*tblData.getRowCount()+1));
}
return scrollPane_1;
}
private JScrollPane getScrollPane_2() {
if (scrollPane_2 == null) {
scrollPane_2 = new JScrollPane();
scrollPane_2.setHorizontalScrollBarPolicy(ScrollPaneConstants.HORIZONTAL_SCROLLBAR_NEVER);
scrollPane_2.setVerticalScrollBarPolicy(ScrollPaneConstants.VERTICAL_SCROLLBAR_NEVER);
scrollPane_2.setViewportView(getTblFilter());
Dimension d = tblFilter.getPreferredSize();
scrollPane_2.setPreferredSize(new Dimension(d.width,tblFilter.getRowHeight()*tblFilter.getRowCount()+1));
}
return scrollPane_2;
}
}
class FilteredTable extends JTable {
FilteredTable (final TableModel model) {
super (model);
}
private boolean isColumnMarginChangeInProgress=false;
@Override
public void columnMarginChanged(final ChangeEvent e) {
if (isColumnMarginChangeInProgress) {
return;
}
isColumnMarginChangeInProgress = true;
if (isEditing()) {
removeEditor();
}
TableColumn resizingColumn = null;
if (tableHeader != null) {
resizingColumn = tableHeader.getResizingColumn();
}
if (resizingColumn != null) {
if (autoResizeMode == AUTO_RESIZE_OFF) {
resizingColumn.setPreferredWidth(resizingColumn.getWidth());
} else { // this else block is missing in jdk1.4 as compared to 1.3
doLayout();
}
repaint();
} else {
resizeAndRepaint();
}
isColumnMarginChangeInProgress = false;
}
}
我设计了两个具有相同 columnmodel 的 jtables,因此它们会相应地调整大小,这两个 jtables 应该具有相同的列号,我希望它们以相同的方式运行,当我们调整列的大小或更改滚动条时。现在我遇到问题,当我调整第二个 table 大小时,行上的列不会改变它们的大小并且滚动条不会相应地运行。
我的代码就是这样
import java.awt.BorderLayout;
import java.awt.Dimension;
import javax.swing.JFrame;
import javax.swing.JPanel;
import javax.swing.JTable;
import javax.swing.event.ChangeEvent;
import javax.swing.table.DefaultTableModel;
import javax.swing.table.TableColumn;
import javax.swing.table.TableModel;
import javax.swing.JScrollPane;
public class CompFilteredTable extends JPanel{
private JTable tblFilter;
private JTable tblData;
private JScrollPane scrollPane;
private JScrollPane scrollPane_1;
public CompFilteredTable() {
setLayout(new BorderLayout(0, 0));
add(getScrollPane_1(), BorderLayout.NORTH);
add(getScrollPane(), BorderLayout.CENTER);
}
public JTable getTblFilter() {
if (tblFilter == null) {
tblFilter = new MyTable(new TestTableModel2());
tblFilter.setAutoResizeMode(JTable.AUTO_RESIZE_OFF);
tblFilter.setTableHeader (null);
}
return tblFilter;
}
public JTable getTblData() {
if (tblData == null) {
tblData = new MyTable(new TestTableModel());
tblData.setAutoResizeMode(JTable.AUTO_RESIZE_OFF);
tblFilter.setColumnModel(tblData.getColumnModel());
}
return tblData;
}
private class MyTable extends JTable {
private MyTable (final TableModel model) {
super (model);
}
private boolean isColumnMarginChangeInProgress=false;
@Override
public void columnMarginChanged(final ChangeEvent e) {
if (isColumnMarginChangeInProgress) {
return;
}
isColumnMarginChangeInProgress = true;
if (isEditing()) {
removeEditor();
}
TableColumn resizingColumn = null;
if (tableHeader != null) {
resizingColumn = tableHeader.getResizingColumn();
}
if (resizingColumn != null) {
if (autoResizeMode == AUTO_RESIZE_OFF) {
resizingColumn.setPreferredWidth(resizingColumn.getWidth());
} else { // this else block is missing in jdk1.4 as compared to 1.3
doLayout();
repaint();
}
} else {
resizeAndRepaint();
}
isColumnMarginChangeInProgress = false;
}
}
public static void main(String[] args) {
JFrame frame = new JFrame();
frame.setPreferredSize(new Dimension(600, 400));
CompFilteredTable compFilteredTable = new CompFilteredTable();
frame.getContentPane().add(compFilteredTable);
frame.pack();
frame.setVisible(true);
}
private class TestTableModel extends DefaultTableModel {
@Override
public int getRowCount () {
return 10;
}
@Override
public int getColumnCount () {
return 10;
}
@Override
public String getColumnName (final int column) {
return "Col-"+column;
}
@Override
public Object getValueAt (final int row, final int column) {
return (row * column) + "";
}
}
private class TestTableModel2 extends DefaultTableModel {
@Override
public int getRowCount () {
return 1;
}
@Override
public int getColumnCount () {
return 10;
}
@Override
public String getColumnName (final int column) {
return "Col-"+column;
}
@Override
public Object getValueAt (final int row, final int column) {
return (row * column) + "";
}
}
private JScrollPane getScrollPane() {
if (scrollPane == null) {
scrollPane = new JScrollPane();
scrollPane.setViewportView(getTblData());
}
return scrollPane;
}
private JScrollPane getScrollPane_1() {
if (scrollPane_1 == null) {
scrollPane_1 = new JScrollPane();
scrollPane_1.setViewportView(getTblFilter());
}
return scrollPane_1;
}
}
在贡献 deepak 后更新了代码(我不知道如何显示我的更新,因此我在下面添加)
我更新了代码,现在图片上有两个问题。第二个table的header没看到,table之间差距很大
import java.awt.BorderLayout;
import java.awt.Dimension;
import javax.swing.JFrame;
import javax.swing.JPanel;
import javax.swing.JTable;
import javax.swing.event.ChangeEvent;
import javax.swing.table.DefaultTableModel;
import javax.swing.table.TableColumn;
import javax.swing.table.TableModel;
import javax.swing.JScrollPane;
import java.awt.GridLayout;
public class CompFilteredTable extends JPanel{
private JTable tblFilter;
private JTable tblData;
private JScrollPane scrollPane;
private JPanel panel;
public CompFilteredTable() {
setLayout(new BorderLayout(0, 0));
add(getScrollPane(), BorderLayout.CENTER);
}
public JTable getTblFilter() {
if (tblFilter == null) {
tblFilter = new MyTable(new TestTableModel2());
tblFilter.setAutoResizeMode(JTable.AUTO_RESIZE_OFF);
tblFilter.setTableHeader (null);
}
return tblFilter;
}
public JTable getTblData() {
if (tblData == null) {
tblData = new MyTable(new TestTableModel());
tblData.setAutoResizeMode(JTable.AUTO_RESIZE_OFF);
tblFilter.setColumnModel(tblData.getColumnModel());
}
return tblData;
}
private class MyTable extends JTable {
private MyTable (final TableModel model) {
super (model);
}
private boolean isColumnMarginChangeInProgress=false;
@Override
public void columnMarginChanged(final ChangeEvent e) {
if (isColumnMarginChangeInProgress) {
return;
}
isColumnMarginChangeInProgress = true;
if (isEditing()) {
removeEditor();
}
TableColumn resizingColumn = null;
if (tableHeader != null) {
resizingColumn = tableHeader.getResizingColumn();
}
if (resizingColumn != null) {
if (autoResizeMode == AUTO_RESIZE_OFF) {
resizingColumn.setPreferredWidth(resizingColumn.getWidth());
} else { // this else block is missing in jdk1.4 as compared to 1.3
doLayout();
}
repaint();
} else {
resizeAndRepaint();
}
isColumnMarginChangeInProgress = false;
}
}
public static void main(String[] args) {
JFrame frame = new JFrame();
frame.setPreferredSize(new Dimension(600, 400));
CompFilteredTable compFilteredTable = new CompFilteredTable();
frame.getContentPane().add(compFilteredTable);
frame.pack();
frame.setVisible(true);
}
private class TestTableModel extends DefaultTableModel {
@Override
public int getRowCount () {
return 10;
}
@Override
public int getColumnCount () {
return 10;
}
@Override
public String getColumnName (final int column) {
return "Col-"+column;
}
@Override
public Object getValueAt (final int row, final int column) {
return (row * column) + "";
}
}
private class TestTableModel2 extends DefaultTableModel {
@Override
public int getRowCount () {
return 1;
}
@Override
public int getColumnCount () {
return 10;
}
@Override
public String getColumnName (final int column) {
return "Col-"+column;
}
@Override
public Object getValueAt (final int row, final int column) {
return (row * column) + "";
}
}
private JScrollPane getScrollPane() {
if (scrollPane == null) {
scrollPane = new JScrollPane();
scrollPane.setViewportView(getPanel());
}
return scrollPane;
}
private JPanel getPanel() {
if (panel == null) {
panel = new JPanel();
panel.setLayout(new GridLayout(2, 1, 0, 0));
panel.add(getTblFilter());
panel.add(getTblData());
}
return panel;
}
}
输出屏幕
在 columnMarginChanged
事件上使用方法 setPreferredWidth
设置 TableColumn
的首选宽度将更新 JTableHeader
组件。所以 table header 正在按照观察到的大小进行调整。
在设置所需属性后显式调用 repaint()
将触发更改应用于 table 的每个组件。
因此,这里是使它按您预期的方式运行所需的更改。
if (autoResizeMode == AUTO_RESIZE_OFF) {
resizingColumn.setPreferredWidth(resizingColumn.getWidth());
repaint();
} else { // this else block is missing in jdk1.4 as compared to 1.3
此外,repaint()
也可以移出条件块。
问题 1:第二个 table 的 header 没有看到。
原因:table header 被设置为 null
,如发布的代码所示。
public JTable getTblFilter() {
if (tblFilter == null) {
tblFilter = new MyTable(new TestTableModel2());
tblFilter.setAutoResizeMode(JTable.AUTO_RESIZE_OFF);
tblFilter.setTableHeader (null);
}
return tblFilter;
}
解决方案是不要将 table header 设置为空。删除部分代码
tblFilter.setTableHeader (null);
应该可以。
问题2:table之间差距很大
有不同的 LayoutManagers 可用,可用于根据您的需要设计 UI。使用 2 行 1 列的 GridLayout 在这里应该有所帮助。
public CompFilteredTable() {
setLayout(new GridLayout(2, 1));
add(getScrollPane_1());
add(getScrollPane());
}
可以将单个JTable添加到单个JScrollPane中,解决tableheaders在UI中不显示的问题。
要管理 table 之间的间隙,GridBagLayout 可以提供帮助。 GridBagLayout 是 GridBagLayout 中最灵活的布局管理器 class.The object 垂直、水平或沿其基线对齐组件 ,而不需要相同大小的组件。
我解决了所有问题,table之间有一点差距。我想将其用作一个组件,根据上层 table 的值过滤 table。这个组件有什么改进吗?也许过滤功能可以添加到这个组件。
组件输出画面:
import java.awt.BorderLayout;
import java.awt.Dimension;
import javax.swing.JFrame;
import javax.swing.JPanel;
import javax.swing.JTable;
import javax.swing.event.ChangeEvent;
import javax.swing.table.DefaultTableModel;
import javax.swing.table.TableColumn;
import javax.swing.table.TableModel;
import javax.swing.JScrollPane;
import javax.swing.ScrollPaneConstants;
public class CompFilteredTable extends JPanel{
private JTable tblFilter;
private JTable tblData;
private JScrollPane scrollPane;
private JPanel panel;
private JScrollPane scrollPane_1;
private JScrollPane scrollPane_2;
public CompFilteredTable() {
setLayout(new BorderLayout(0, 0));
add(getScrollPane(), BorderLayout.CENTER);
}
public JTable getTblFilter() {
if (tblFilter == null) {
tblFilter = new FilteredTable(new TestTableModel2());
tblFilter.setPreferredScrollableViewportSize(new Dimension(0, 0));
tblFilter.setAutoResizeMode(JTable.AUTO_RESIZE_OFF);
tblFilter.setTableHeader (null);
}
return tblFilter;
}
public JTable getTblData() {
if (tblData == null) {
tblData = new FilteredTable(new TestTableModel());
tblData.setAutoResizeMode(JTable.AUTO_RESIZE_OFF);
tblFilter.setColumnModel(tblData.getColumnModel());
}
return tblData;
}
public static void main(String[] args) {
JFrame frame = new JFrame();
frame.setPreferredSize(new Dimension(600, 400));
CompFilteredTable compFilteredTable = new CompFilteredTable();
frame.getContentPane().add(compFilteredTable);
frame.pack();
frame.setVisible(true);
}
private class TestTableModel extends DefaultTableModel {
@Override
public int getRowCount () {
return 10;
}
@Override
public int getColumnCount () {
return 10;
}
@Override
public String getColumnName (final int column) {
return "Col-"+column;
}
@Override
public Object getValueAt (final int row, final int column) {
return (row * column) + "";
}
}
private class TestTableModel2 extends DefaultTableModel {
@Override
public int getRowCount () {
return 1;
}
@Override
public int getColumnCount () {
return 10;
}
@Override
public String getColumnName (final int column) {
return "Col-"+column;
}
@Override
public Object getValueAt (final int row, final int column) {
return (row * column) + "";
}
}
private JScrollPane getScrollPane() {
if (scrollPane == null) {
scrollPane = new JScrollPane();
scrollPane.setViewportView(getPanel());
}
return scrollPane;
}
private JPanel getPanel() {
if (panel == null) {
panel = new JPanel();
panel.setLayout(new BorderLayout(0, 0));
panel.add(getScrollPane_2(), BorderLayout.NORTH);
panel.add(getScrollPane_1());
}
return panel;
}
private JScrollPane getScrollPane_1() {
if (scrollPane_1 == null) {
scrollPane_1 = new JScrollPane();
scrollPane_1.setVerticalScrollBarPolicy(ScrollPaneConstants.VERTICAL_SCROLLBAR_NEVER);
scrollPane_1.setHorizontalScrollBarPolicy(ScrollPaneConstants.HORIZONTAL_SCROLLBAR_NEVER);
scrollPane_1.setViewportView(getTblData());
Dimension d = tblData.getPreferredSize();
scrollPane_1.setPreferredSize(new Dimension(d.width,tblData.getRowHeight()*tblData.getRowCount()+1));
}
return scrollPane_1;
}
private JScrollPane getScrollPane_2() {
if (scrollPane_2 == null) {
scrollPane_2 = new JScrollPane();
scrollPane_2.setHorizontalScrollBarPolicy(ScrollPaneConstants.HORIZONTAL_SCROLLBAR_NEVER);
scrollPane_2.setVerticalScrollBarPolicy(ScrollPaneConstants.VERTICAL_SCROLLBAR_NEVER);
scrollPane_2.setViewportView(getTblFilter());
Dimension d = tblFilter.getPreferredSize();
scrollPane_2.setPreferredSize(new Dimension(d.width,tblFilter.getRowHeight()*tblFilter.getRowCount()+1));
}
return scrollPane_2;
}
}
class FilteredTable extends JTable {
FilteredTable (final TableModel model) {
super (model);
}
private boolean isColumnMarginChangeInProgress=false;
@Override
public void columnMarginChanged(final ChangeEvent e) {
if (isColumnMarginChangeInProgress) {
return;
}
isColumnMarginChangeInProgress = true;
if (isEditing()) {
removeEditor();
}
TableColumn resizingColumn = null;
if (tableHeader != null) {
resizingColumn = tableHeader.getResizingColumn();
}
if (resizingColumn != null) {
if (autoResizeMode == AUTO_RESIZE_OFF) {
resizingColumn.setPreferredWidth(resizingColumn.getWidth());
} else { // this else block is missing in jdk1.4 as compared to 1.3
doLayout();
}
repaint();
} else {
resizeAndRepaint();
}
isColumnMarginChangeInProgress = false;
}
}