2013-04-23 136 views
1

我的程序有设计问题。JFrame显示不正确

首先显示带有组合框的Jframe。组合框中填充您选择的城镇名称并点击搜索。

程序然后显示一个jtable与表中的值。它会生成Jtable和信息,但是jframe本身显示为没有设置大小参数,直到您通过将其拖动到右下角手动增加大小,才会显示任何内容。

这里是什么我做错了JTable中

public class Display_All extends JFrame 
{ 
    public Display_All(Object town) 
    { 
     Vector columnNames = new Vector(); 
     Vector data = new Vector(); 

     try 
     { 
      // Connect to an Access Database 


      String driver = "com.mysql.jdbc.Driver"; 
      String url ="jdbc:mysql://localhost:3306/ire"; 
      String userid = "root"; 
      String password = "password"; 

      Class.forName(driver); 
      Connection connection = DriverManager.getConnection(url, userid, password); 

      // Read data from a table 

      String sql = "(SELECT Activities_Name,  Activities_Email,Activities_Address_1, Town, Activities_Phone ,Activities_Mobile, Activities_Web_Address, Activities_Owner FROM activities WHERE Town ='"+town+"')" 
        + "UNION ALL (SELECT Attraction_Name, Attraction_Email, Attraction_Address_1, Town, Attraction_Phone, Attraction_Mobile, Attraction_Web_Address, Attraction_Owner FROM attractions WHERE Town = '"+town+"')" 
        + "UNION ALL (SELECT BB_Name, BB_Email, BB_Address_1 ,Town, BB_Phone, BB_Mobile, BB_Web_Address, BB_Owner FROM bb WHERE Town = '"+town+"')" 
        + "UNION ALL (SELECT Hotel_Name ,Hotel_Email ,Hotel_Address_1, Town, Hotel_Phone, Hotel_Mobile, Hotel_Web_Address, Hotel_Owner FROM hotels WHERE Town = '"+town+"')" 
        + "UNION ALL (SELECT Pub_Name, Pub_Email ,Pub_Address_1, Town, Pub_Phone ,Pub_Mobile, Pub_Web_Address, Pub_Owner FROM pubs WHERE Town = '"+town+"')" 
        + "UNION ALL (SELECT Restaurant_Name, Restaurant_Email, Restaurant_Address_1, Town, Restaurant_Phone, Restaurant_Mobile, Restaurant_Web_Address, Restaurant_Owner FROM restaurant WHERE Town = '"+town+"')" 
        + "UNION ALL (SELECT Self_Catering_Name, Self_Catering_Email, Self_Catering_Address_1, Town, Self_Catering_Phone, Self_Catering_Mobile, Self_Catering_Web_Address, Self_Catering_Owner FROM self_catering WHERE Town = '"+town+"')"; 


      Statement stmt = connection.createStatement(); 
      ResultSet rs = stmt.executeQuery(sql); 
      ResultSetMetaData md = rs.getMetaData(); 
      int columns = md.getColumnCount(); 

      // Get column names 


      columnNames.addElement("Business Name"); 
      columnNames.addElement("Email"); 
      columnNames.addElement("Address 1"); 
      columnNames.addElement("Town"); 
      columnNames.addElement("Phone"); 
      columnNames.addElement("Mobile"); 
      columnNames.addElement("Web Address"); 
      columnNames.addElement("Owner"); 


      // Get row data 

      while (rs.next()) 
      { 
       Vector row = new Vector(columns); 

       for (int i = 1; i <= columns; i++) 
       { 
        row.addElement(rs.getObject(i)); 
       } 

       data.addElement(row); 
      } 

      rs.close(); 
      stmt.close(); 
      connection.close(); 
     } 
     catch(Exception e) 
     { 
      System.out.println(e); 
     } 

     // Create table with database data 

     JTable table = new JTable(data, columnNames) 
     { 
      public Class getColumnClass(int column) 
      { 
       for (int row = 0; row < getRowCount(); row++) 
       { 
        Object o = getValueAt(row, column); 

        if (o != null) 
        { 
         return o.getClass(); 
        } 
       } 

       return Object.class; 
      } 
     }; 

     JScrollPane scrollPane = new JScrollPane(table); 
     getContentPane().add(scrollPane); 

    //  JPanel buttonPanel = new JPanel(); 
    //  getContentPane().add(buttonPanel, BorderLayout.SOUTH); 
    } 

    public static void main(String[] args) 
    { 
     Display_All frame = new Display_All("town"); 
     frame.setDefaultCloseOperation(DISPOSE_ON_CLOSE); 
     frame.setPreferredSize(new Dimension(400, 300)); 
     frame.setVisible(true); 
    } 

    public void run() { 
     new Display_All("town").setVisible(true); 
    } 
    } 

任何人都可以阐明的代码?

我已经尝试了很多不同的事情,试图达到这个底部,但该程序似乎没有回应我放入它的任何东西?

它很难解释我会显示图片,但我的名声太低。

感谢

+0

也许'包()'可以帮助您 - > [JDoc](http://docs.oracle.com/javase/6/docs/api/java/awt/Window.html#pack%28 %29)。 – Eich 2013-04-23 13:34:34

+1

不要为此使用JFrame。一个应用程序应该只有一个主JFrame。其他子窗口应该是指定为主框架的主框架的JDialog。 – camickr 2013-04-23 15:14:56

回答

2

你必须要么设置JFrame的大小,或包装的JFrame。

此外,您需要将您的Swing组件放在事件派发线程(EDT)上。 catch - -

public static void main(String[] args) 
{ 
    SwingUtilities.invokeLater(new Runnable() { 
     @Override 
     public void run() { 
      Display_All frame = new Display_All("town"); 
      frame.setDefaultCloseOperation(DISPOSE_ON_CLOSE); 

      frame.setSize(new Dimension(400, 300)); // or 
      frame.pack(); 

      frame.setVisible(true); 
     }  
    }); 
} 
+0

+1 for pack()&InitialThread – mKorbel 2013-04-23 13:53:06

1
  1. 用于GUI和数据库拆分逻辑,列名之前可以try定义finally块,因为ResultSetMetaData好像是(永远是)不使用

  2. rs.close();stmt.close();connection.close(); shoudl被关闭finally block

  3. JTable, XxxTableModel is based on 2D array th恩Vector data = new Vector();应该Vector<Vector<Object>> data = new Vector<Vector<Object>>();

  4. 定义为局部变量(JFrameJTableJScrollpane),这是目前仍然是所有的对象是在你的GUI中可见,在整个应用程序的时间

  5. InitialThread,否则JFrame.pack()JFrame.setVisible(true)应裹成invokeLater()

  6. JTableJScrollPane没有返回正确Dimension,覆盖需要个任何JComponent然后JFrame.pack()返回正确的坐标包裹在JScrollPane

+0

请您详细说明第6点请 – HeadlessProgrammer 2013-04-23 15:03:29

+0

@HeadlessProgrammer [请在这里看到](http://stackoverflow.com/a/11858629/714968) – mKorbel 2013-04-23 17:08:48

0

这主要方法将让你我能看到的JFrame,将其设置为你的系统的外观和感觉。即Windows操作系统,这意味着JFrame将看起来像一个Windows对话框。

public static void main(String[] args) 
{ 
    try { 
     UIManager.setLookAndFeel(UIManager.getSystemLookAndFeelClassName()); 
    } catch (Exception ignored) {} 
    MainWindow mainWindow = new MainWindow(); 
    mainWindow.setDefaultCloseOperation(EXIT_ON_CLOSE); 
    mainWindow.setLocationRelativeTo(null); 
    mainWindow.setVisible(true); 
    mainWindow.setSize(500,300); 
} 
+0

setVisible应该是最后调用的方法。 – 2013-04-23 14:31:40

+0

我同意,但我一直使用此代码,并完美地工作。 – 2013-04-23 14:33:04

+0

我试过那里,什么都没有发生:(谢谢,虽然真的很感谢帮助 – HeadlessProgrammer 2013-04-23 15:04:42