我是新来的希望你们能帮我。。。
我是java编程的初学者,我想我对这个问题有点不知所措。
我的程序运行得很好,除了一个让我恼火的小细节。我有一个JTable,第一列有一个按钮,可以从表中删除这一行。它工作得很好,除了当我试图删除表的最后一行时,按钮停留在那里,然后表冻结,我无法删除任何行,因为我收到了一个“越界异常”。但是,当我使用命令表时。getRowCount());
在删除该行之前和之后,表格“知道”有一行被删除,但正如我所说,按钮留在那里。缩略图中的截图显示了单击“年”单元格旁边的按钮之前和之后的情况。
很好地补充一点,我是通过表外的按钮在表中添加行的。
这是我的密码:Main。JAVA
static String [] title = {"X","Nom","SRM","Rend.","%","Kg",};
static Object[][] contenu;
static DefaultTableModel model1 = new DefaultTableModel(contenu, title);
static JTable tableauGrains = new JTable(model1);
tableauGrains.getColumn("X").setCellRenderer(new ButtonRenderer());
tableauGrains.getColumn("X").setCellEditor(new ButtonEditor(new JCheckBox()));
纽扣拆卸器。JAVA
import java.awt.Color;
import java.awt.Component;
import javax.swing.JButton;
import javax.swing.JTable;
import javax.swing.table.TableCellRenderer;
public class ButtonRenderer extends JButton implements TableCellRenderer{
public Component getTableCellRendererComponent( JTable table, Object value,
boolean isSelected, boolean isFocus,
int row, int col) {
Color beige = new Color(218, 217, 158);
setBackground(beige);
//On écrit dans le bouton ce que contient la cellule
setText((value != null) ? value.toString() : "");
//on retourne notre bouton
return this;
}
}
按钮ditor.java
import java.awt.Component;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.io.File;
import java.io.IOException;
import javax.swing.DefaultCellEditor;
import javax.swing.ImageIcon;
import javax.swing.JButton;
import javax.swing.JCheckBox;
import javax.swing.JOptionPane;
import javax.swing.JTable;
import javax.swing.table.DefaultTableModel;
public class ButtonEditor extends DefaultCellEditor {
protected JButton button;
private DeleteButtonListener bListener = new DeleteButtonListener();
/**
* Constructeur avec une checkBox
* @param checkBox
* @param count
*/
@SuppressWarnings("deprecation")
public ButtonEditor(JCheckBox checkBox) {
//Par défaut, ce type d'objet travaille avec un JCheckBox
super(checkBox);
//On crée à nouveau notre bouton
button = new JButton();
button.setOpaque(true);
//On lui attribue un listener
button.addActionListener(bListener);
}
public Component getTableCellEditorComponent(JTable table, Object value, boolean isSelected, int row, int column) {
//On précise le numéro de ligne à notre listener
bListener.setRow(row);
//Idem pour le numéro de colonne
//On passe aussi le tableau en paramètre pour des actions potentielles
bListener.setTable(table);
//On réaffecte le libelle au bouton
button.setText( (value == null) ? "" : value.toString() );
//On renvoie le bouton
return button;
}
class DeleteButtonListener implements ActionListener {
private int row;
private JTable table;
public void setRow(int row){this.row = row;}
public void setTable(JTable table){this.table = table;}
public void actionPerformed(ActionEvent event) {
if(table.getRowCount() > 0){
//On affiche un message
System.out.println("coucou du bouton: "+ ((JButton)event.getSource()).getText() );
((DefaultTableModel)table.getModel()).removeRow(this.row);
((DefaultTableModel)table.getModel()).fireTableDataChanged();
}
}
}
}
我对法语的评论感到抱歉,这是我的母语。
在删除最后一行之后,JTable似乎没有“刷新”自己。
我不在我的圈子里了?
非常感谢,很抱歉发了这么长的帖子,我尽量给你提供更多信息。
Djosimd编辑:
删除第12行后尝试单击第11行后的豁免堆:
java线程“AWT-EventQueue-0”中出现异常。lang.ArrayIndexOutofBounds异常:11
SSCCE:
import java.awt.*;
import java.awt.event.*;
import javax.swing.table.*;
import javax.swing.*;
public class FooGui {
static String[] title = { "X", "Nom", "SRM", "Rend.", "%", "Kg"};
static Object[][] contenu;
// !! static DefaultTableModel model1 = new DefaultTableModel(contenu, title);
static DefaultTableModel model1 = new DefaultTableModel(title, 0);
static JTable tableauGrains = new JTable(model1);
public static void main(String[] args) {
tableauGrains.getColumn("X").setCellRenderer(new ButtonRenderer());
tableauGrains.getColumn("X").setCellEditor(new ButtonEditor(new JCheckBox()));
for (int i = 0; i < 10; i++) {
String btnText = "Btn " + (i + 1);
Object[] rowData = {btnText, "", "", "", "", ""};
model1.addRow(rowData);
}
JOptionPane.showMessageDialog(null, new JScrollPane(tableauGrains));
}
}
class ButtonRenderer extends JButton implements TableCellRenderer {
public Component getTableCellRendererComponent(JTable table, Object value, boolean isSelected, boolean isFocus, int row, int col) {
Color beige = new Color(218, 217, 158);
setBackground(beige);
setText((value != null) ? value.toString() : "");
return this;
}
}
class ButtonEditor extends DefaultCellEditor {
protected JButton button;
private DeleteButtonListener bListener = new DeleteButtonListener();
public ButtonEditor(JCheckBox checkBox) {
super(checkBox);
button = new JButton();
button.setOpaque(true);
button.addActionListener(bListener);
}
public Component getTableCellEditorComponent(JTable table, Object value, boolean isSelected, int row, int column) {
System.out.printf("row is: %d%n", row);
bListener.setRow(row);
bListener.setTable(table);
// On réaffecte le libelle au bouton
button.setText((value == null) ? "" : value.toString());
// On renvoie le bouton
return button;
}
class DeleteButtonListener implements ActionListener {
private int row;
private JTable table;
public void setRow(int row) {
this.row = row;
}
public void setTable(JTable table) {
this.table = table;
}
public void actionPerformed(ActionEvent event) {
if (table.getRowCount() > 0) {
System.out.println("coucou du bouton: " + ((JButton) event.getSource()).getText());
((DefaultTableModel) table.getModel()).removeRow(this.row);
stopCellEditing(); // !! not sure if this will help or not.
//!! ((DefaultTableModel) table.getModel()).fireTableDataChanged();
}
}
}
}
尽管这不会解决您的问题,但不要调用fireTableDataChanged,这是TableModel的工作。
问题出在TableEditor的某个地方。我猜是你,不停止编辑手机。
查看表格按钮列。它为您实现了渲染器/编辑器。您所需要做的就是在单击按钮时提供一个要调用的操作。
正如camickr所提到的,删除行时忘记停止单元格编辑,从而可以继续“编辑”单元格,并触发对不再存在的行的另一次删除(因此出现索引越界异常)
只需取消最后按钮的编辑即可。正如camickr所提到的,无需fireTableDataChanged()
,removeRow()
就能解决这个问题。
请参见SSCCE(实际上并不短,但我懒得修剪一些线条)的演示:
import java.awt.Color;
import java.awt.Component;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import javax.swing.DefaultCellEditor;
import javax.swing.JButton;
import javax.swing.JCheckBox;
import javax.swing.JFrame;
import javax.swing.JScrollPane;
import javax.swing.JTable;
import javax.swing.SwingUtilities;
import javax.swing.table.DefaultTableModel;
import javax.swing.table.TableCellRenderer;
public class TestJTable {
public class ButtonEditor extends DefaultCellEditor {
protected JButton button;
private final DeleteButtonListener bListener = new DeleteButtonListener();
/**
* Constructeur avec une checkBox
*
* @param checkBox
* @param count
*/
@SuppressWarnings("deprecation")
public ButtonEditor(JCheckBox checkBox) {
// Par défaut, ce type d'objet travaille avec un JCheckBox
super(checkBox);
// On crée à nouveau notre bouton
button = new JButton();
button.setOpaque(true);
// On lui attribue un listener
button.addActionListener(bListener);
}
@Override
public Component getTableCellEditorComponent(JTable table,
Object value, boolean isSelected, int row, int column) {
// On précise le numéro de ligne à notre listener
bListener.setRow(row);
// Idem pour le numéro de colonne
// On passe aussi le tableau en paramètre pour des actions
// potentielles
bListener.setTable(table);
// On réaffecte le libelle au bouton
button.setText(value == null ? "" : value.toString());
// On renvoie le bouton
return button;
}
class DeleteButtonListener implements ActionListener {
private int row;
private JTable table;
public void setRow(int row) {
this.row = row;
}
public void setTable(JTable table) {
this.table = table;
}
@Override
public void actionPerformed(ActionEvent event) {
if (table.getRowCount() > 0) {
// On affiche un message
System.out.println("coucou du bouton: "
+ ((JButton) event.getSource()).getText());
((DefaultTableModel) table.getModel()).removeRow(this.row);
ButtonEditor.this.cancelCellEditing();
}
}
}
}
private static final String[] title = { "X", "Nom", "SRM", "Rend.", "%",
"Kg", };
public static void main(String[] args) {
SwingUtilities.invokeLater(new Runnable() {
@Override
public void run() {
new TestJTable().initUI();
}
});
}
protected void initUI() {
JFrame frame = new JFrame();
frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
DefaultTableModel model = new DefaultTableModel(title, 4);
JTable table = new JTable(model);
table.getColumn("X").setCellEditor(new ButtonEditor(new JCheckBox()));
table.getColumn("X").setCellRenderer(new ButtonRenderer());
frame.add(new JScrollPane(table));
frame.pack();
frame.setVisible(true);
}
public static class ButtonRenderer extends JButton implements
TableCellRenderer {
private static final Color beige = new Color(218, 217, 158);
@Override
public Component getTableCellRendererComponent(JTable table,
Object value, boolean isSelected, boolean isFocus, int row,
int col) {
setBackground(beige);
// On écrit dans le bouton ce que contient la cellule
setText(value != null ? value.toString() : "");
// on retourne notre bouton
return this;
}
}
}
我正在使用AbstractTableModel,并试图从JTable中删除所选行。 我能够从表中选择特定的行;但当我单击delete按钮时,所选行变为空(即所选行中的所有数据变为空),最后一行将从JTable中删除。 我认为可能是fireTableRowsDeleted()不起作用。请在这方面帮助我。我已经搜索了stackoverflow,但找不到解决方案。 请在下面找到我的代码。 //删除按钮侦
我有一个框架,里面有一张桌子和两个按钮。 1) 重复行2)删除行 表a在第三列中的组合 我有一个场景,我复制空白行并点击最后一排的组合框来选择该行,然后单击删除行按钮…然后在删除后,每当我尝试单击任何单元格时,它都会给我以下错误。 下面是相关框架的源代码。
我正在尝试更新JTable(或data?)的行在我对一行执行删除操作后,当选择另一行时,可以编辑所选行。当前删除该行将使已删除行下方的行上移,但如果选择了该行号并尝试进行编辑,则会返回(JOptionPane),就像未选择任何内容一样。它似乎没有“刷新”数据(?)。 这是一个SCCE,希望有人可以运行它并指出问题。我试着尽可能地缩小它,以便于复制/粘贴: 我在这里看到这个问题的各种形式都有一些不同
我正在用java创建一个没有数据库的库系统程序。(直接使用文件)。 我在删除jtable中的一行时遇到了一个奇怪的问题(也就是从文件中删除)。 有时当我在表格中选择一行并单击删除按钮时,不止一行被删除了! 大多数时候它也能正常工作!! 我的代码: 我的模型类: 用户信息类别: 我的文本文件:
问题内容: 我试图弄清楚如何禁止在stdout上显示用户输入。 后跟任何打印语句将保留用户键入的内容。不会显示用户键入的内容,但会保留“ Password:”提示。 为了解决这个问题,我只想删除最后一行(这也会从行尾删除换行符)。 问题答案: 您可能可以使用VT100控制代码执行所需的操作。 可能是这样的:
问题内容: 当您必须遍历一个集合并用分隔符分隔每个数据的字符串时,总是总是在末尾有一个额外的分隔符,例如 给出类似以下内容: serverId_1,serverId_2,serverId_3, 我想删除StringBuilder中的最后一个字符(不进行转换,因为在此循环之后我仍然需要它)。 问题答案: 其他人指出了该方法,但这是另一种替代方法: 或者,使用Guava中的类:) 从Java 8开始,