jtable的列名为什么显示不出来了

时间:2021-04-18 08:49:27
我的界面上有一个JButton,点击它就将数据显示到JTable上,现在数据能够显示上去,就是没有列名,为什么呀?高手们帮助看看,3Q


private JTable getTable() {
if (table == null) {
table = new JTable();
DefaultTableModel dft = new MyTable();
dft.addColumn("ID");
dft.addColumn("性别");
dft.addColumn("日期");
table.setModel(dft);
table.setDefaultEditor(SexEnum.class, new DefaultCellEditor(new JComboBox(SexEnum.values())));
table.setDefaultRenderer(SexEnum.class, new DefaultTableCellRenderer());
table.setRowHeight(20);
table.getTableHeader().setReorderingAllowed(false);
table.setSelectionMode(ListSelectionModel.SINGLE_SELECTION);
}
return table;
}

class MyTable extends DefaultTableModel
{
private static final long serialVersionUID = 1L;

public Class<?> getColumnClass(int columnIndex)
{
if(columnIndex == 1)
return SexEnum.class;
else
return Object.class;
}

public boolean isCellEditable(int row, int column) 
{
return column == 1;
    }
}
Object[] rowData = new Object[]{"1","男","2001-09-09"};
private JButton getBtnShow() 
{
if (btnShow == null) 
{
btnShow = new JButton("show");
btnShow.addActionListener(new ActionListener() 
{
public void actionPerformed(ActionEvent e) 
{
DefaultTableModel dft = (DefaultTableModel) getTable().getModel();
dft.addRow(rowData);
dft.addRow(rowData);
dft.addRow(rowData);
}
});
btnShow.setBounds(37, 25, 93, 23);
}
return btnShow;
}


10 个解决方案

#1


你把代码全部贴出来看看吧,贴这一段很蛋疼

#2


想要显示表头,需要放到jscrollpane里

#3


public void init(){
JTable t = new JTable();

Vector<Object> header = new Vector<Object>() ; //标题
Vector<Vector<Object>> table = new Vector<Vector<Object>>();//表格内容
Vector<Object> content = new Vector<Object>();//每一条的内容
header.addElement("id");
header.addElement("性别");
header.addElement("日期");
table.addElement(content) ;
DefaultTableModel det = new DefaultTableModel(header , table);
。。。。。。。。。。。。。。。
}

#4




public class JTableAddJComboBox extends JFrame
{
private static final long serialVersionUID = 1L;
private JPanel contentPane;
private JScrollPane scrollPane;
private JTable table;
private JButton btnShow;
public static void main(String[] args)
{
EventQueue.invokeLater(new Runnable()
{
public void run()
{
try
{
JTableAddJComboBox frame = new JTableAddJComboBox();
frame.setVisible(true);
} catch (Exception e)
{
e.printStackTrace();
}
}
});
}

/**
 * Create the frame.
 */
public JTableAddJComboBox()
{
initialize();
}
private void initialize() {
setTitle("table contain comboBox");
setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
setBounds(100, 100, 450, 300);
contentPane = new JPanel();
contentPane.setBorder(new EmptyBorder(5, 5, 5, 5));
setContentPane(contentPane);
contentPane.setLayout(null);
contentPane.add(getScrollPane());
contentPane.add(getBtnShow());
}

private JScrollPane getScrollPane() {
if (scrollPane == null) {
scrollPane = new JScrollPane();
scrollPane.setBounds(57, 72, 288, 180);
scrollPane.setColumnHeaderView(getTable());
}
return scrollPane;
}
private JTable getTable() {
if (table == null) {
table = new JTable();
DefaultTableModel dft = new MyTable();
dft.addColumn("ID");
dft.addColumn("性别");
dft.addColumn("日期");
table.setModel(dft);
table.setDefaultEditor(SexEnum.class, new DefaultCellEditor(new JComboBox(SexEnum.values())));
table.setDefaultRenderer(SexEnum.class, new DefaultTableCellRenderer());
table.setRowHeight(20);
table.getTableHeader().setReorderingAllowed(false);
table.setSelectionMode(ListSelectionModel.SINGLE_SELECTION);
}
return table;
}

class MyTable extends DefaultTableModel
{
private static final long serialVersionUID = 1L;

public Class<?> getColumnClass(int columnIndex)
{
if(columnIndex == 1)
return SexEnum.class;
else
return Object.class;
}

public boolean isCellEditable(int row, int column) 
{
return column == 1;
    }
}
Object[] rowData = new Object[]{"1","男","2001-09-09"};
private JButton getBtnShow() 
{
if (btnShow == null) 
{
btnShow = new JButton("show");
btnShow.addActionListener(new ActionListener() 
{
public void actionPerformed(ActionEvent e) 
{
DefaultTableModel dft = (DefaultTableModel) getTable().getModel();
dft.addRow(rowData);
dft.addRow(rowData);
dft.addRow(rowData);
}
});
btnShow.setBounds(37, 25, 93, 23);
}
return btnShow;
}
}

#5


这是全部代码,现在不但不显示列名,而且scrollPane不管用,数据过多时,不会出现滚动条

#6


引用 2 楼 huntor 的回复:
想要显示表头,需要放到jscrollpane里

正解

#7


SexEnum的代码没有贴出来

#8


我把SexEnum的部分给注解掉了,下面这个JTable是正常的,能正常滚动而且有表头,只是show按钮是添加三行数据的逻辑
你原来写的代码整体设计和逻辑有问题,导致了表头没有出来,你研究下给你的代码就行了

import javax.swing.*;
import javax.swing.border.EmptyBorder;
import javax.swing.table.*;
import java.awt.*;
import java.awt.event.*;

public class JTableAddJComboBox extends JFrame
{
    private static final long serialVersionUID = 1L;
    private Container contentPane;
    private JScrollPane scrollPane;
    private JTable table;
    private JButton btnShow;
    
    public static void main(String[] args)
    {
        EventQueue.invokeLater(new Runnable()
        {
            public void run()
            {
                try
                {
                    JTableAddJComboBox frame = new JTableAddJComboBox();
                    frame.setVisible(true);
                } catch (Exception e)
                {
                    e.printStackTrace();
                }
            }
        });
    }

    /**
     * Create the frame.
     */
    public JTableAddJComboBox()
    {
        initialize();
    }
    private void initialize() {
        setTitle("table contain comboBox");
        setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        setBounds(100, 100, 450, 300);
//        contentPane = new JPanel();
        contentPane = this.getContentPane();
//        contentPane.setBorder(new EmptyBorder(5, 5, 5, 5));
//        setContentPane(contentPane);
        contentPane.setLayout(null);
        contentPane.add(getScrollPane());
        contentPane.add(getBtnShow());
    }

    private JScrollPane getScrollPane() {
        DefaultTableModel dft = (DefaultTableModel) getTable().getModel();
        dft.addRow(rowData);
        dft.addRow(rowData);
        dft.addRow(rowData);
        
        if (scrollPane == null) {
            scrollPane = new JScrollPane(table);
            scrollPane.setBounds(57, 72, 288, 180);
        }
        return scrollPane;
    }
    private JTable getTable() {
        if (table == null) {
            table = new JTable();
            DefaultTableModel dft = new MyTable();
            dft.addColumn("ID");
            dft.addColumn("性别");
            dft.addColumn("日期");
            table.setModel(dft);
//            table.setDefaultEditor(SexEnum.class, new DefaultCellEditor(new JComboBox(SexEnum.values())));
//            table.setDefaultRenderer(SexEnum.class, new DefaultTableCellRenderer());
            table.setRowHeight(20);
            table.getTableHeader().setReorderingAllowed(false);
            table.setSelectionMode(ListSelectionModel.SINGLE_SELECTION);
        }
        return table;
    }

    class MyTable extends DefaultTableModel
    {
        private static final long serialVersionUID = 1L;

        public Class<?> getColumnClass(int columnIndex)
        {
            if(columnIndex == 1)
//                return SexEnum.class;
                  return String.class;
            else
                return Object.class;
        }

        public boolean isCellEditable(int row, int column)
        {
            return column == 1;
        }
    }
    Object[] rowData = new Object[]{"1","男","2001-09-09"};
    
    private JButton getBtnShow()
    {
        if (btnShow == null)
        {
            btnShow = new JButton("show");
            btnShow.addActionListener(new ActionListener()
            {
                public void actionPerformed(ActionEvent e)
                {
                    DefaultTableModel dft = (DefaultTableModel) getTable().getModel();
                    dft.addRow(rowData);
                    dft.addRow(rowData);
                    dft.addRow(rowData);

                }
            });
            btnShow.setBounds(37, 25, 93, 23);
        }
        return btnShow;
    }
}

#9


SexEnum 就是一个enum类,里面包括两个值“男、女”完了


public enum SexEnum
{
男,女;
}

用这个类就是想让jtable里某列能显示下拉列表

#10


1、scrollPane.setColumnHeaderView(getTable());//这样写会使table没有表头,所以是错误的。
2、scrollPane.setViewportView(getTable());
1是我之前写的,应该是2这种写法,我是通过直接拖拽过去的,怎么会出现1那种情况了呢,具体还是eclipse的问题,有待研究,谢谢各位了!

#1


你把代码全部贴出来看看吧,贴这一段很蛋疼

#2


想要显示表头,需要放到jscrollpane里

#3


public void init(){
JTable t = new JTable();

Vector<Object> header = new Vector<Object>() ; //标题
Vector<Vector<Object>> table = new Vector<Vector<Object>>();//表格内容
Vector<Object> content = new Vector<Object>();//每一条的内容
header.addElement("id");
header.addElement("性别");
header.addElement("日期");
table.addElement(content) ;
DefaultTableModel det = new DefaultTableModel(header , table);
。。。。。。。。。。。。。。。
}

#4




public class JTableAddJComboBox extends JFrame
{
private static final long serialVersionUID = 1L;
private JPanel contentPane;
private JScrollPane scrollPane;
private JTable table;
private JButton btnShow;
public static void main(String[] args)
{
EventQueue.invokeLater(new Runnable()
{
public void run()
{
try
{
JTableAddJComboBox frame = new JTableAddJComboBox();
frame.setVisible(true);
} catch (Exception e)
{
e.printStackTrace();
}
}
});
}

/**
 * Create the frame.
 */
public JTableAddJComboBox()
{
initialize();
}
private void initialize() {
setTitle("table contain comboBox");
setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
setBounds(100, 100, 450, 300);
contentPane = new JPanel();
contentPane.setBorder(new EmptyBorder(5, 5, 5, 5));
setContentPane(contentPane);
contentPane.setLayout(null);
contentPane.add(getScrollPane());
contentPane.add(getBtnShow());
}

private JScrollPane getScrollPane() {
if (scrollPane == null) {
scrollPane = new JScrollPane();
scrollPane.setBounds(57, 72, 288, 180);
scrollPane.setColumnHeaderView(getTable());
}
return scrollPane;
}
private JTable getTable() {
if (table == null) {
table = new JTable();
DefaultTableModel dft = new MyTable();
dft.addColumn("ID");
dft.addColumn("性别");
dft.addColumn("日期");
table.setModel(dft);
table.setDefaultEditor(SexEnum.class, new DefaultCellEditor(new JComboBox(SexEnum.values())));
table.setDefaultRenderer(SexEnum.class, new DefaultTableCellRenderer());
table.setRowHeight(20);
table.getTableHeader().setReorderingAllowed(false);
table.setSelectionMode(ListSelectionModel.SINGLE_SELECTION);
}
return table;
}

class MyTable extends DefaultTableModel
{
private static final long serialVersionUID = 1L;

public Class<?> getColumnClass(int columnIndex)
{
if(columnIndex == 1)
return SexEnum.class;
else
return Object.class;
}

public boolean isCellEditable(int row, int column) 
{
return column == 1;
    }
}
Object[] rowData = new Object[]{"1","男","2001-09-09"};
private JButton getBtnShow() 
{
if (btnShow == null) 
{
btnShow = new JButton("show");
btnShow.addActionListener(new ActionListener() 
{
public void actionPerformed(ActionEvent e) 
{
DefaultTableModel dft = (DefaultTableModel) getTable().getModel();
dft.addRow(rowData);
dft.addRow(rowData);
dft.addRow(rowData);
}
});
btnShow.setBounds(37, 25, 93, 23);
}
return btnShow;
}
}

#5


这是全部代码,现在不但不显示列名,而且scrollPane不管用,数据过多时,不会出现滚动条

#6


引用 2 楼 huntor 的回复:
想要显示表头,需要放到jscrollpane里

正解

#7


SexEnum的代码没有贴出来

#8


我把SexEnum的部分给注解掉了,下面这个JTable是正常的,能正常滚动而且有表头,只是show按钮是添加三行数据的逻辑
你原来写的代码整体设计和逻辑有问题,导致了表头没有出来,你研究下给你的代码就行了

import javax.swing.*;
import javax.swing.border.EmptyBorder;
import javax.swing.table.*;
import java.awt.*;
import java.awt.event.*;

public class JTableAddJComboBox extends JFrame
{
    private static final long serialVersionUID = 1L;
    private Container contentPane;
    private JScrollPane scrollPane;
    private JTable table;
    private JButton btnShow;
    
    public static void main(String[] args)
    {
        EventQueue.invokeLater(new Runnable()
        {
            public void run()
            {
                try
                {
                    JTableAddJComboBox frame = new JTableAddJComboBox();
                    frame.setVisible(true);
                } catch (Exception e)
                {
                    e.printStackTrace();
                }
            }
        });
    }

    /**
     * Create the frame.
     */
    public JTableAddJComboBox()
    {
        initialize();
    }
    private void initialize() {
        setTitle("table contain comboBox");
        setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        setBounds(100, 100, 450, 300);
//        contentPane = new JPanel();
        contentPane = this.getContentPane();
//        contentPane.setBorder(new EmptyBorder(5, 5, 5, 5));
//        setContentPane(contentPane);
        contentPane.setLayout(null);
        contentPane.add(getScrollPane());
        contentPane.add(getBtnShow());
    }

    private JScrollPane getScrollPane() {
        DefaultTableModel dft = (DefaultTableModel) getTable().getModel();
        dft.addRow(rowData);
        dft.addRow(rowData);
        dft.addRow(rowData);
        
        if (scrollPane == null) {
            scrollPane = new JScrollPane(table);
            scrollPane.setBounds(57, 72, 288, 180);
        }
        return scrollPane;
    }
    private JTable getTable() {
        if (table == null) {
            table = new JTable();
            DefaultTableModel dft = new MyTable();
            dft.addColumn("ID");
            dft.addColumn("性别");
            dft.addColumn("日期");
            table.setModel(dft);
//            table.setDefaultEditor(SexEnum.class, new DefaultCellEditor(new JComboBox(SexEnum.values())));
//            table.setDefaultRenderer(SexEnum.class, new DefaultTableCellRenderer());
            table.setRowHeight(20);
            table.getTableHeader().setReorderingAllowed(false);
            table.setSelectionMode(ListSelectionModel.SINGLE_SELECTION);
        }
        return table;
    }

    class MyTable extends DefaultTableModel
    {
        private static final long serialVersionUID = 1L;

        public Class<?> getColumnClass(int columnIndex)
        {
            if(columnIndex == 1)
//                return SexEnum.class;
                  return String.class;
            else
                return Object.class;
        }

        public boolean isCellEditable(int row, int column)
        {
            return column == 1;
        }
    }
    Object[] rowData = new Object[]{"1","男","2001-09-09"};
    
    private JButton getBtnShow()
    {
        if (btnShow == null)
        {
            btnShow = new JButton("show");
            btnShow.addActionListener(new ActionListener()
            {
                public void actionPerformed(ActionEvent e)
                {
                    DefaultTableModel dft = (DefaultTableModel) getTable().getModel();
                    dft.addRow(rowData);
                    dft.addRow(rowData);
                    dft.addRow(rowData);

                }
            });
            btnShow.setBounds(37, 25, 93, 23);
        }
        return btnShow;
    }
}

#9


SexEnum 就是一个enum类,里面包括两个值“男、女”完了


public enum SexEnum
{
男,女;
}

用这个类就是想让jtable里某列能显示下拉列表

#10


1、scrollPane.setColumnHeaderView(getTable());//这样写会使table没有表头,所以是错误的。
2、scrollPane.setViewportView(getTable());
1是我之前写的,应该是2这种写法,我是通过直接拖拽过去的,怎么会出现1那种情况了呢,具体还是eclipse的问题,有待研究,谢谢各位了!