读书人

100分求JTable解决方案,该如何解决

发布时间: 2012-04-02 19:58:59 作者: rapoo

100分求JTable解决方案
我想在表格中加入一个控件,比如说进度条.图片,按钮.但是表格中只显示这个进度条的相关属性,并不把这些控件显示出来,请较高手.代码方式表述.


[解决办法]
怎么没人呀,偶给你顶上去。。。
[解决办法]
需要实现接口TableCellRenderer,即提供一个单元格绘制器,用于绘制如JButton
然后table.setDefaultRenderer()设置绘制器
给你一个很简单的例子

package csdn;

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

//实现TableCellRenderer,绘制JButton
class JTableButtonRenderer extends JButton implements TableCellRenderer {
private TableCellRenderer defaultRenderer;

public JTableButtonRenderer(TableCellRenderer renderer) {
defaultRenderer = renderer;
}

public Component getTableCellRendererComponent(JTable table, Object value,
boolean isSelected,
boolean hasFocus,
int row, int column)
{
if (isSelected) {
this.setBorder(BorderFactory.createLineBorder(Color.BLUE));
}
else {
this.setBorder(null);
}
return this;
}
}

class JTableButtonModel extends AbstractTableModel {
private Object[][] rows = {{new JButton( "test ")}};
private String[] columns = { "test "};

public String getColumnName(int column) {
return columns[column];
}

public int getRowCount() {
return rows.length;
}

public int getColumnCount() {
return columns.length;
}

public Object getValueAt(int row, int column) {
return rows[row][column];
}

public boolean isCellEditable(int row, int column) {
return false;
}

public Class getColumnClass(int column) {
return getValueAt(0, column).getClass();
}
}


public final class TableTest extends JFrame {
private JTable table;

public TableTest() {
TableCellRenderer defaultRenderer;

table = new JTable(new JTableButtonModel());
defaultRenderer = table.getDefaultRenderer(JButton.class);
table.setDefaultRenderer(JButton.class, new JTableButtonRenderer(defaultRenderer)); //设置绘制器
table.setPreferredScrollableViewportSize(new Dimension(400, 200));
this.setContentPane(table);
this.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
this.setSize(300, 300);
}

public static void main(String[] args) {
JFrame frame = new TableTest();
frame.setVisible(true);
}
}
[解决办法]
表格重绘时,才能看得到

import java.awt.BorderLayout;
import java.awt.Component;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;

import javax.swing.JButton;
import javax.swing.JFrame;
import javax.swing.JPanel;
import javax.swing.JProgressBar;
import javax.swing.JScrollPane;
import javax.swing.JTable;
import javax.swing.table.TableCellRenderer;

public class MainFrame extends JFrame {

private static final long serialVersionUID = 1L;

private JPanel jContentPane = null;

private JScrollPane jScrollPane = null;

private JTable jTable = null;

private JProgressBar pbar;

private JProgressBar jProgressBar = null;

/**
* This is the default constructor
*/
public MainFrame() {
super();
pbar = new JProgressBar();
initialize();
setVisible(true);
}

/**
* This method initializes this
*
* @return void
*/
private void initialize() {
this.setSize(489, 253);


this.setContentPane(getJContentPane());
this.setTitle( "JFrame ");


}

/**
* This method initializes jContentPane
*
* @return javax.swing.JPanel
*/
private JPanel getJContentPane() {
if (jContentPane == null) {
jContentPane = new JPanel();
jContentPane.setLayout(new BorderLayout());
jContentPane.add(getJScrollPane(), BorderLayout.CENTER);
jContentPane.add(getJButton(), BorderLayout.SOUTH);
jContentPane.add(getJProgressBar(), BorderLayout.NORTH);
}
return jContentPane;
}

private JButton getJButton()
{
JButton button = new JButton( "Click ");
button.addActionListener(new ActionListener()
{
public void actionPerformed(ActionEvent e)
{
pbar.setValue(pbar.getValue()+2);
jProgressBar.setValue(pbar.getValue()+2);
jTable.setValueAt( " ", 0, 0);
}
});
return button;
}

/**
* This method initializes jScrollPane
*
* @return javax.swing.JScrollPane
*/
private JScrollPane getJScrollPane() {
if (jScrollPane == null) {
jScrollPane = new JScrollPane();
jScrollPane.setViewportView(getJTable());
}
return jScrollPane;
}

/**
* This method initializes jTable
*
* @return javax.swing.JTable
*/
private JTable getJTable() {
if (jTable == null) {
jTable = new JTable(new String[][]{{ "A ", "B "},{ "C ", "D "}},new String[]{ "E ", "F "});
jTable.getColumnModel().getColumn(0).setCellRenderer(new TableProcessRender());
}
return jTable;
}

public class TableProcessRender implements TableCellRenderer
{


public Component getTableCellRendererComponent(JTable table, Object value, boolean isSelected, boolean hasFocus, int row, int column)
{
return pbar;
}
}

/**
* This method initializes jProgressBar
*
* @return javax.swing.JProgressBar
*/
private JProgressBar getJProgressBar() {
if (jProgressBar == null) {
jProgressBar = new JProgressBar();
}
return jProgressBar;
}

public static void main(String[] args)
{
new MainFrame();
}

}

[解决办法]
帮顶
[解决办法]
上面第二个程序的getXX()方法没有被周用,就实现上述功能了,请问之间是怎样的一种关系?希望能够具体点
[解决办法]
仔细看,调用了
Constructor MainFrame() --> initialize() --> getJContentPane() --> getXX()
[解决办法]
不好意思,开始没有看清楚,我把上面的empireconquer的代码运行了下,里面还有一个问题,就是里面所有的进度条都是一个值,请问,怎样实现多个进度条的不同值显示?
[解决办法]
ding

读书人网 >J2SE开发

热点推荐