2013-03-24 102 views
0

我想編寫一個程序,允許用戶連接,查看和添加或刪除數據庫中的值。我被卡住了鞦韆部分。當我選擇一個組合框選項沒有發生,但我想創建一個像mysql工作臺的視圖。它假設是這樣的;用戶從組合框中選取一個表名稱,並可以從該表格和文本字段中查看列名稱,以在列名稱上添加新值或現有值。通過選擇JComboBox選項動態添加JTextFields和JLabels

我的代碼是這樣的,到目前爲止:

public class DBC extends JFrame{ 

static String tablo; 
static JTextField tf = new JTextField(20); 
static int columnCount; 
static JPanel tfPanel = new JPanel(); 
static JLabel depName = new JLabel("Name"); 
static JLabel depLocation = new JLabel("Location"); 
static Box box = new Box(BoxLayout.Y_AXIS); 

public static void main(String[] args) throws Exception { 

    Class.forName("com.mysql.jdbc.Driver"); 
    Connection connect = DriverManager.getConnection("jdbc:mysql://localhost:3306/project" 
       ,"root","123456789"); 

    final Statement statement = connect.createStatement(); 

    JLabel tabloSec = new JLabel("Tablo Seçin:"); 
    final JComboBox<String> tablolar = new JComboBox<String>(); 
    DatabaseMetaData md = connect.getMetaData(); 
    final ResultSet rs = md.getTables(null, null, "%", null); 
    while (rs.next()) { 
     tablolar.addItem(rs.getString(3)); 
    } 

    tablolar.addActionListener(new ActionListener(){ 

     @Override 
     public void actionPerformed(ActionEvent arg0) { 

      tablo = tablolar.getSelectedItem().toString(); 

      try { 
       columnCount = rs.getMetaData().getColumnCount(); 
       for(int i=0;i<=columnCount;i++){ 

         box.add(tf); 
        } 
      } catch (SQLException e) { 
       // TODO Auto-generated catch block 
       e.printStackTrace(); 
      } 
     } 
    }); 

    JButton ekle = new JButton("Ekle"); 
    ekle.addActionListener(new ActionListener(){ 

     @Override 
     public void actionPerformed(ActionEvent e) { 

      try { 
       switch(tablo){ 
       case "department": 

        statement.executeUpdate("INSERT INTO department(Name,Location) VALUES('"+tf.getText()+"')"); 
       case "employee": 

        statement.executeUpdate("INSERT INTO employee(Id,FirstName,LastName,Sex,Address,Email,Salary,BirthDate,JoinDate) VALUES('"+tf.getText()+"')"); 
       case "engineer": 

        statement.executeUpdate("INSERT INTO engineer(EngineerType) VALUES('"+tf.getText()+"')"); 
       case "manager": 

        statement.executeUpdate("INSERT INTO manager(Department) VALUES('"+tf.getText()+"')"); 
       case "project": 

        statement.executeUpdate("INSERT INTO project(Name,Number,Value) VALUES('"+tf.getText()+"')"); 
       case "secretary": 

        statement.executeUpdate("INSERT INTO secretary(TypingSpeed) VALUES('"+tf.getText()+"')"); 
       } 

      } catch (SQLException e1) { 
       // TODO Auto-generated catch block 
       e1.printStackTrace(); 
      } 
     } 
    }); 

    JButton cik = new JButton("Çık"); 
    cik.addActionListener(new ActionListener() { 

     @Override 
     public void actionPerformed(ActionEvent e) { 

      System.exit(0); 
     } 
    }); 

    JPanel panel = new JPanel(new GridLayout(4,3)); 

    panel.add(tabloSec); 
    panel.add(tablolar); 
    panel.add(box); 
    panel.revalidate(); 
    panel.add(ekle); 
    panel.add(cik); 

    JFrame frame = new JFrame("Deneme"); 
    frame.setSize(600,600); 
    frame.setLocationRelativeTo(null); 
    frame.add(panel); 
    frame.pack(); 
    frame.setVisible(true); 
    } 
} 
+0

如果您的問題與Swing相關,請嘗試創建示例以在此處發佈不需要數據庫的示例。然後其他人可以輕鬆調試您的問題。 – 2013-03-24 19:57:00

回答

1

遍歷結果集的元數據時,看起來就像是增加了相同的文本字段:box.add(tf);。這將只添加一次相同的文本字段。添加新控件後,您還需要validate()repaint()box容器。請注意,在選擇新表格時,您還需要從box容器中刪除所有控件。您可能需要介紹滾動窗格。另外,SQL語句執行引用相同的文本字段。除非當然只有一列和一個總是應該更新的值。總而言之,除非這是針對一組非常具體的表格的解決方案,否則您可以考慮使用更友好的控件,可能是列表或表格。也許類似於屬性表,其中第一列指定屬性的名稱,第二列是該屬性的值。值列是可編輯的。選擇新的SQL表後,您可以重新填充屬性表。然後在語句執行上,收集所有必要的值。作爲替代方案,您還可以顯示SQL表的相關視圖,並讓用戶調整任何值,然後在完成後更新SQL。看看@camickr的Table From Database

另請注意,您不應該在Event Dispatch Thread上執行SQL語句,這可能會凍結您的用戶界面,因爲長期操作會阻止EDT。這些操作應該在輔助工作線程上處理。請參閱Event Dispatch Thread。通常使用SwingWorker來處理如此冗長的任務。