【问题标题】:Mass produce JTables量产 JTables
【发布时间】:2023-03-21 23:04:01
【问题描述】:

我想制作 25 个 JTable。我通过执行以下操作生成表名:

for(int i=0; i < 26; i++)
{
    TableNames[i] = "Table" + i + "";
    ...

如何将数组中的这些字符串名称用作新的 JTable 名称?即

TableNames[i] = new JTable(model){ ...

【问题讨论】:

  • 你的意思是Table[i] = new JTable(model){ ...

标签: java swing jtable names tablemodel


【解决方案1】:

考虑使用List&lt;JTable&gt;List&lt;TableModel&gt;,而不是数组。将名称传递给表的构造函数或工厂方法。下面的示例使用Component 的名称,但JComponent 的客户端属性可能更通用。

更新:下面修改后的 Java 8 示例说明了如何动态添加新表。

import java.awt.BorderLayout;
import java.awt.EventQueue;
import java.awt.GridLayout;
import java.awt.event.ActionEvent;
import java.util.ArrayList;
import java.util.List;
import javax.swing.AbstractAction;
import javax.swing.JButton;
import javax.swing.JFrame;
import javax.swing.JPanel;
import javax.swing.JScrollBar;
import javax.swing.JScrollPane;
import javax.swing.JTable;
import javax.swing.event.ListSelectionEvent;
import javax.swing.table.DefaultTableModel;

/**
 * @see http://stackoverflow.com/a/10623134/230513
 */
public class NamedTableTest extends JPanel {

    private static final int N = 25;
    private final List<JTable> list = new ArrayList<>();

    public NamedTableTest() {
        super(new GridLayout(0, 1));
        for (int i = 0; i < N; i++) {
            list.add(new NamedTable("Table " + String.valueOf(i)));
            this.add(list.get(i));
        }
    }

    private static class NamedTable extends JTable {

        public NamedTable(final String name) {
            super(new DefaultTableModel(1, 1) {

                @Override
                public Object getValueAt(int row, int col) {
                    return name + ", " + row + ", " + col;
                }
            });
            this.setName(name);
        }

        @Override
        public void valueChanged(ListSelectionEvent e) {
            if (!e.getValueIsAdjusting()) {
                System.out.println(NamedTable.this.getName());
            }
        }
    }

    private void display() {
        JFrame f = new JFrame("NamedTable");
        f.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        final JScrollPane jsp = new JScrollPane(this);
        f.add(jsp);
        f.add(new JButton(new AbstractAction("Add") {

            @Override
            public void actionPerformed(ActionEvent e) {
                list.add(new NamedTable("Table " + String.valueOf(list.size())));
                NamedTableTest.this.add(list.get(list.size() - 1));
                NamedTableTest.this.validate();
                EventQueue.invokeLater(new Runnable() {

                    @Override
                    public void run() {
                        JScrollBar sb = jsp.getVerticalScrollBar();
                        sb.setValue(sb.getMaximum());
                    }
                });
            }
        }), BorderLayout.SOUTH);
        f.pack();
        f.setLocationRelativeTo(null);
        f.setVisible(true);
    }

    public static void main(String[] args) {
        EventQueue.invokeLater(() -> {
            new NamedTableTest().display();
        });
    }
}

【讨论】:

  • 我不打算使用列表。我只需要 25 个不同的 JTable,编号为 0-25。显然我可以单独制作它们,但这很乏味。有了一组生成的名称,难道没有更简单的方法来循环创建表吗?
  • 该示例创建了 25 个不同的 JTable 实例,编号为 0-24;每个都添加到 List&lt;JTable&gt;JPanel
【解决方案2】:
TableNames[i] = new JTable(model)

放入for循环 我同意以前的说法犯错误 试试这个

for(i=0;i<TableNames.length();i++)
{
new JTable(TableName[i]);
}

【讨论】:

  • 如果你把它放在循环中,你会得到一个不兼容的类型错误。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2013-05-17
  • 1970-01-01
  • 1970-01-01
  • 2016-08-25
  • 2013-02-09
  • 2018-03-02
  • 1970-01-01
相关资源
最近更新 更多