??xml version="1.0" encoding="utf-8" standalone="yes"?>typeTable.setPreferredScrollableViewportSize(typeTable.getPreferredSize());
JScrollPane typeTableScrollPane=new JScrollPane(typeTable);
mt.pack();
mt.setVisible(true);
import java.awt.*;
import javax.swing.*;
public class MixerTest2 extends JFrame {
public MixerTest2() {
super("Customer Editor Test");
setSize(600,160);
setDefaultCloseOperation(EXIT_ON_CLOSE);
JTable typeTable=new JTable();
typeTable=new JTable(new String [][] {
{"312fs", "33232", "32", "32"},
{"3212fsdfa12", "3322", "32", "32"},
{"3212fa12", "321212", "321212", "321212"},
{"3212gsds12", "321212", "321212", "321212"}
},
new String [] {
"Title 1", "Title 2", "Title 3", "Title 4"
}
);
typeTable.setAutoResizeMode(JTable.AUTO_RESIZE_NEXT_COLUMN);
typeTable.getColumnModel().getColumn(0).setPreferredWidth(10);
typeTable.getColumnModel().getColumn(1).setPreferredWidth(30);
JScrollPane typeTableScrollPane=new JScrollPane(typeTable);
getContentPane().add(typeTableScrollPane);
}
public static void main(String args[]) {
MixerTest2 mt = new MixerTest2();
mt.setVisible(true);
}
}
而在我的q个样例E序中,JFrame 宽度?00Q远q大于JTable 的宽度。因此程序按照我的初始值绘制完JTable之后Q会自动的根据JFrame 的大及布局再重新调整。这样就造成与代码不W的情况?br />
在网上查询到Q有人推荐?font style="background-color: #dfd8f1">Table.setAutoResizeMode(JTable.AUTO_RESIZE_OFF);q样会解决问题,但同时我们也失去使用AutoResizeMode的好处?br />
代码修改如下,问题解决Q?br />
typeTable.setPreferredScrollableViewportSize(typeTable.getPreferredSize());
JScrollPane typeTableScrollPane=new JScrollPane(typeTable);
mt.pack();
mt.setVisible(true);
]]>
2Q完成布局Q?br />
3Q调?validate();使新布局有效?/font>
字段 | 描述 |
ID | |
fee |
|
description |
|
type |
|
date | 记录插入日期 |
TableCellRenderer是用来l制展示当前cell单元数值内容的Q你可以用文字、数值或者图片来表示内容Q当然最强大展示方式的就是通过自定义自qrendererlgQ通过Java2D来绘制各U天׃ؕ坠的效果?/span>
TableCellEditor主要是用来当用户点击在具体cell时进行编辑的lgQ所以TableCellEditor除了hTableCellRenderer一Ll制功能外还可以q行交互动作Q例如在cell上出C拉框、勾选框甚至通过按钮弹出更复杂的对话框让用户q行输入~辑?/span>
以下是在cell中嵌入start、stop两个按钮的表|注意q里的renderer只是用来昄效果Qƈ没有q行交互动作Q真正进行动作的是当你将鼠标点击在cell上时QJTable定位上去的editorQ所以不要徒力_renderer上做点击事项处理Qrenderer是不会接受到交互事项的,renderer只是个画W,你看到的start、stop按钮只是q个ȝd来的内容Q是虚的q没有真正的lg在上面?/p>
import java.awt.*;
import java.awt.event.*;
import javax.swing.*;
import javax.swing.table.*;
public class TableTest1 extends JFrame {
JTable table;
String[] states = new String[]{"stop", "stop", "stop"};
// model
class TableModel extends AbstractTableModel{
public int getColumnCount() {
return 2;
}
public int getRowCount() {
return states.length;
}
public Object getValueAt(int rowIndex, int columnIndex) {
if(columnIndex == 0){
return states[rowIndex];
}
return null;
}
public String getColumnName(int columnIndex) {
if(columnIndex == 0){
return "state";
}else{
return "operate";
}
}
public boolean isCellEditable(int rowIndex, int columnIndex) {
if(columnIndex == 0){
return false;
}else{
return true;
}
}
}
// cell editor
class Editor extends AbstractCellEditor implements TableCellEditor, ActionListener {
int row;
JTable table;
JPanel panel;
JButton start;
JButton stop;
Editor(){
panel = new JPanel();
panel.setLayout(new GridLayout(1, 2));
start = new JButton("start");
stop = new JButton("stop");
start.addActionListener(this);
stop.addActionListener(this);
panel.add(start);
panel.add(stop);
}
public Object getCellEditorValue() {
return null;
}
public Component getTableCellEditorComponent(JTable table,
Object value,
boolean isSelected,
int row,
int column) {
this.table = table;
this.row = row;
return panel;
}
public void actionPerformed(ActionEvent e) {
if(e.getSource() == start){
states[row] = "start";
}else{
states[row] = "stop";
}
((AbstractTableModel)table.getModel()).fireTableCellUpdated(row, 0);
}
}
// cell render
class Renderer extends JComponent implements TableCellRenderer{
JPanel panel;
JButton start;
JButton stop;
Renderer(){
panel = new JPanel();
panel.setLayout(new GridLayout(1, 2));
start = new JButton("start");
stop = new JButton("stop");
panel.add(start);
panel.add(stop);
}
public Component getTableCellRendererComponent(JTable table, Object value,
boolean isSelected, boolean hasFocus, int row, int column) {
return panel;
}
}
public TableTest1(){
super("renderer and editor self-existent");
table = new JTable(new TableModel());
TableColumn tableColumn = table.getColumnModel().getColumn(1);
tableColumn.setCellRenderer(new Renderer());
tableColumn.setCellEditor(new Editor());
this.getContentPane().setLayout(new BorderLayout());
this.getContentPane().add(new JScrollPane(table), BorderLayout.CENTER);
this.setSize(500, 300);
this.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
}
public static void main(String[] args) {
new TableTest1().show();
}
}