2011-02-24 115 views
1

我寫這個代碼來顯示錶中的字符串。如何將數據插入到JTable中?

但它沒有顯示,也沒有效果。

什麼是問題?

public pamnel() { 
      initComponents(); 
      String[] columnNames = {"First Name", 
          "Last Name", 
          "Sport", 
          "# of Years", 
          "Vegetarian"}; 



    Object[][] data = { 
     {"Kathy", "Smith", 
     "Snowboarding", new Integer(5), new Boolean(false)}, 
     {"John", "Doe", 
     "Rowing", new Integer(3), new Boolean(true)}, 
     {"Sue", "Black", 
     "Knitting", new Integer(2), new Boolean(false)}, 
     {"Jane", "White", 
     "Speed reading", new Integer(20), new Boolean(true)}, 
     {"Joe", "Brown", 
     "Pool", new Integer(10), new Boolean(false)} 
    }; 

    jTable1 = new JTable(data, columnNames);      

} 

編輯: 我添加的JTable在面板上。

在主要添加面板到一個jframe。

JFrame frame = new JFrame(); 
    frame.add(new pamnel()); 
    frame.setVisible(true); 
    frame.setSize(600, 600); 
    frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); 

該表顯示,但數據不顯示。 表的行和列是空的!

+3

JTable中本身沒有顯示或者不顯示的數據?代碼中將JTable添加到框架中的面板並調用setVisible(true)的代碼在哪裏?該聲明似乎完全正確。另外,您是否將JTable放入JScrollPane中? – justkt 2011-02-24 15:47:40

回答

3

您必須將JTable添加到其父組件和setVisible()。

3

你真的自己寫了代碼嗎?我從一個oracle swing教程中記住了這一點。無論如何,您還沒有將JTable添加到組件中。遵守以下source

package components; 

/* 
* SimpleTableDemo.java requires no other files. 
*/ 

import javax.swing.JFrame; 
import javax.swing.JPanel; 
import javax.swing.JScrollPane; 
import javax.swing.JTable; 
import java.awt.Dimension; 
import java.awt.GridLayout; 
import java.awt.event.MouseAdapter; 
import java.awt.event.MouseEvent; 

public class SimpleTableDemo extends JPanel { 
    private boolean DEBUG = false; 

    public SimpleTableDemo() { 
     super(new GridLayout(1,0)); 

     String[] columnNames = {"First Name", 
           "Last Name", 
           "Sport", 
           "# of Years", 
           "Vegetarian"}; 

     Object[][] data = { 
     {"Kathy", "Smith", 
     "Snowboarding", new Integer(5), new Boolean(false)}, 
     {"John", "Doe", 
     "Rowing", new Integer(3), new Boolean(true)}, 
     {"Sue", "Black", 
     "Knitting", new Integer(2), new Boolean(false)}, 
     {"Jane", "White", 
     "Speed reading", new Integer(20), new Boolean(true)}, 
     {"Joe", "Brown", 
     "Pool", new Integer(10), new Boolean(false)} 
     }; 

     final JTable table = new JTable(data, columnNames); 
     table.setPreferredScrollableViewportSize(new Dimension(500, 70)); 
     table.setFillsViewportHeight(true); 

     if (DEBUG) { 
      table.addMouseListener(new MouseAdapter() { 
       public void mouseClicked(MouseEvent e) { 
        printDebugData(table); 
       } 
      }); 
     } 

     //Create the scroll pane and add the table to it. 
     JScrollPane scrollPane = new JScrollPane(table); 

     //Add the scroll pane to this panel. 
     add(scrollPane); 
    } 

    private void printDebugData(JTable table) { 
     int numRows = table.getRowCount(); 
     int numCols = table.getColumnCount(); 
     javax.swing.table.TableModel model = table.getModel(); 

     System.out.println("Value of data: "); 
     for (int i=0; i < numRows; i++) { 
      System.out.print(" row " + i + ":"); 
      for (int j=0; j < numCols; j++) { 
       System.out.print(" " + model.getValueAt(i, j)); 
      } 
      System.out.println(); 
     } 
     System.out.println("--------------------------"); 
    } 

    /** 
    * Create the GUI and show it. For thread safety, 
    * this method should be invoked from the 
    * event-dispatching thread. 
    */ 
    private static void createAndShowGUI() { 
     //Create and set up the window. 
     JFrame frame = new JFrame("SimpleTableDemo"); 
     frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); 

     //Create and set up the content pane. 
     SimpleTableDemo newContentPane = new SimpleTableDemo(); 
     newContentPane.setOpaque(true); //content panes must be opaque 
     frame.setContentPane(newContentPane); 

     //Display the window. 
     frame.pack(); 
     frame.setVisible(true); 
    } 

    public static void main(String[] args) { 
     //Schedule a job for the event-dispatching thread: 
     //creating and showing this application's GUI. 
     javax.swing.SwingUtilities.invokeLater(new Runnable() { 
      public void run() { 
       createAndShowGUI(); 
      } 
     }); 
    } 
} 

JTable中被添加到的JPanel在SimpleTableDemo構造。然後,將JPanel設置爲主JFrame中的內容窗格,該窗格製作爲frame.setVisible(true)。這發生在createAndShowGUI方法中。你的代碼不顯示JTable的原因是因爲JTable是一個抽象的小部件。您需要將抽象小部件添加到組件中,例如JFrame(在上例中)以顯示它。

+0

該代碼可以在Swing教程中找到。沒有必要在這裏複製代碼。只需鏈接到教程。這樣海報就可以閱讀教程並理解代碼。 – camickr 2011-02-24 16:16:36

+0

@camickr同意,這就是爲什麼我已經鏈接了教程並解釋了部分代碼。另外,如果您注意到,提問者的代碼片段直接來自教程。有點可疑。 – 2011-02-27 17:38:55

2

嘗試這樣的事情,只是爲了讓它運行。注意你放棄void在pammel方法和主要被添加。

import javax.swing.*; 

class TableDemo { 
    JTable jTable1; 
    public static void main(String ... args) { 

     TableDemo tableDemo = new TableDemo(); 
     tableDemo.pamnel(); 

     JFrame frame = new JFrame(); 
     frame.add( new JScrollPane(tableDemo.jTable1)); 
     frame.pack(); 
     frame.setVisible(true); 
    } 
    public void initComponents(){ 
    } 
    public void pamnel() { 
      initComponents(); 
      String[] columnNames = {"First Name", 
          "Last Name", 
          "Sport", 
          "# of Years", 
          "Vegetarian"}; 



     Object[][] data = { 
      {"Kathy", "Smith", 
      "Snowboarding", new Integer(5), new Boolean(false)}, 
      {"John", "Doe", 
      "Rowing", new Integer(3), new Boolean(true)}, 
      {"Sue", "Black", 
      "Knitting", new Integer(2), new Boolean(false)}, 
      {"Jane", "White", 
      "Speed reading", new Integer(20), new Boolean(true)}, 
      {"Joe", "Brown", 
      "Pool", new Integer(10), new Boolean(false)} 
     }; 

     jTable1 = new JTable(data, columnNames);      

    }  
} 

it works!

0

它接縫像新JTable沒有被添加到pamnel
大概另一實例中,不與數據初始化,在initComponents()

private JTable jTable1 = new JTable(); // empty table 

public pamnel() { 
    initComponents(); 

    String[] columnNames = ... 
    Object[][] data = ... 

    jTable1 = new JTable(data, columnNames); // new instance created here 
    // nothing happens with that new instance 
} 

private void initComponents() { 
    ... 
    add(jTable1); // added empty table, not the one created above (constructor) 
    ... 
} 

正在添加的add方法並不一個參考變量添加到組件,它僅添加變量的值。所以,如果變量被改變,組件仍然包含前一個(舊)值。
變化的創建,添加順序爲:

private JTable jTable1; 

public pamnel() { 
    initComponents(); 
} 

private void initComponents() { 
    ... 
    createTable(); 
    add(jTable1); 
    ... 
} 

private void createTable() { 
    String[] columnNames = ... 
    Object[][] data = ... 

    jTable1 = new JTable(data, columnNames); 
} 
相關問題