2014-05-19 1 views
-1

내 컨트롤에 레이아웃을 부여한 후 내 테이블이 표시되지 않는 것으로 나타납니다.레이블 (l1), 콤보 상자와 제출 단추가 원하는대로 표시됩니다. 콘솔 메시지도 제대로 작동합니다. 검색 후 나타나는 Jtable이 표시되지 않습니다.JFrame에서 JTable은 검색 쿼리에 대해 한 번만 표시됩니다.

어디에서 오류가 발생할 수 있으며 어떻게 해결해야합니까? 이건 내 코드입니다 : -


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에 두 개의 테이블이 표시됩니다. 스윙은 테이블을 추가하는 방법과 반대 순서로 테이블을 칠합니다. 따라서 두 번째 테이블이 먼저 칠해지고 두 번째 테이블이 추가됩니다. 따라서 첫 번째 테이블이 두 번째 테이블 위에 그려집니다.

두 번째 스크롤 판을 추가하기 전에 먼저 기존 스콜 팬을 제거해야합니다.

그러나 더 쉬운 해결책이 있습니다. 세르지 이미 제안했다처럼 새로운하는 TableModel를 작성하고 기존 테이블의 TableModel에 교체 :

table.setModel(theNewModel); 

그래서 정말 당신이 JTable가와 스크롤을 만들고 초기 GUI를 만들 때 프레임에 추가해야합니다. 그런 다음 검색 로직이 새로운 DefaultTableModel을 만들고 위의 코드로 테이블을 업데이트합니다.

편집 :

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

이 이제 만들어지고 GUI에 빈 테이블을 추가 한 : 당신이 기본 코드 뭔가처럼 될 수있는 모든 스윙 컴포넌트를 생성 생성자에서

. 모델이 비어 있으므로 표시 할 항목이 없습니다.

이제 showTableData() 메서드에서 더 이상 스윙 구성 요소를 만들 필요가 없으므로 스크롤 창을 만드는 모든 코드 줄을 삭제하고 프레임에 스크롤 창을 추가하십시오.

나머지 코드는 모델을 만들어 테이블에 추가 한 다음 데이터를 모델에 추가하여 작동하도록합니다.더 효율적이기는하지만 table.setModel(...) 문을 메서드 끝으로 이동하여 모든 데이터가 모델에로드 된 후에 테이블이 한 번만 업데이트되도록 할 수 있습니다. 당신이

개선을 한 일의 그냥 빨리 재 설계

+0

매우 유용한 가이드 라인! 그러나 나는 여전히 새로운 TableModel을 만들고 기존 테이블의 TableModel을 대체하는 더 쉬운 솔루션에 대해 의문을 품고 있습니다. 정말 내 코드에서 수정해야하는 부분에 대해 의아해했습니다. 내 코드에서 나를 보여줄 수 있다면 정말 좋을 것입니다. 감사 ! – user3608233

+0

@ user3608233, 편집을 참조하십시오. – camickr

+0

정말 고마워요 !! 마침내 내 문제가 해결되었습니다. JScrollPane 라인을 추가하는 것만으로 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

관련 문제