Java 设置jtable column to image按钮,但动态更改特定行/列上的图像,而不是列中的所有行
我正在努力做到以下几点: 将jtable列中的所有单元格设置为image button1。当另一行/列中的单元格更改为特定值时,图像按钮1只需更改为该行中的图像2。如果删除了行,则需要相应地更新列映像,因为显示的行是从实际的defaulttablemodel中筛选出来的 我做了很多研究,尝试了不同的方法。我是一个java新手,不擅长表格单元格渲染器/编辑器,这就是为什么我遇到这么多麻烦的原因 目前正在发生的是调用了更改按钮的函数,但只有当我单击按钮时,它才会隐藏,而另一个图像甚至不会显示 我的程序执行以下操作: btnRenderer=新按钮nRenderer; btnRenderer.setButtonImagesURLcodebase.toStringJava 设置jtable column to image按钮,但动态更改特定行/列上的图像,而不是列中的所有行,java,swing,jtable,Java,Swing,Jtable,我正在努力做到以下几点: 将jtable列中的所有单元格设置为image button1。当另一行/列中的单元格更改为特定值时,图像按钮1只需更改为该行中的图像2。如果删除了行,则需要相应地更新列映像,因为显示的行是从实际的defaulttablemodel中筛选出来的 我做了很多研究,尝试了不同的方法。我是一个java新手,不擅长表格单元格渲染器/编辑器,这就是为什么我遇到这么多麻烦的原因 目前正在发生的是调用了更改按钮的函数,但只有当我单击按钮时,它才会隐藏,而另一个图像甚至不会显示 我的程
btnEditor = new ButtonEditor(table);
btnEditor.setButtonImagesURL(codebase.toString());
table.getColumnModel().getColumn(5).setCellRenderer(btnRenderer);
table.getColumnModel().getColumn(5).setCellEditor(btnEditor);
在特定的行/列值发生变化时,它调用:
this.btnEditor.changebuttonotcomplete;
因为我不知道如何让桌子听变化,改变按钮
下面是我的渲染器/编辑器类
class ButtonRenderer extends ButtonsPanel implements TableCellRenderer {
private boolean changeIconComplete = false;
ImageIcon imageComplete;
public ButtonRenderer() {
super();
}
@Override
public Component getTableCellRendererComponent(JTable table,
Object value, boolean isSelected, boolean hasFocus, int row, int column) {
setBackground(table.getBackground());
this.setAlignmentX(Component.CENTER_ALIGNMENT);
this.setAlignmentY(Component.CENTER_ALIGNMENT);
setToolTipText("Abort upload");
return this;
}
public void setButtonImagesURL(String codebase)
{
setButtonImages(codebase);
URL imgURL = null;
try {
imgURL = new URL(codebase + "/img/uploadComplete.png");
} catch (MalformedURLException e) {
e.printStackTrace();
}
imageComplete = new ImageIcon(imgURL);
}
}
}我可能误解了你的问题。但似乎更容易依赖表模型呈现器的既定概念,而不是手动跟踪更改和调用更新
尝试管理模型中的状态。设计一个渲染器来检查对象的状态并相应地执行操作。然后,作为模型更改的结果,通知表并重新绘制。渲染器被触发以显示更新的数据。我可能误解了您的问题。但似乎更容易依赖表模型呈现器的既定概念,而不是手动跟踪更改和调用更新
尝试管理模型中的状态。设计一个渲染器来检查对象的状态并相应地执行操作。然后,作为模型更改的结果,通知表并重新绘制。并触发渲染器以显示更新的数据。要更快地获得更好的帮助,请发布一个。要更快地获得更好的帮助,请发布一个。@Andrew Thomson-由于我的代码可能非常不正确,因此在不发布sscce的情况下,我将如何执行以下操作:创建一个包含buttonX的列的jtable。然后,当特定行中的另一列获得某个值时,按钮x将更改为按钮y,但其他行将保持原来的状态。在下面的示例中,所有行都以ButtonX开始,但当进度从上载更改为完成时,ButtonX变为ButtonY。行名称进程中止/完成0文件1完成按钮1文件2完成按钮2文件3上载ButtonX@Andrew汤姆森-没有发布sscce,因为我的代码可能非常不正确,我应该如何做:创建一个包含buttonX的列的jtable。然后,当特定行中的另一列获得某个值时,按钮x将更改为按钮y,但其他行将保持原来的状态。在下面的示例中,所有行都以ButtonX开始,但当进度从上载更改为完成时,ButtonX变为ButtonY。行名称进程中止/完成0文件1完成按钮1文件2完成按钮2文件3上传按钮
public class ButtonEditor extends ButtonsPanel implements TableCellEditor {
Service cloudService;
FileUploader fileUP;
DefaultTableModel model;
int currRow;
int currentlyUploadingRow;
public ButtonEditor(final JTable table) {
super();
MouseListener ml = new MouseAdapter() {
public void mousePressed(MouseEvent e) {
}
};
buttons.get(0).addMouseListener(ml);
buttons.get(0).addActionListener(new ActionListener() {
@Override
public void actionPerformed(ActionEvent e) {
if (currRow == currentlyUploadingRow) {
// Cancel current uploading
fileUP.setCancelled();
cloudService.setCancelled();
} else {
// Set status to abort
if (model.getRowCount() == 0 || currRow == -1)
return;
if (model.getValueAt(currRow, 5).toString().contentEquals("Queued") &&
(Boolean)model.getValueAt(currRow, 7) == false) {
model.setValueAt("Aborted", currRow, 5);
}
}
}
});
addMouseListener(new MouseAdapter() {
@Override
public void mousePressed(MouseEvent e) {
}
});
}
public void setButtonImagesURL(String codebase)
{
setButtonImages(codebase);
createCompletedButton(codebase);
}
public void changeButtonToComplete()
{
changeAbortToComplete();
}
@Override
public Component getTableCellEditorComponent(JTable table, Object value,
boolean isSelected, int row, int column) {
//Get table model equivalent of row
String filename = table.getValueAt(row, 1).toString() + table.getValueAt(row, 0).toString();
this.currRow = getRowIndexByFilename(filename);
this.setBackground(table.getBackground());
return this;
}
private int getRowIndexByFilename(String filename)
{
String name;
for (int row = 0; row < model.getRowCount(); row++) {
name = model.getValueAt(row, 1).toString() + model.getValueAt(row, 0).toString();
if (filename.contentEquals(name) &&
!model.getValueAt(row, 5).toString().contentEquals("Complete") &&
!model.getValueAt(row, 5).toString().contains("Invalid") &&
!model.getValueAt(row, 5).toString().contains("Error") &&
!model.getValueAt(row, 5).toString().contains("Abort"))
return row;
}
return -1;
}
private int getRowIndexByFilenameComplete(String filename)
{
String name;
for (int row = 0; row < model.getRowCount(); row++) {
name = model.getValueAt(row, 1).toString() + model.getValueAt(row, 0).toString();
if (filename.contentEquals(name) &&
model.getValueAt(row, 5).toString().contentEquals("Complete") ||
model.getValueAt(row, 5).toString().contains("Invalid") ||
model.getValueAt(row, 5).toString().contains("Error") ||
model.getValueAt(row, 5).toString().contains("Abort"))
return row;
}
return -1;
}
// @Override
public Object getCellEditorValue() {
return "";
}
@Override
public boolean isCellEditable(java.util.EventObject e) {
return true;
}
}
public class ButtonsPanel extends JPanel {
public final java.util.List<JButton> buttons = Arrays.asList(new JButton(), new JButton());
public final JButton btnComplete = new JButton();
private ImageIcon[] images = new ImageIcon[2];
public ButtonsPanel() {
super();
setOpaque(false);
this.setLayout(new BoxLayout(this, BoxLayout.Y_AXIS));
this.setBorder(new javax.swing.border.EmptyBorder(-5, -5, -5, -5));
}
public void setButtonImages(String codebase)
{
java.util.List<String> imgPaths = Arrays.asList("abortUpload.png", "/img/uploadComplete.png");
URL imgURL = null;
int ii = 0;
for (String path: imgPaths) {
try {
imgURL = new URL(codebase + "/img/" + path);
} catch (MalformedURLException e) {
e.printStackTrace();
}
images[ii] = new ImageIcon(imgURL);
images[ii].setDescription(path);
ii++;
}
ii = 0;
for (JButton b: buttons) {
b.setFocusable(false);
b.setRolloverEnabled(false);
b.setIcon(images[ii]);
b.setBorderPainted(false);
b.setAlignmentX(Component.CENTER_ALIGNMENT);
b.setMargin(new Insets(0,0,0,0));
add(b);
if (ii == 1)
this.getComponent(1).hide();
ii++;
}
}
public void changeAbortToComplete()
{
this.getComponent(0).hide();
this.getComponent(1).show();
}