2014-05-19 52 views
-1

因此,在對我的控件進行佈局之後,我發現我的表似乎不顯示。 標籤(l1),組合框和提交按鈕以我想要的方式顯示,即使控制檯消息工作正常。只是在搜索後應該出現的Jtable不會顯示。JTable在JFrame中僅顯示一次用於搜索查詢

錯誤在哪裏,應該如何糾正。這是我的代碼: -


import java.awt.*; 
import java.awt.event.*; 
import java.io.File; 
import java.sql.*; 
import java.util.Vector; 

import javax.swing.*; 
import javax.swing.table.DefaultTableModel; 

public class r_search_2 extends JFrame implements ActionListener { 

    JFrame frame1; 
    JLabel l0, l1, l2; 
    JComboBox c1; 
    JButton b1; 
    Connection con; 
    ResultSet rs, rs1; 
    Statement st, st1; 
    PreparedStatement pst; 
    String ids; 
    static JTable table = new JTable();; 
    String[] columnNames = {"SECTION NAME", "REPORT NAME", "CONTACT", "LINK"}; 
    String from; 
    Vector v = new Vector(); 
    JMenuBar menu = new JMenuBar(); 


    JPanel mainPanel = new JPanel(new BorderLayout()); 
    JPanel topPanel = new JPanel(new FlowLayout(SwingConstants.LEADING, 60,25)); 


    r_search_2() 
    { 

     b1 = new JButton("submit"); 

     //l0.setBounds(100, 50, 350, 40); 
     l1.setBounds(75, 110, 75, 20); 
     b1.setBounds(150, 150, 150, 20); 
     b1.addActionListener(this); 

     topPanel.add(l1); 

     try 
     { 

      File dbFile = new File("executive_db.accdb"); 
      String path = dbFile.getAbsolutePath(); 
      con = DriverManager.getConnection("jdbc:odbc:Driver={Microsoft Access Driver (*.mdb, *.accdb)}; DBQ= " + path); 
      Class.forName("sun.jdbc.odbc.JdbcOdbcDriver"); 
      st = con.createStatement(); 
      rs = st.executeQuery("select index_name from Index1"); 
      while (rs.next()) 
      { 
       ids = rs.getString(1); 
       v.add(ids); 

      } 
      c1 = new JComboBox(v); 
      c1.setEditable(true);c1.setSelectedItem(""); 
      c1.setBounds(150, 110, 150, 20); 


      topPanel.add(c1); 
      topPanel.add(b1); 
      mainPanel.add(topPanel, BorderLayout.PAGE_START); 

      st.close(); 
      rs.close(); 
     } catch (Exception e) { 
     } 
     // setVisible(true); 
    } 

    public void actionPerformed(ActionEvent ae) { 
     if (ae.getSource() == b1) { 
      showTableData(); 
     } 
    } 

    public void showTableData() 
    { 

     DefaultTableModel model = new DefaultTableModel(); 
     model.setColumnIdentifiers(columnNames); 

     table.setModel(model); 
     table.setAutoResizeMode(JTable.AUTO_RESIZE_ALL_COLUMNS); 
     table.setFillsViewportHeight(true); 
     JScrollPane scroll = new JScrollPane(table); 
     scroll.setHorizontalScrollBarPolicy(JScrollPane.HORIZONTAL_SCROLLBAR_AS_NEEDED); 
     scroll.setVerticalScrollBarPolicy(JScrollPane.VERTICAL_SCROLLBAR_AS_NEEDED); 
     from = (String) c1.getSelectedItem(); 

     String section_name = ""; 
     String report_name = ""; 
     String contact_name = ""; 
     String link = ""; 


     try 
     { 

     pst = con.prepareStatement("select distinct Section.Section_Name,Report.Report_Name,Report.Link,Contact.Contact_Name " 
         + "FROM ((Section INNER JOIN Report ON Report.Section_ID=Section.Section_ID) INNER JOIN Contact ON Contact.Contact_ID=Report.Contact_ID) LEFT JOIN Metrics ON Metrics.Report_ID=Report.Report_ID " 
         + " WHERE Section.Section_Name LIKE '%"+from+"%' OR Report.Report_Name LIKE '%"+from+"%' OR Metrics.Metric_Name LIKE '%"+from+"%' OR Contact.Contact_Name LIKE '%"+from+"%' "); 
      ResultSet rs = pst.executeQuery(); 
      int i = 0; 
      while (rs.next()) { 
       section_name = rs.getString("Section_Name"); 
       report_name = rs.getString("Report_Name"); 
       contact_name = rs.getString("Contact_Name"); 
       link = rs.getString("Link"); 
       model.addRow(new Object[]{section_name, report_name, contact_name, link}); 
       i++; 
      } 
      if (i < 1) { 
       JOptionPane.showMessageDialog(null, "No Record Found", "Error", JOptionPane.ERROR_MESSAGE); 
      } 
      if (i == 1) { 
       System.out.println(i + " Record Found"); 
      } else { 
       System.out.println(i + " Records Found"); 
      } 
     } catch (Exception ex) { 
      JOptionPane.showMessageDialog(null, ex.getMessage(), "Error", JOptionPane.ERROR_MESSAGE); 
     } 
     mainPanel.add(scroll); 
     mainPanel.revalidate(); 
     mainPanel.repaint(); 

    } 

    public static void main(String args[]) { 


     r_search_2 s=new r_search_2(); 
     //new r_search_2(); 
     JFrame fr=new JFrame("Search Executive Reports"); 
     //fr.add(s.getUI()); 
     fr.add(s.mainPanel); 
     fr.setDefaultCloseOperation(JFrame.DISPOSE_ON_CLOSE); 
     fr.setLocationByPlatform(true); 
     fr.setSize(1000, 400); 
     //fr.pack(); 
     fr.setVisible(true); 

     // new r_search_2(); 
    } 
} 
+0

你可以嘗試指定的BorderLayout對部分你想要哪張桌子;我認爲它應該默認爲中心,但沒有具體的損害。 – arcy

回答

4

總評:

  1. 使用合理的變量名,如果你希望人們花時間閱讀你的代碼的時間。 「b1」,「l1」沒有任何意義。
  2. 擺脫所有setBounds()聲明。您的面板使用FlowLayout,FlowLayout將確定組件的大小/位置。

下次我輸入任何東西進行搜索時,它都沒有出現。

您正在將該表添加到BorderLayout的CENTER中。所以你現在有兩個表格顯示在CENTER中。 Swing以與表格添加相反的順序繪製表格。所以第二張桌子首先被繪製,第一張桌子被繪製第二張。所以第一張桌子被繪在第二張桌子上面。

因此,您需要先刪除舊的scollpane,然後再添加第二個滾動條。

但是有一個更簡單的解決方案。正如謝爾蓋已經提出只需要創建一個新的TableModel,並在現有的表更換爲TableModel:

table.setModel(theNewModel); 

所以真的應該創建JTable中和滾動面板和它在創建初始的GUI添加到您的框架。然後,您的搜索邏輯將創建一個新的DefaultTableModel,並使用上面的代碼更新表格。

編輯:

在您創建的所有Swing組件的基本代碼可能是這樣的構造:

mainPanel.add(topPanel, BorderLayout.PAGE_START); 
JScrollPane scrollPane = new JScrollPane(table); // added 
mainPanel.add(scrollPane, BorderLayout.CENTER); // added 

現在你已經創建並添加一個空表到你的GUI。模型是空的,所以沒有什麼可顯示的。

現在在您的showTableData()方法中,您不需要創建更多的Swing組件,因此請刪除創建該滾動窗格的所有這些代碼行並將該scrollpane添加到該框架。

剩餘的代碼創建模型並將其添加到表中,然後將數據添加到模型中,以使其保持原樣。儘管效率更高,但您可能希望將table.setModel(...)語句移動到方法的末尾,以便在所有數據加載到模型中後才更新表格。

+0

非常有幫助的指導方針!但是我仍然對你的更簡單的解決方案感到困惑,那就是創建一個新的TableModel並替換現有表中的TableModel。真的很困惑,我應該在我的代碼中修改。如果你能在我的代碼中顯示我,這將是非常好的。謝謝 ! – user3608233

+0

@ user3608233,請參閱編輯。 – camickr

+0

非常感謝你!我的問題終於解決了。只需添加行JScr​​ollPane scroll = new JScrollPane(table);在構造函數中修復了這個問題!非常感謝 ! :-) – user3608233

2

這是一個不好的做法,但你可以做以下

mainPanel.add(scroll); 
    mainPanel.revalidate() 
    mainPanel.repaint(); 

好的做法是使用CardLayout空面板時沒有搜索結果必須證明。

+0

:感謝您的快速回復!所以我在代碼中添加了上面的代碼。 Jtable確實出現,但僅用於第一個搜索字符串。下次我輸入任何東西進行搜索時,它都不會出現。我應該如何糾正? – user3608233

+0

您應該只添加一次表格。下次你應該在表格中設置另一個表格模型。但你應該看到我的另一個建議(使用CardLayout) –

+0

@Jarrod Roberson:在我看來,這不是一個重複的問題。請看看 – user3608233

0

的你做了什麼

改進只是一個快速的重新設計:我很快就試圖將來自所述碼位的界面,希望這有助於

public class r_search_2 extends JFrame implements ActionListener { 

r_search_2(String Title) 
{ 
    super(Title); 

    init(); 
} 

private void init(){ 
    b1 = new JButton("submit"); 
    b1.addActionListener(this); 


    c1 = new JComboBox(v); 
    c1.setEditable(true);c1.setSelectedItem(""); 
    c1.setBounds(150, 110, 150, 20); 

    topPanel.add(c1); 
    topPanel.add(b1); 
    mainPanel.add(topPanel, BorderLayout.PAGE_START); 

    DefaultTableModel model = new DefaultTableModel(); 
    model.setColumnIdentifiers(columnNames); 

    table.setModel(model); 
    table.setAutoResizeMode(JTable.AUTO_RESIZE_ALL_COLUMNS); 
    table.setFillsViewportHeight(true); 
    JScrollPane scroll = new JScrollPane(table); 
    scroll.setHorizontalScrollBarPolicy(JScrollPane.HORIZONTAL_SCROLLBAR_AS_NEEDED); 
    scroll.setVerticalScrollBarPolicy(JScrollPane.VERTICAL_SCROLLBAR_AS_NEEDED); 
    from = (String) c1.getSelectedItem(); 

    String section_name = ""; 
    String report_name = ""; 
    String contact_name = ""; 
    String link = ""; 

    mainPanel.add(scroll); 
    this.add(mainPanel); 
    this.setDefaultCloseOperation(JFrame.DISPOSE_ON_CLOSE); 
    this.setLocationByPlatform(true); 
    this.setSize(1000, 400); 
    this.setVisible(true); 

} 


public static void main(String args[]) { 


    r_search_2 s=new r_search_2("Search Executive Reports"); 

} 
} 
+0

你應該注意你所做的改進。否則,這不是一個答案 –

+0

@peeskillet編輯 – QGA

+0

@QuentinTanioartino:感謝您的意見。但是我的問題依然存在。你能幫我修理嗎?謝謝 ! – user3608233