JTable не показывает имена столбцов

вот мой код:

public class DownloadMainView extends JFrame{
    private ArrayList downloadList = new ArrayList();
    private JMenuBar menubar = new JMenuBar();
    private JMenu m_task = new JMenu("Tasks");
    private JMenu m_tool = new JMenu("Tools");
    private JMenu m_help = new JMenu("Help");

    private JMenuItem mi_add = new JMenuItem("Add");
    private JMenuItem mi_exit = new JMenuItem("Exit");
    private JMenuItem mi_options = new JMenuItem("Options");
    private JMenuItem mi_help = new JMenuItem("Help");
    private JMenuItem mi_about = new JMenuItem("About");

    private JTree categoryTree = new JTree();
    private JTable contentTable = new JTable(new Object[][]{},new Object[]{"No.","Filename","URL","Status","Size","Added Date"});
    private JToolBar toolbar = new JToolBar();
    private JScrollPane scrollPane = new JScrollPane();

    private JButton btnAdd = new JButton("Add");
    private JButton btnCancel = new JButton("Cancel");
    private JButton btnDelete = new JButton("Delete");
    private JButton btnOption = new JButton("Option");

    public DownloadMainView() throws IOException{
        super("KPDownloader");
        setSize(800,400);
        setLayout(null);
        setDefaultCloseOperation(EXIT_ON_CLOSE);
        //Build menubar
        menubar.add(m_task);
        menubar.add(m_tool);
        menubar.add(m_help);
        m_task.add(mi_add);
        mi_add.setAccelerator(KeyStroke.getKeyStroke(KeyEvent.VK_A,ActionEvent.CTRL_MASK));
        m_task.add(new JSeparator());
        m_task.add(mi_exit);
        mi_exit.setAccelerator(KeyStroke.getKeyStroke(KeyEvent.VK_X,ActionEvent.ALT_MASK));
        m_tool.add(mi_options);
        mi_options.setAccelerator(KeyStroke.getKeyStroke(KeyEvent.VK_O,ActionEvent.CTRL_MASK));
        m_help.add(mi_help);
        mi_help.setAccelerator(KeyStroke.getKeyStroke(KeyEvent.VK_F1,0));
        m_help.add(mi_about);
        mi_about.setAccelerator(KeyStroke.getKeyStroke(KeyEvent.VK_B,ActionEvent.CTRL_MASK));
        setJMenuBar(menubar);
        //about buttons
        toolbar.add(btnAdd);        
        toolbar.add(btnOption);
        toolbar.add(btnCancel);
        toolbar.add(btnDelete);
        toolbar.setLocation(0, 0);
        toolbar.setSize(800,42);
        this.add(toolbar);
        //add table to mainview
        String columns[] = {"No.","Filename","URL","Status","Size","Added Date"};
        DefaultTableModel model = new DefaultTableModel(columns,1);
        readDownloadList();
        if(downloadList != null){
            int length = downloadList.size();
            for(int i = 0; i < length; i++)
                model.insertRow(i, new Object[]{i,
                        downloadList.get(i).getFilename(),downloadList.get(i).getSize(),
                        downloadList.get(i).getStatus(),
                        downloadList.get(i).getURL(),downloadList.get(i).getAddedDate()});
        }

        contentTable.setModel(model);
        contentTable.setSize(800, 350);
        scrollPane.add(contentTable);
        scrollPane.setSize(800, 350);
        scrollPane.setLocation(0, 50);
        this.add(scrollPane);

    }

Но когда я запускаю свой код, в таблице не отображаются имена столбцов. Это просто показывает одну пустую строку, как я установил 1 в этой строке:DefaultTableModel model = new DefaultTableModel(columns,1);

Пожалуйста, покажите мне, где мой код не так ?? Спасибо!

Отредактировано: как кто-то задал тот же вопрос (нет заголовков в JTable), но ответ - добавить Jtable в JScrollPane, и это не поможет @@ Отредактировано: ПриветДэнЯя добавил мой полный конструктор, и вот кодreadDownloadList() метод:

void readDownloadList(){
            File file = new File("downloadlist.dat");
            ObjectInputStream ois = null;
            if(!file.exists())
                try {
                    file.createNewFile();
                } catch (IOException e) {
                    // TODO Auto-generated catch block
                    e.printStackTrace();
                }
            try {
                ois = new ObjectInputStream(new FileInputStream(file));
                downloadList = (ArrayList) ois.readObject();
                ois.close();
            } catch (IOException e) {
                // TODO Auto-generated catch block
                downloadList = new ArrayList();
                e.printStackTrace();
            }catch(ClassNotFoundException e){
                downloadList = new ArrayList();
                e.printStackTrace();
            }
        }

Спасибо!

 Dan D.01 окт. 2012 г., 11:46
Обычно помогает JScrollPane. Пожалуйста, опубликуйте код, который мы можем запустить, и попробуйте, например, чтобы выяснить, в чем проблема.
 Songokute01 окт. 2012 г., 11:54
Привет Дэн, я добавил свой полный конструктор, пожалуйста, просмотрите его снова!
 Suma22 янв. 2016 г., 12:06
 Dan D.01 окт. 2012 г., 12:13
ОК, смотрите мой ответ.

Ответы на вопрос(1)

Решение Вопроса

JScrollPane неправильно. Чтобы все работало нормально, просто сделайте следующее.

ПройтиJTable экземпляр кJScrollPane в конструкторе:

private JScrollPane scrollPane = new JScrollPane(contentTable);

Закомментируйте строку, где вы использовали, чтобы добавитьJTable к:JScrollPane

// scrollPane.add(contentTable);

Когда вы помещаете компонент внутри конструктораJScrollPaneВы упоминаете, к какому виду применяется свиток.

С другой стороны, используяadd метод, вы просто добавляете компонент в контейнер, как добавление его вJPanel, Таким образом, вы неt указать компонент, к которому нужно добавить полосы прокрутки.

 Songokute01 окт. 2012 г., 12:15
Спасибо, это работает! Но есть ли разница между этими двумя способами?
 Dan D.01 окт. 2012 г., 12:21
Конечно. Смотрите мой обновленный ответ.
 Songokute01 окт. 2012 г., 13:45
Понял, большое спасибо! : D
 Dan D.01 окт. 2012 г., 13:45
Вы'Добро пожаловать

Ваш ответ на вопрос