【问题标题】:java - how to get object inside cell in jtable [duplicate]java - 如何在jtable中获取单元格内的对象[重复]
【发布时间】:2012-03-23 10:36:03
【问题描述】:

可能重复:
Adding multiple JProgressBar to TableColumn of JTable

我有一个jTable 和一个DefaultTableModel 和这个coloumn:

String String JProgressBar

每一行都是这样创建的:

progress.add(getProgress(x, total));
d.addRow(new Object[]{category, "Initializing..", progress.get(work)});

getProgress 在哪里:

private JProgressBar getProgress(int x, int total) {
        JProgressBar progressCsv = new JProgressBar();
        progressCsv.setMaximum(totale);
        progressCsv.setStringPainted(true);
        progressCsv.setString("0%");
        return progressCsv;
}

还有进展:

progress = new ArrayList<JProgressBar>();

我的班级实现了 TableCellRenderer 所以

@Override
    public Component getTableCellRendererComponent(JTable jtable, Object o, boolean bln, boolean bln1, int i, int i1) {
        int v = Integer.parseInt(o.toString());
        JProgressBar b = (JProgressBar) jtable.getModel().getValueAt(i, i1);
        b.setValue(v);
        return null;
    }

其中ii1 是 0 - 2。所以第一行和第三列 ( JProgressBar )。

开启: JProgressBar b = (JProgressBar) jtable.getModel().getValueAt(i, i1); 我明白了

Exception in thread "AWT-EventQueue-0" java.lang.ClassCastException: java.lang.Integer cannot be cast to javax.swing.JProgressBar

问题出在哪里?你能帮帮我吗?

【问题讨论】:

  • -1 如果您仍然打算坚持自己的错误,为什么还要一遍又一遍地问同一个问题?最后一次:做。不是。添加。成分。到。您的。模型!

标签: java swing jtable jprogressbar tablecellrenderer


【解决方案1】:
JProgressBar b = (JProgressBar) jtable.getModel().getValueAt(i, i1);

这是导致此错误的行。您想将整数转换为进度条,这当然是不可能的。这段代码在很多方面都毫无意义。 首先,失去 getProgress(int x, int total) 方法。如果你想在你的 jtable 中有一个进度条,你可以通过使用自定义单元格渲染器做到这一点,但你不需要实际向表中添加进度条。相反,您使用整数。 然后,在您的单元格渲染器中,您使用该整数来显示进度条。 你的渲染器看起来更像这样:

class ProgressBarRenderer extends JProgressBar implements TableCellRenderer {

        public ProgressBarRenderer() {
            setBorder(BorderFactory.createEmptyBorder(1, 1, 1, 1));
            setOpaque(true);
        }

        @Override
        public Component getTableCellRendererComponent(JTable table, Object value, boolean isSelected, boolean hasFocus, int row, int column) {
            int progress = (Integer) value;
            setValue(progress);
            return this;
        }
    }

【讨论】:

  • 所以你告诉我,我不必手动添加进度条,而是将新的 ProgressBarRenderer 设置为我的 jtable 列,进度条是在方法 getTableCellRendererComponent 上自动设置的?如果我需要添加同一行的其他coloum?我以这种方式添加行 d.addRow(new Object[]{Html.categoria, "Inizio scansione", new JProgressBar()});
  • 是的,我是,但是怎么样:"d.addRow(new Object[]{Html.categoria, "Inizio scansione", new JProgressBar()});"不手动添加进度条?就像我在帖子中所说的那样,您使用的整数如下: d.addRow(new Object[]{Html.categoria, "Inizio scansione", 0});渲染器负责其余的工作,将渲染器进度条的值设置为 0 或任何其他值。
【解决方案2】:

如果你使用 ArrayList 你可以:

public Component getTableCellRendererComponent(JTable jtable, Object o, boolean bln, boolean bln1, int i, int i1) {
        int v = Integer.parseInt(o.toString());
        JProgressBar b = progress.get(i);
        b.setValue(v);
        return b;
    }

【讨论】:

  • -1 - a) 这不是渲染器的实现方式(访问一些外部列表以每次返回一个新的渲染组件),而是使用一个渲染器组件并使用给定的数据配置它通过参数 b) 如果对表进行排序或过滤,则查找将中断
  • 这是唯一有效的方法.. 没有人告诉我为什么它需要 0 否则我的进度条
猜你喜欢
  • 2018-06-26
  • 2016-05-02
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-07-03
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多