Son*_*ute 2 java swing jtable jscrollpane jtableheader
这是我的代码:
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);
}
Run Code Online (Sandbox Code Playgroud)
但是当我运行我的代码时,表不显示列名.当我将1设置为此行时,它只显示一个空行:DefaultTableModel model = new DefaultTableModel(columns,1);
请告诉我我的代码错在哪里?谢谢!
编辑:当有人问同样的问题(在JTable中没有标题),但答案是将Jtable添加到JScrollPane,这对@@编辑没有帮助:嗨Dan,我已经添加了我的完整构造函数,这里是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();
}
}
Run Code Online (Sandbox Code Playgroud)
谢谢!
你JScrollPane以错误的方式使用了它.为了使其正常工作,请执行以下操作.
将JTable实例传递给JScrollPane构造函数:
private JScrollPane scrollPane = new JScrollPane(contentTable);
Run Code Online (Sandbox Code Playgroud)
注释掉您以前添加JTable到的行JScrollPane:
// scrollPane.add(contentTable);
Run Code Online (Sandbox Code Playgroud)
当您将组件放在a的构造函数中时JScrollPane,您提到要应用滚动的视图.
另一方面,使用该add方法,您只需将一个组件添加到容器中,例如将其添加到容器中JPanel.这样,您不需要指定要添加滚动条的组件.