【问题标题】:Name Columns in a JTable命名 JTable 中的列
【发布时间】:2011-11-21 17:45:46
【问题描述】:

我正在为一家小商店开发一个程序。当我单击“报告”按钮时,它必须显示一个表格,如下所示:

列名“A”、“B”...“N”,必须是员工的姓名。但我不知道怎么做。 这是我的代码:

public void Inform()
{
    String[] employee;
    String[] product[];
    this.setLayout(null);

    Inform=new JTable(nulo, employee.length);

     model = new DefaultTableModel() {

            private static final long serialVersionUID = 1L;

            @Override
            public int getColumnCount() {
                return 1;
            }

            @Override
            public boolean isCellEditable(int row, int col) {
                return false;
            }

            @Override
            public int getRowCount() {
                return Inform.getRowCount();
            }
        };

        headerTable = new JTable(model);

       for (int i = 0; i < Inform.getRowCount(); i++) 
            headerTable.setValueAt(product[i], i, 0);


        headerTable.setShowGrid(false);
        headerTable.setAutoResizeMode(JTable.AUTO_RESIZE_OFF);
        headerTable.setPreferredScrollableViewportSize(new Dimension(50, 0));
        headerTable.getColumnModel().getColumn(0).setPreferredWidth(50);

        scrollPane = new JScrollPane(Inform);
        scrollPane.setRowHeaderView(headerTable);
        scrollPane.setBounds(5,5,500,500);
        scrollPane.setEnabled(false);
        this.add(scrollPane);


}

员工和产品因输入的数量而异。 nulo 是准备销售的产品数量。

【问题讨论】:

  • 请学习java命名约定并遵守它们

标签: java swing jtable jframe


【解决方案1】:

您应该在 TableModel 中添加getColumnName()

String[] employee = {"Employee 1", "Employee 2"};

@Override
public String getColumnName(int index) {
    return employee[index];
}

在你的情况下,这可能是:

model = new DefaultTableModel() {

    private static final long serialVersionUID = 1L;
    String[] employee = {"Employee 1", "Employee 2"};

    @Override
    public int getColumnCount() {
         return employee.length;
    }

    @Override
    public boolean isCellEditable(int row, int col) {
         return false;
    }

    @Override
    public int getRowCount() {
         return Inform.getRowCount();
    }

    @Override
    public String getColumnName(int index) {
        return employee[index];
    }
};

这是一个完整的示例:

import javax.swing.JFrame; 
import javax.swing.JScrollPane; 
import javax.swing.JTable; 
import javax.swing.table.DefaultTableModel; 

public class TableNamesTest extends JFrame { 

    public TableNamesTest() { 
        DefaultTableModel model = new DefaultTableModel() { 
            String[] employee = {"emp 1", "emp 2"}; 

            @Override 
            public int getColumnCount() { 
                return employee.length; 
            } 

            @Override 
            public String getColumnName(int index) { 
                return employee[index]; 
            } 
        }; 

        JTable table = new JTable(model); 
        add(new JScrollPane(table)); 
        pack(); 
        setDefaultCloseOperation(EXIT_ON_CLOSE); 
        setVisible(true); 
    } 

    public static void main(String[] args) { 
        new TableNamesTest(); 
    } 
}

【讨论】:

  • 但是我怎样才能改变索引呢?
  • @aerojun:你是什么意思?您无需调用getColumnName(),它由JTable 自动调用,并使用getColumnCount() 来查看表中有多少列。
  • public int getColumnName(int index) { return employee[index];类型不匹配:无法从 String 转换为 int
  • @aerojun:是的,getColumnName 应该返回一个String 我已经更新了我的答案。您应该在 IDE 中使用 @Overrides 来查看此类错误。
  • public int getColumnCount() { return employee.length; } 抛出空指针异常
【解决方案2】:

这是来自 oracle 网站的示例,您可以将所需的列名称加载到数组中,然后将数组传递给 JTable

String[] columnNames = {"First Name",
                        "Last Name",
                        "Sport",
                        "# of Years",
                        "Vegetarian"};

//Then the Table is constructed using these data and columnNames:

JTable table = new JTable(data, columnNames);

生成的表格如下所示:

JTables 教程链接:http://docs.oracle.com/javase/tutorial/uiswing/components/table.html#data

【讨论】:

  • 谢谢,但这不是我要找的型号。我想要它像我上面显示的图像。
  • @aerojun 这是一个如何添加列名的示例,图片只是为了向您展示正确添加的列名
【解决方案3】:

试试这个:

import javax.swing.JFrame;
import javax.swing.JTable;
import javax.swing.JScrollPane;
import javax.swing.SwingConstants;
import javax.swing.table.DefaultTableCellRenderer;
import javax.swing.table.TableColumn;


public class Class1 extends JFrame{

static JTable table;    
static String[] Employees = {"Employee1","Employee2","Employee3","Employee4"};

static int NumberOfRows=4;
static int NumberOfColumns=4;




public static void main(String[] args){

table = new JTable(NumberOfRows,NumberOfColumns);

for(int i=0;i<Employees.length;i++){

TableColumn tc = table.getColumnModel().getColumn(i);
tc.setHeaderValue(Employees[i]);

DefaultTableCellRenderer dtcr = new DefaultTableCellRenderer();
dtcr.setHorizontalAlignment(SwingConstants.CENTER); //For Aligning the Elements of all columns to CENTER
tc.setCellRenderer(dtcr);
}


JFrame frame = new JFrame();
frame.add(new JScrollPane(table));
frame.setSize(300,300);
frame.setVisible(true);



}    

}`

【讨论】:

  • 请您解释一下您的代码好吗?仅代码的答案通常不被接受,因为它们不会留住那些发现它们的人。
  • @WaiHaLee,我认为他指的是这种方法:stackoverflow.com/a/17655044/4828060
【解决方案4】:

这更像是一种手动方法,但它对我有用。

    JTabel TABLE = new JTable();
    JTableHeader HEADER = TABLE.getTableHeader();
    TableColumnModel TMC = HEADER.getColumnModel();
    TableColumn TC = TMC.getColumn(0);
    TC.setHeaderValue("Person 1");
    TableColumn TC1 = TMC.getColumn(1);
    TC1.setHeaderValue("Person 2");
    HEADER.repaint();
    TABLE.getTableHeader().repaint();

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-10-22
    • 1970-01-01
    • 2014-01-10
    • 2012-11-08
    • 2015-10-31
    相关资源
    最近更新 更多