2012-10-01 55 views
2

这里是我的代码:JTable中没有显示的列名

public class DownloadMainView extends JFrame{ 
    private ArrayList<DownloadItem> downloadList = new ArrayList<DownloadItem>(); 
    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<DownloadItem>) ois.readObject(); 
       ois.close(); 
      } catch (IOException e) { 
       // TODO Auto-generated catch block 
       downloadList = new ArrayList<DownloadItem>(); 
       e.printStackTrace(); 
      }catch(ClassNotFoundException e){ 
       downloadList = new ArrayList<DownloadItem>(); 
       e.printStackTrace(); 
      } 
     } 

谢谢!

+0

通常JScrollPane会提供帮助。请发布一些我们可以运行的代码,并尝试诸如我们找出问题所在。 –

+0

嗨Dan,我添加了我的完整构造函数,请再次查看! – Songokute

+0

好的,看我的答案。 –

回答

5

您以错误的方式使用了JScrollPane。要使其正常工作,只需执行以下操作。

传递JTable实例的JScrollPane在构造函数中:

private JScrollPane scrollPane = new JScrollPane(contentTable); 

注释掉,您使用的JTable添加到JScrollPane行:

// scrollPane.add(contentTable); 

当你把组件内部一个JScrollPane的构造函数,你会提到哪个视图被应用到的滚动视图。

另一方面,使用add方法,您只需将组件添加到容器,例如将其添加到JPanel。这样,您不指定要添加滚动条的组件。

+0

谢谢,它的工作原理!但是这两种方式有什么区别? – Songokute

+0

当然。看到我更新的答案。 –

+0

明白了,非常感谢! :D – Songokute