2016-05-31 84 views
2

我正在制作一个随机应用程序,我希望它为电子表格制作表格。到目前为止我做了一些代码,但我的JTable似乎没有出现。我做错了什么?这里是我的代码:为什么我的JTable不出现?

import java.awt.EventQueue; 
import java.awt.*; 
import javax.swing.*; 

public class Screen { 

private static JFrame frame; 
public JFileChooser choicer = new JFileChooser(); 
public Font f = new Font("Candara", Font.PLAIN, 16); 
public TableMethods tm = new TableMethods(); 
String dir; 
JTable Table; 
String[] columns; 
String[][] data; 
JScrollPane jsp; 
/** 
* Launch the application. 
*/ 
public static void main(String[] args) { 
    EventQueue.invokeLater(new Runnable() { 
     public void run() { 
      try { 
       Screen window = new Screen(); 
       window.frame.setVisible(true); 

      } catch (Exception e) { 
       e.printStackTrace(); 
      } 
     } 
    }); 
} 

/** 
* Create the application. 
*/ 
public Screen() { 
    initialize(); 
} 

/** 
* Initialize the contents of the frame. 
*/ 
private void initialize() { 
    frame = new JFrame(); 
    frame.setTitle("Spreadr"); 
    frame.setBounds(100, 100, 1000, 800); 
    frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); 


    JMenuBar menuBar = new JMenuBar(); 
    frame.setJMenuBar(menuBar); 

    JMenu FileMenu = new JMenu("File"); 
    FileMenu.setFont(f); 
    menuBar.add(FileMenu); 

    JMenuItem New_Doc = new JMenuItem("New Document"); 
    New_Doc.setFont(f); 
    New_Doc.addActionListener(e -> { 
     choicer.setCurrentDirectory(new java.io.File(".")); 
     choicer.setDialogTitle("New Document"); 
     choicer.setFileSelectionMode(JFileChooser.DIRECTORIES_ONLY); 
     choicer.setAcceptAllFileFilterUsed(false); 

     if (choicer.showOpenDialog(new JPanel()) == JFileChooser.APPROVE_OPTION) { 
      dir = String.valueOf(choicer.getCurrentDirectory()); 
     } 
    }); 
    FileMenu.add(New_Doc); 

    JMenuItem Save_Doc = new JMenuItem("Save Document"); 
    Save_Doc.setFont(f); 
    FileMenu.add(Save_Doc); 

    JMenuItem Open_Doc = new JMenuItem("Open Document"); 
    Open_Doc.setFont(f); 
    FileMenu.add(Open_Doc); 

    JMenu EditMenu = new JMenu("Edit"); 
    EditMenu.setFont(f); 
    menuBar.add(EditMenu); 

    JMenuItem Copy = new JMenuItem("Copy"); 
    Copy.setFont(f); 
    EditMenu.add(Copy); 

    JMenuItem Cut = new JMenuItem("Cut"); 
    Cut.setFont(f); 
    EditMenu.add(Cut); 

    JMenuItem Paste = new JMenuItem("Paste"); 
    Paste.setFont(f); 
    EditMenu.add(Paste); 
    EditMenu.addSeparator(); 

    JMenuItem EditRows = new JMenuItem("Edit Rows..."); 
    EditRows.setFont(f); 
    JMenuItem EditColumns = new JMenuItem("Edit Columns..."); 
    EditColumns.setFont(f); 

    EditMenu.add(EditColumns); 
    EditMenu.add(EditRows); 
    frame.getContentPane().setLayout(new BorderLayout(0, 0)); 

    Table = new JTable(); 
    Table = tm.newTable(Table); 
    jsp = new JScrollPane(Table); 
    frame.add(jsp); 
} 

class TableMethods { 
    public JTable newTable(JTable table) { 
     int i = 1; 
     columns = new String[10]; 
     while (i <= 10) { 
      columns[i - 1] = String.valueOf(i); 
     } 

     i = 0; 
     int j = 0; 
     while (i < 10) { 
      while (j < 2) { 
       data[i][j] = String.valueOf(i + j); 
       j++; 
      } 
      i++; 
     } 
     table = new JTable(data, columns); 
     table.setFillsViewportHeight(false); 
     table.setDragEnabled(false); 
     frame.getContentPane().add(table); 
     return table; 
    } 
} 
} 

我觉得我的布局有问题。我根据@ClarkKent的要求做了一些更改,但现在应用程序完全是白色的。

The White App

+3

没有看到添加包含表滚动面板的任何地方 – Reimeus

+0

你也有这一行有两次:一个是类变量,另一种是本地:'JScrollPane的JSP =新JScrollPane(表);' –

+0

@Reimeus我把它放在那里,但它仍然没有出现。 –

回答

2

发现一对夫妇的问题。屏幕不会显示,因为你从来没有增加我,并且永远不会在你的newTable方法中初始化数据。这是一个无尽的循环,这将导致你的屏幕不可见。在无限循环被修复后,你会得到一个空指针异常。

import java.awt.EventQueue; 
import java.awt.*; 
import javax.swing.*; 

public class Screen { 

    private JFrame frame; 
    public JFileChooser choicer = new JFileChooser(); 
    public Font f = new Font("Candara", Font.PLAIN, 16); 
    public TableMethods tm = new TableMethods(); 
    String dir; 
    JTable Table; 
    String[] columns; 
    String[][] data; 
    JScrollPane jsp; 

    /** 
    * Launch the application. 
    */ 
    public static void main(String[] args) { 
     EventQueue.invokeLater(new Runnable() { 
      public void run() { 
       try { 
        Screen window = new Screen(); 
        //window.frame.setVisible(true); 

       } catch (Exception e) { 
        e.printStackTrace(); 
       } 
      } 
     }); 
    } 

    /** 
    * Create the application. 
    */ 
    public Screen() { 
     initialize(); 
    } 

    /** 
    * Initialize the contents of the frame. 
    */ 
    private void initialize() { 
     frame = new JFrame(); 
     frame.setTitle("Spreadr"); 
     frame.setBounds(100, 100, 1000, 800); 
     frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); 

     JMenuBar menuBar = new JMenuBar(); 
     frame.setJMenuBar(menuBar); 

     JMenu FileMenu = new JMenu("File"); 
     FileMenu.setFont(f); 
     menuBar.add(FileMenu); 

     JMenuItem New_Doc = new JMenuItem("New Document"); 
     New_Doc.setFont(f); 
     New_Doc.addActionListener(e -> { 
      choicer.setCurrentDirectory(new java.io.File(".")); 
      choicer.setDialogTitle("New Document"); 
      choicer.setFileSelectionMode(JFileChooser.DIRECTORIES_ONLY); 
      choicer.setAcceptAllFileFilterUsed(false); 

      if (choicer.showOpenDialog(new JPanel()) == JFileChooser.APPROVE_OPTION) { 
       dir = String.valueOf(choicer.getCurrentDirectory()); 
      } 
     }); 
     FileMenu.add(New_Doc); 

     JMenuItem Save_Doc = new JMenuItem("Save Document"); 
     Save_Doc.setFont(f); 
     FileMenu.add(Save_Doc); 

     JMenuItem Open_Doc = new JMenuItem("Open Document"); 
     Open_Doc.setFont(f); 
     FileMenu.add(Open_Doc); 

     JMenu EditMenu = new JMenu("Edit"); 
     EditMenu.setFont(f); 
     menuBar.add(EditMenu); 

     JMenuItem Copy = new JMenuItem("Copy"); 
     Copy.setFont(f); 
     EditMenu.add(Copy); 

     JMenuItem Cut = new JMenuItem("Cut"); 
     Cut.setFont(f); 
     EditMenu.add(Cut); 

     JMenuItem Paste = new JMenuItem("Paste"); 
     Paste.setFont(f); 
     EditMenu.add(Paste); 
     EditMenu.addSeparator(); 

     JMenuItem EditRows = new JMenuItem("Edit Rows..."); 
     EditRows.setFont(f); 
     JMenuItem EditColumns = new JMenuItem("Edit Columns..."); 
     EditColumns.setFont(f); 

     EditMenu.add(EditColumns); 
     EditMenu.add(EditRows); 
     frame.getContentPane().setLayout(new BorderLayout(0, 0)); 

     Table = new JTable(); 
     Table = tm.newTable(Table); 
     jsp = new JScrollPane(Table); 
     frame.add(jsp); 
     frame.pack(); 
     frame.setVisible(true); 
    } 

    class TableMethods { 
     public JTable newTable(JTable table) { 
      int i = 1; 
      columns = new String[10]; 
      while (i <= 10) { 
       columns[i++ - 1] = String.valueOf(i); //Increment i 
      } 
      data = new String[10][10]; //Initialize data. 
      i = 0; 
      int j = 0; 
      while (i < 10) { 
       j=0; //Set j to 0. 
       while (j < 2) { 
        data[i][j] = String.valueOf(i + j); 
        j++; 
       } 
       i++; 
      } 
      table = new JTable(data, columns); 
      table.setFillsViewportHeight(false); 
      table.setDragEnabled(false); 
      frame.getContentPane().add(table); 
      return table; 
     } 
    } 
} 

enter image description here

+0

但是,当我宣布j为0,为什么这首先发生? –

+0

而且,如果我想防止人们在各处拖动列,我该怎么做? –

+0

你的意思是,当你已经声明'j = 0'时,你为什么仍然会无限循环? –

相关问题