JTable 固定行 请问JTABLE如何做到固定行?固定列已经做出来了,但是固定行无论怎样set都做不出来啊。由于本人的分不多,只能给30分了,但请各位大侠帮忙啊! 解决方案 » 免费领取超大流量手机卡,每月29元包185G流量+100分钟通话, 中国电信官方发货 不是啊,像EXCEL那样冻结行啊,我已经做出冻结列了,但是行无法冻结 你所谓的固定行是指什么?如果是行数,那么是由model决定的,如果是这一行不可编辑,那么也是由model决定的。 像EXCEL冻结行那样,SCROLLBar滚动的时候,这个冻结的行不滚动。像合计行的效果那样,合计行上边的行滚动,但是合计行固定在那不动啊 你这样的话恐怕一个表格难以实现,因为JTable是放到JScrollPane中的,滚动是由JScrollPane控制的,要么你要改写ScrollPane,要么用多个表格实现。 很简单...重载model中的getValueAt方法即可~一般情况下返回正常数值在固定行位置,返回自定义数值即可.... 终于做出来了,是参考http://crionics.com/products/opensource/faq/swing_ex/JTableExamples3.html这个例子作出来的。 这个是我写冻结行与冻结列的例子。谁有更好的,请指点指点。程序有点乱。import java.awt.BorderLayout;import java.awt.Component;import java.awt.Point;import javax.swing.JPanel;import javax.swing.JFrame;import javax.swing.JScrollBar;import javax.swing.JScrollPane;import javax.swing.JViewport;import javax.swing.ListSelectionModel;import java.awt.Rectangle;import javax.swing.JTable;import javax.swing.event.ChangeEvent;import javax.swing.event.ListSelectionEvent;import javax.swing.event.ListSelectionListener;import javax.swing.event.TableColumnModelEvent;import javax.swing.event.TableColumnModelListener;import javax.swing.table.DefaultTableModel;import javax.swing.table.JTableHeader;import java.awt.Dimension;import java.awt.event.AdjustmentEvent;import java.awt.event.AdjustmentListener;import java.awt.event.MouseAdapter;import java.awt.event.MouseEvent;public class table_try extends JFrame { private static final long serialVersionUID = 1L; private JPanel jContentPane = null; private JScrollPane jScrollPane = null; private JTable jTable = null; private JTable fix_Ctable = null; // @jve:decl-index=0:visual-constraint="366,45" private JTable fix_Rtable = null; // @jve:decl-index=0:visual-constraint="365,106" String head1[]={"A","B","C","D","E"}; // @jve:decl-index=0: String head[]={"行号"}; int rows=15; DefaultTableModel dtm=null,fix_dtm1=null,fix_dtm2=null,fix_dtm3=null; private JScrollPane jScrollPane1 = null; // @jve:decl-index=0:visual-constraint="377,158" private JTable fix_Ctable1 = null; // @jve:decl-index=0:visual-constraint="371,194" /** * This is the default constructor */ public table_try() { super(); initialize(); } /** * This method initializes this * * @return void */ private void initialize() { this.setSize(300, 200); this.setContentPane(getJContentPane()); this.setTitle("JFrame"); } /** * This method initializes jContentPane * * @return javax.swing.JPanel */ private JPanel getJContentPane() { if (jContentPane == null) { jContentPane = new JPanel(); //冻结行的关键1 jContentPane.setLayout(new BorderLayout()); jContentPane.add(getJScrollPane(), BorderLayout.CENTER); jContentPane.add(getJScrollPane1(), BorderLayout.SOUTH); } return jContentPane; } /** * This method initializes jScrollPane * * @return javax.swing.JScrollPane */ ///jScrollPane添加fix_Ctable与jTable private JScrollPane getJScrollPane() { if (jScrollPane == null) { jScrollPane = new JScrollPane(); jScrollPane.setPreferredSize(new Dimension(400, 100)); //冻结列的关键 jScrollPane.setViewportView(getJTable()); JViewport viewport=new JViewport(); viewport.setView(getFix_Ctable()); viewport.setPreferredSize(fix_Ctable.getPreferredSize()); jScrollPane.setRowHeader(viewport); jScrollPane.setCorner(JScrollPane.UPPER_LEADING_CORNER,fix_Ctable.getTableHeader()); //冻结行的关键2 jScrollPane.setPreferredSize(new Dimension(400, 52)); // Hmm... jScrollPane.setHorizontalScrollBarPolicy(JScrollPane.HORIZONTAL_SCROLLBAR_NEVER); //jScrollPane滚动时,jScrollPane1的滚动条滚动 JScrollBar bar1 = jScrollPane.getHorizontalScrollBar(); bar1.addAdjustmentListener(new AdjustmentListener() { public void adjustmentValueChanged(AdjustmentEvent e) { JScrollBar bar2 =jScrollPane1.getHorizontalScrollBar(); bar2.setValue(e.getValue()); } }); } return jScrollPane; } /** * This method initializes jScrollPane1 * * @return javax.swing.JScrollPane */ //jScrollPane1添加fix_Ctable1与fix_Rtable private JScrollPane getJScrollPane1() { if (jScrollPane1 == null) { //行冻结的关键3 jScrollPane1 = new JScrollPane(getFix_Rtable()){ public void setColumnHeaderView(Component view) {} // work around }; //列冻结关键 JViewport viewport=new JViewport(); viewport.setView(getFix_Ctable1()); viewport.setPreferredSize(fix_Ctable1.getPreferredSize()); jScrollPane1.setRowHeader(viewport); jScrollPane1.setCorner(JScrollPane.UPPER_LEADING_CORNER,fix_Ctable1.getTableHeader()); //冻结行的关键4 jScrollPane1.setPreferredSize(new Dimension(400, 35)); jScrollPane1.setVerticalScrollBarPolicy(JScrollPane.VERTICAL_SCROLLBAR_ALWAYS); //jScrollPane1滚动时,jScrollPane的滚动条滚动 JScrollBar bar2 =jScrollPane1.getHorizontalScrollBar(); bar2.addAdjustmentListener(new AdjustmentListener() { public void adjustmentValueChanged(AdjustmentEvent e) { JScrollBar bar1 = jScrollPane.getHorizontalScrollBar(); bar1.setValue(e.getValue()); } }); } return jScrollPane1; } /** * This method initializes jTable * * @return javax.swing.JTable */ //jTable private JTable getJTable() { if (jTable == null) { String data[][]=new String[rows][head1.length]; dtm=new DefaultTableModel(data,head1); jTable = new JTable(dtm); jTable.setAutoResizeMode(JTable.AUTO_RESIZE_OFF); jTable.setSelectionMode(ListSelectionModel.SINGLE_SELECTION); jTable.getSelectionModel().addListSelectionListener( new ListSelectionListener(){ public void valueChanged(ListSelectionEvent e) { checkSelection(false);//列同步 checkSelection1(false);//行同步 // TODO Auto-generated method stub } }); //响应列宽事件,当jTable的列宽发生改变的时候,fix_Rtable的列宽也发生改变 jTable.getColumnModel().addColumnModelListener( new TableColumnModelListener() { public void columnAdded(TableColumnModelEvent e) { // TODO Auto-generated method stub } public void columnMarginChanged(ChangeEvent e) { int jtwidth=0,fixwidth=0,i=0; while(i<jTable.getColumnCount()){ jtwidth=jTable.getColumn(jTable.getColumnName(i)).getWidth(); fixwidth=fix_Rtable.getColumn(fix_Rtable.getColumnName(i)).getWidth(); if(jtwidth!=fixwidth){ fix_Rtable.getColumn(fix_Rtable.getColumnName(i)).setPreferredWidth(jtwidth); break; } i++; } // TODO Auto-generated method stub } public void columnMoved(TableColumnModelEvent e) { // TODO Auto-generated method stub } public void columnRemoved(TableColumnModelEvent e) { // TODO Auto-generated method stub } public void columnSelectionChanged(ListSelectionEvent e) { // TODO Auto-generated method stub } }); } return jTable; } /** * This method initializes fix_Ctable * * @return javax.swing.JTable */ //jTable的冻结列fix_Ctable() private JTable getFix_Ctable() { if (fix_Ctable == null) { String data[][]=new String[rows][1]; fix_dtm1=new DefaultTableModel(data,head); fix_Ctable = new JTable(fix_dtm1); fix_Ctable.getColumn("行号").setPreferredWidth(38); fix_Ctable.setSize(new Dimension(174, 45)); fix_Ctable.getSelectionModel().addListSelectionListener( new ListSelectionListener(){ public void valueChanged(ListSelectionEvent e) { checkSelection1(true); // TODO Auto-generated method stub } }); } return fix_Ctable; } /** * This method initializes fix_Rtable * * @return javax.swing.JTable */ //jTable的冻结行fix_Rtable private JTable getFix_Rtable() { if (fix_Rtable == null) { String data[][]=new String[1][1]; fix_dtm2=new DefaultTableModel(data,head1); fix_Rtable = new JTable(fix_dtm2); fix_Rtable.setSize(new Dimension(191, 44)); fix_Rtable.setAutoResizeMode(JTable.AUTO_RESIZE_OFF); fix_Rtable.getSelectionModel().addListSelectionListener( new ListSelectionListener(){ public void valueChanged(ListSelectionEvent e) { checkSelection(true); // TODO Auto-generated method stub } }); fix_Rtable.setSelectionMode(ListSelectionModel.SINGLE_SELECTION); } return fix_Rtable; } /** * This method initializes fix_Ctable1 * * @return javax.swing.JTable */ //fix_Rtable的冻结列 private JTable getFix_Ctable1() { if (fix_Ctable1 == null) { String data[][]=new String[1][1]; fix_dtm3=new DefaultTableModel(data,head); fix_Ctable1 = new JTable(fix_dtm3); fix_Ctable1 .getColumn("行号").setPreferredWidth(38); fix_Ctable1.setSize(new Dimension(143, 25)); } return fix_Ctable1; } //jTable的行与fix_Ctable的行同步 private void checkSelection1(boolean isFixedTable) { int fixedSelectedIndex = fix_Ctable.getSelectedRow(); int selectedIndex = jTable.getSelectedRow(); if(fixedSelectedIndex==-1) fixedSelectedIndex=0; if(selectedIndex==-1) selectedIndex=0; if (fixedSelectedIndex != selectedIndex) { if (isFixedTable) { jTable.setRowSelectionInterval(fixedSelectedIndex, fixedSelectedIndex); } else { fix_Ctable .setRowSelectionInterval(selectedIndex, selectedIndex); } } } //jTable的列与fix_Rtable同步 private void checkSelection(boolean isFixRtable) { int fixedSelectedIndex =fix_Rtable.getSelectedColumn(); int selectedIndex = jTable.getSelectedColumn(); if(fixedSelectedIndex==-1) fixedSelectedIndex=0; if(selectedIndex==-1) selectedIndex=0; if (fixedSelectedIndex != selectedIndex) { if (isFixRtable) { jTable.setColumnSelectionInterval(fixedSelectedIndex, fixedSelectedIndex); } else { fix_Rtable .setColumnSelectionInterval(selectedIndex, selectedIndex); } } // TODO Auto-generated method stub } } 毕业论文问题请教 请大哥大姐指点 JTable 能实现undo redo功能吗? 问题~ 使用Java网站提供的TableSorter给表格数据进行排序,但每次添加了新数据后表格重新paint的时候都会出异常,怎么办? 使用Blowfish的key不够长的问题 java与C++的SOCKET通讯时遇到的奇怪问题! 刚开始学java,问一个初级问题 怎样使叶子节点不显示 有关java2的一个class oracle的jdbc的配置 list中选中某一项或某几项,怎样在table或是tableviewer中显示出对应的信息 Jtable里如何加入jbutton?
重载model中的getValueAt方法即可~
一般情况下返回正常数值
在固定行位置,返回自定义数值即可....
import java.awt.Component;
import java.awt.Point;
import javax.swing.JPanel;
import javax.swing.JFrame;
import javax.swing.JScrollBar;
import javax.swing.JScrollPane;
import javax.swing.JViewport;
import javax.swing.ListSelectionModel;
import java.awt.Rectangle;
import javax.swing.JTable;
import javax.swing.event.ChangeEvent;
import javax.swing.event.ListSelectionEvent;
import javax.swing.event.ListSelectionListener;
import javax.swing.event.TableColumnModelEvent;
import javax.swing.event.TableColumnModelListener;
import javax.swing.table.DefaultTableModel;
import javax.swing.table.JTableHeader;
import java.awt.Dimension;
import java.awt.event.AdjustmentEvent;
import java.awt.event.AdjustmentListener;
import java.awt.event.MouseAdapter;
import java.awt.event.MouseEvent;
public class table_try extends JFrame {
private static final long serialVersionUID = 1L;
private JPanel jContentPane = null;
private JScrollPane jScrollPane = null;
private JTable jTable = null;
private JTable fix_Ctable = null; // @jve:decl-index=0:visual-constraint="366,45" private JTable fix_Rtable = null; // @jve:decl-index=0:visual-constraint="365,106"
String head1[]={"A","B","C","D","E"}; // @jve:decl-index=0:
String head[]={"行号"};
int rows=15;
DefaultTableModel dtm=null,fix_dtm1=null,fix_dtm2=null,fix_dtm3=null; private JScrollPane jScrollPane1 = null; // @jve:decl-index=0:visual-constraint="377,158" private JTable fix_Ctable1 = null; // @jve:decl-index=0:visual-constraint="371,194"
/**
* This is the default constructor
*/
public table_try() {
super();
initialize();
} /**
* This method initializes this
*
* @return void
*/
private void initialize() {
this.setSize(300, 200);
this.setContentPane(getJContentPane());
this.setTitle("JFrame");
} /**
* This method initializes jContentPane
*
* @return javax.swing.JPanel
*/
if (jContentPane == null) {
jContentPane = new JPanel();
//冻结行的关键1
jContentPane.setLayout(new BorderLayout());
jContentPane.add(getJScrollPane(), BorderLayout.CENTER);
jContentPane.add(getJScrollPane1(), BorderLayout.SOUTH);
}
return jContentPane;
} /**
* This method initializes jScrollPane
*
* @return javax.swing.JScrollPane
*/
///jScrollPane添加fix_Ctable与jTable
private JScrollPane getJScrollPane() {
if (jScrollPane == null) {
jScrollPane = new JScrollPane();
jScrollPane.setPreferredSize(new Dimension(400, 100));
//冻结列的关键
jScrollPane.setViewportView(getJTable());
JViewport viewport=new JViewport();
viewport.setView(getFix_Ctable());
viewport.setPreferredSize(fix_Ctable.getPreferredSize());
jScrollPane.setRowHeader(viewport);
jScrollPane.setCorner(JScrollPane.UPPER_LEADING_CORNER,fix_Ctable.getTableHeader());
//冻结行的关键2
jScrollPane.setPreferredSize(new Dimension(400, 52)); // Hmm...
jScrollPane.setHorizontalScrollBarPolicy(JScrollPane.HORIZONTAL_SCROLLBAR_NEVER);
//jScrollPane滚动时,jScrollPane1的滚动条滚动
JScrollBar bar1 = jScrollPane.getHorizontalScrollBar();
bar1.addAdjustmentListener(new AdjustmentListener() {
public void adjustmentValueChanged(AdjustmentEvent e) {
JScrollBar bar2 =jScrollPane1.getHorizontalScrollBar();
bar2.setValue(e.getValue());
}
});
}
return jScrollPane;
}
/**
* This method initializes jScrollPane1
*
* @return javax.swing.JScrollPane
*/
//jScrollPane1添加fix_Ctable1与fix_Rtable
private JScrollPane getJScrollPane1() {
if (jScrollPane1 == null) {
//行冻结的关键3
jScrollPane1 = new JScrollPane(getFix_Rtable()){
public void setColumnHeaderView(Component view) {} // work around
};
//列冻结关键
JViewport viewport=new JViewport();
viewport.setView(getFix_Ctable1());
viewport.setPreferredSize(fix_Ctable1.getPreferredSize());
jScrollPane1.setRowHeader(viewport);
jScrollPane1.setCorner(JScrollPane.UPPER_LEADING_CORNER,fix_Ctable1.getTableHeader());
//冻结行的关键4
jScrollPane1.setPreferredSize(new Dimension(400, 35));
jScrollPane1.setVerticalScrollBarPolicy(JScrollPane.VERTICAL_SCROLLBAR_ALWAYS);
//jScrollPane1滚动时,jScrollPane的滚动条滚动
JScrollBar bar2 =jScrollPane1.getHorizontalScrollBar();
bar2.addAdjustmentListener(new AdjustmentListener() {
public void adjustmentValueChanged(AdjustmentEvent e) {
JScrollBar bar1 = jScrollPane.getHorizontalScrollBar();
bar1.setValue(e.getValue());
}
}); }
return jScrollPane1;
}
/**
* This method initializes jTable
*
* @return javax.swing.JTable
*/
//jTable
private JTable getJTable() {
if (jTable == null) {
String data[][]=new String[rows][head1.length];
dtm=new DefaultTableModel(data,head1);
jTable = new JTable(dtm);
jTable.setAutoResizeMode(JTable.AUTO_RESIZE_OFF);
jTable.setSelectionMode(ListSelectionModel.SINGLE_SELECTION);
jTable.getSelectionModel().addListSelectionListener(
new ListSelectionListener(){
public void valueChanged(ListSelectionEvent e) {
checkSelection(false);//列同步
checkSelection1(false);//行同步
// TODO Auto-generated method stub
}
});
//响应列宽事件,当jTable的列宽发生改变的时候,fix_Rtable的列宽也发生改变
jTable.getColumnModel().addColumnModelListener( new TableColumnModelListener()
{ public void columnAdded(TableColumnModelEvent e) {
// TODO Auto-generated method stub
}
public void columnMarginChanged(ChangeEvent e) {
int jtwidth=0,fixwidth=0,i=0;
while(i<jTable.getColumnCount()){
jtwidth=jTable.getColumn(jTable.getColumnName(i)).getWidth();
fixwidth=fix_Rtable.getColumn(fix_Rtable.getColumnName(i)).getWidth();
if(jtwidth!=fixwidth){
fix_Rtable.getColumn(fix_Rtable.getColumnName(i)).setPreferredWidth(jtwidth);
break;
}
i++;
}
// TODO Auto-generated method stub
} public void columnMoved(TableColumnModelEvent e) {
// TODO Auto-generated method stub
} public void columnRemoved(TableColumnModelEvent e) {
// TODO Auto-generated method stub
} public void columnSelectionChanged(ListSelectionEvent e) {
// TODO Auto-generated method stub
}
});
}
return jTable;
} /**
* This method initializes fix_Ctable
*
* @return javax.swing.JTable
*/
//jTable的冻结列fix_Ctable()
private JTable getFix_Ctable() {
if (fix_Ctable == null) {
String data[][]=new String[rows][1];
fix_dtm1=new DefaultTableModel(data,head);
fix_Ctable = new JTable(fix_dtm1);
fix_Ctable.getColumn("行号").setPreferredWidth(38);
fix_Ctable.setSize(new Dimension(174, 45));
fix_Ctable.getSelectionModel().addListSelectionListener(
new ListSelectionListener(){
public void valueChanged(ListSelectionEvent e) {
checkSelection1(true);
// TODO Auto-generated method stub
}
});
}
return fix_Ctable;
} /**
* This method initializes fix_Rtable
*
* @return javax.swing.JTable
*/
//jTable的冻结行fix_Rtable
private JTable getFix_Rtable() {
if (fix_Rtable == null) {
String data[][]=new String[1][1];
fix_dtm2=new DefaultTableModel(data,head1);
fix_Rtable = new JTable(fix_dtm2);
fix_Rtable.setSize(new Dimension(191, 44));
fix_Rtable.setAutoResizeMode(JTable.AUTO_RESIZE_OFF);
fix_Rtable.getSelectionModel().addListSelectionListener(
new ListSelectionListener(){
public void valueChanged(ListSelectionEvent e) {
checkSelection(true);
// TODO Auto-generated method stub
}
});
fix_Rtable.setSelectionMode(ListSelectionModel.SINGLE_SELECTION);
}
return fix_Rtable;
}
/**
* This method initializes fix_Ctable1
*
* @return javax.swing.JTable
*/
//fix_Rtable的冻结列
private JTable getFix_Ctable1() {
if (fix_Ctable1 == null) {
String data[][]=new String[1][1];
fix_dtm3=new DefaultTableModel(data,head);
fix_Ctable1 = new JTable(fix_dtm3);
fix_Ctable1 .getColumn("行号").setPreferredWidth(38);
fix_Ctable1.setSize(new Dimension(143, 25));
}
return fix_Ctable1;
}
//jTable的行与fix_Ctable的行同步
private void checkSelection1(boolean isFixedTable) {
int fixedSelectedIndex = fix_Ctable.getSelectedRow();
int selectedIndex = jTable.getSelectedRow();
if(fixedSelectedIndex==-1)
fixedSelectedIndex=0;
if(selectedIndex==-1)
selectedIndex=0;
if (fixedSelectedIndex != selectedIndex) {
if (isFixedTable) {
jTable.setRowSelectionInterval(fixedSelectedIndex,
fixedSelectedIndex);
} else {
fix_Ctable
.setRowSelectionInterval(selectedIndex, selectedIndex);
}
}
}
//jTable的列与fix_Rtable同步
private void checkSelection(boolean isFixRtable) {
int fixedSelectedIndex =fix_Rtable.getSelectedColumn();
int selectedIndex = jTable.getSelectedColumn();
if(fixedSelectedIndex==-1)
fixedSelectedIndex=0;
if(selectedIndex==-1)
selectedIndex=0;
if (fixedSelectedIndex != selectedIndex) {
if (isFixRtable) {
jTable.setColumnSelectionInterval(fixedSelectedIndex,
fixedSelectedIndex);
} else {
fix_Rtable
.setColumnSelectionInterval(selectedIndex, selectedIndex);
}
}
// TODO Auto-generated method stub
}
}