- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
我正在尝试使用此教程代码将按钮添加到 JTable 的最后一列:
http://www.java2s.com/Code/Java/Swing-Components/ButtonTableExample.htm
它适用于具有“静态”数据的表,但当我尝试动态添加新行时,我无法让它工作。有办法做到这一点吗?代码如下:
import javax.swing.*;
import java.awt.*;
import java.awt.event.*;
import javax.swing.table.*;
import java.util.*;
public class TestTableButton extends JFrame
{
PlayersTableModel tableModel = new PlayersTableModel();
JTable table = new JTable(tableModel);
public TestTableButton()
{
ButtonColumn bc = new ButtonColumn(table, new AbstractAction(){
public void actionPerformed(ActionEvent e){
JTable table = (JTable)e.getSource();
int modelRow = Integer.valueOf(e.getActionCommand());
System.out.println("you clicked row: " + modelRow);
}
}, 2);
fillTable();
getContentPane().setLayout(new GridLayout(2, 1, 0, 0));
getContentPane().add(table);
JButton addPlayer = new JButton("Add row");
addPlayer.addActionListener(new ActionListener(){
public void actionPerformed(ActionEvent event)
{
fillTable();
}
});
getContentPane().add(addPlayer);
}
// add some items
private void fillTable()
{
tableModel.players.add(new Player("John Doe", 75.50f));
tableModel.fireTableStructureChanged();
}
public static void main (String[] args)
{
SwingUtilities.invokeLater(new Runnable() {
public void run(){
final JFrame frame = new TestTableButton();
frame.pack();
frame.setBounds(200, 300, 500, 500);
frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
frame.setVisible(true);
}
});
}
}
/****** Model ********/
class Player
{
String nickname;
float winRate;
public Player(String nick, float rt)
{nickname = nick; winRate = rt;}
}
/****** Table model ******/
class PlayersTableModel extends AbstractTableModel
{
protected ArrayList<Player> players = new ArrayList<Player>();
private String[] getColNames()
{
return new String[]{"Player", "% Wins", "Challenge"};
}
public int getColumnCount() {
return getColNames().length;
}
public int getRowCount() {
return players.size();
}
public String getColumnName(int col) {
return getColNames()[col];
}
public Class getColumnClass(int c) {
if (c == 2)
return ButtonColumn.class;
return getValueAt(0, c).getClass();
}
public Object getValueAt(int row, int col) {
Player player = players.get(row);
Object val = null;
if (col == 0)
val = player.nickname;
else if(col == 1)
val = new Float(player.winRate);
else
val = "Accept";
return val;
}
public boolean isCellEditable(int row, int col) {
return col == 2;
}
}
import java.awt.*;
import java.awt.event.*;
import javax.swing.*;
import javax.swing.border.*;
import javax.swing.table.*;
public class ButtonColumn extends AbstractCellEditor
implements TableCellRenderer, TableCellEditor, ActionListener, MouseListener
{
private JTable table;
private Action action;
private int mnemonic;
private Border originalBorder;
private Border focusBorder;
private JButton renderButton;
private JButton editButton;
private Object editorValue;
private boolean isButtonColumnEditor;
/**
* Create the ButtonColumn to be used as a renderer and editor. The
* renderer and editor will automatically be installed on the TableColumn
* of the specified column.
*
* @param table the table containing the button renderer/editor
* @param action the Action to be invoked when the button is invoked
* @param column the column to which the button renderer/editor is added
*/
public ButtonColumn(JTable table, Action action, int column)
{
this.table = table;
this.action = action;
renderButton = new JButton();
editButton = new JButton();
editButton.setFocusPainted( false );
editButton.addActionListener( this );
originalBorder = editButton.getBorder();
setFocusBorder( new LineBorder(Color.BLUE) );
TableColumnModel columnModel = table.getColumnModel();
columnModel.getColumn(column).setCellRenderer( this );
columnModel.getColumn(column).setCellEditor( this );
table.addMouseListener( this );
}
/**
* Get foreground color of the button when the cell has focus
*
* @return the foreground color
*/
public Border getFocusBorder()
{
return focusBorder;
}
/**
* The foreground color of the button when the cell has focus
*
* @param focusBorder the foreground color
*/
public void setFocusBorder(Border focusBorder)
{
this.focusBorder = focusBorder;
editButton.setBorder( focusBorder );
}
public int getMnemonic()
{
return mnemonic;
}
/**
* The mnemonic to activate the button when the cell has focus
*
* @param mnemonic the mnemonic
*/
public void setMnemonic(int mnemonic)
{
this.mnemonic = mnemonic;
renderButton.setMnemonic(mnemonic);
editButton.setMnemonic(mnemonic);
}
@Override
public Component getTableCellEditorComponent(
JTable table, Object value, boolean isSelected, int row, int column)
{
System.out.println("value");
if (value == null)
{
editButton.setText( "" );
editButton.setIcon( null );
}
else if (value instanceof Icon)
{
editButton.setText( "" );
editButton.setIcon( (Icon)value );
}
else
{
editButton.setText( value.toString() );
editButton.setIcon( null );
}
this.editorValue = value;
return editButton;
}
@Override
public Object getCellEditorValue()
{
return editorValue;
}
//
// Implement TableCellRenderer interface
//
public Component getTableCellRendererComponent(
JTable table, Object value, boolean isSelected, boolean hasFocus, int row, int column)
{
if (isSelected)
{
renderButton.setForeground(table.getSelectionForeground());
renderButton.setBackground(table.getSelectionBackground());
}
else
{
renderButton.setForeground(table.getForeground());
renderButton.setBackground(UIManager.getColor("Button.background"));
}
if (hasFocus)
{
renderButton.setBorder( focusBorder );
}
else
{
renderButton.setBorder( originalBorder );
}
// renderButton.setText( (value == null) ? "" : value.toString() );
if (value == null)
{
renderButton.setText( "" );
renderButton.setIcon( null );
}
else if (value instanceof Icon)
{
renderButton.setText( "" );
renderButton.setIcon( (Icon)value );
}
else
{
renderButton.setText( value.toString() );
renderButton.setIcon( null );
}
return renderButton;
}
//
// Implement ActionListener interface
//
/*
* The button has been pressed. Stop editing and invoke the custom Action
*/
public void actionPerformed(ActionEvent e)
{
int row = table.convertRowIndexToModel( table.getEditingRow() );
fireEditingStopped();
// Invoke the Action
ActionEvent event = new ActionEvent(
table,
ActionEvent.ACTION_PERFORMED,
"" + row);
action.actionPerformed(event);
}
//
// Implement MouseListener interface
//
/*
* When the mouse is pressed the editor is invoked. If you then then drag
* the mouse to another cell before releasing it, the editor is still
* active. Make sure editing is stopped when the mouse is released.
*/
public void mousePressed(MouseEvent e)
{
if (table.isEditing()
&& table.getCellEditor() == this)
isButtonColumnEditor = true;
}
public void mouseReleased(MouseEvent e)
{
if (isButtonColumnEditor
&& table.isEditing())
table.getCellEditor().stopCellEditing();
isButtonColumnEditor = false;
}
public void mouseClicked(MouseEvent e) {}
public void mouseEntered(MouseEvent e) {}
public void mouseExited(MouseEvent e) {}
}
最佳答案
正如评论中所指出的,我触发了错误的事件。
/* move this to the model */
private void fillTable()
{
tableModel.players.add(new Player("John Doe", 75.50f));
int row = tableModel.players.size() - 1;
tableModel.fireTableRowsInserted(n, n);
}
关于java - JTable TableCellRenderer 不适用于新行,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/18281553/
我有 2 列的 jTable1。我想控制第 1 列的外观,因此我使用以下代码根据单元格行是偶数还是奇数来将单元格中的文本字体设置为粗体或不粗体。 import java.awt.Component;
我能找到的所有自定义示例 TableCellRenderer似乎都在扩展DefaultTableCellRenderer .我想这没什么不妥,除了您无法扩展当前外观的 TableCellRendere
我想实现一个 JTable 组件的 tablecellrenderer,它应该根据单元格数据显示不同的颜色。我明白了,但我无法更改所选单元格的颜色。我试着这样做: public Component g
我有一个包含四列的 JTable。我正在尝试将其中一列的标题居中对齐。我得到了一个半工作的解决方案,但问题是标题的默认呈现/样式似乎丢失了。见截图。我想获取当前的 TableCellRenderer,
我有一个绑定(bind)到 JTable 的 ArrayList。之后 bindingGroup.unbind(); bindingGroup.bind(); (完成刷新数据)我丢失了表格单元格渲
我正在尝试能够为 JTable 中的单独单元格着色,但到目前为止我只能在整个列上应用 TableCellRenderer,这显然会出现故障。我有一个自定义 JTable: public class J
简单的问题,但我似乎无法在网上找到答案。 如何使用自定义 TableCellRenderer 以粗体显示某些表格单元格? 我知道如何使用 TableCellRenderer 逐个单元格设置背景颜色。你
我正在尝试在 JTable 列上设置 JProgressbar 单元格渲染器。问题是,我的表格单元格上不会显示任何进度条,它只显示进度值。 这是我的 TableModel: public class
我正在尝试使用此教程代码将按钮添加到 JTable 的最后一列: http://www.java2s.com/Code/Java/Swing-Components/ButtonTableExample
尝试将 tablecellrenderer 应用于列。我需要三个不同的图标,分别用于文件夹、zip\rar 文件等。 我该如何设置它们? If 子句(if f.isDirectory()) 根本不起作
大家好,我的程序中遇到以下问题。我有几个按列应用的 tablecellrenderer。问题是,如果某列在我的表中出现两次,则单元渲染器将无法工作,并且两列均未格式化。我也无法更改列名称,因为我的客户
我试图进行检查,如果单元格 3 的值不为空,则整行将被着色为绿色,但是这不会执行任何操作,但是,如果我不进行检查,则仅检查以确保没有任何内容已选择(以便选择会给出颜色以表明您确实选择了)所有内容都绘制
给定一个javax.swing.table.TableColumn...是否可以通过某种方式指定用于给定类型的TableCellRenderer/TableCellEditor,而不是让TableCo
我有一个包含三列字符串的表。我希望最后一列具有绿色背景和粗体字体。所以我想我需要一个自定义的 TableCellRenderer。但是,当我调用 table.setDefaultRenderer 时,
我有一个扩展 DefaultTableCellRenderer 的类,它以等宽字体呈现具有特定颜色的字符串。默认情况下,似乎根本不呈现选项卡(0 个空格)。如何设置选项卡大小和/或使它们呈现? 编辑:
我尝试学习 JTables TableCellRenderer,但有些东西我不明白。也许你们中的一个可以帮助我。 请看一下我在网上找到的这个例子: http://www.java2s.com/Tuto
我使用自定义的 DefaultTableCellRenderer 创建了一个简单的 JTable。它本身工作正常(最后一列着色)。但是,一旦我选择一行或过滤/取消过滤它,该行就会被着色,即使它根本不应
我正在尝试在 jtable 上实现自定义 TableCellRenderer。该表设置为 100 行和 100 列。该表应包含指定字体的所有字形。我的问题是,当表中的值不完整时,它会在第一列中放置最后
我正在实现 TableCellRenderer 以在最后一个值是否为特定值时做出明显的区别。 所以,这些实现的代码是: TableColumnModel tcm = table.getColu
我有一个 JTable,我希望能够更改单击的单个单元格的颜色。 这是我的代码的简化版本: public class TableFrame extends JFrame { public Tab
我是一名优秀的程序员,十分优秀!