0

我想编写一个程序,允许用户连接、查看和添加或删除数据库中的值。我被摆动部分卡住了。当我选择一个组合框选项时,什么也没有发生,但我想创建一个像 mysql 工作台这样的视图。应该是这样的;用户从组合框中选择一个表名,并且可以从该表和文本字段中查看列名,以在列名上方添加新值或现有值。

到目前为止,我的代码是这样的:

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);
  }
}
4

1 回答 1

1

看起来您在遍历结果集的元数据时添加了相同的文本字段:box.add(tf);. 这将只添加一次相同的文本字段。在向容器添加新控件后,您还需要validate()和容器。请注意,在选择新表时,您还需要从容器中删除所有控件。您可能需要引入滚动窗格。另外,SQL 语句的执行是指同一个文本域。除非当然只有一列和一个值总是应该更新。repaint()boxbox

总而言之,除非这是针对一组非常具体的表格的非常具体的解决方案,否则您可以考虑为此使用更友好的控件,可能是列表或表格。可能类似于属性表,其中第一列指定属性的名称,第二列指定该属性的值。值列是可编辑的。选择新的 SQL 表后,您可以重新填充属性表。然后在执行语句时,只需收集所有必要的值。作为替代方案,您还可以显示 SQL 表的相关视图,让用户调整任何值,然后在完成后更新 SQL。查看@camickr 的数据库中的表。

另请注意,您不应在 上执行 SQL 语句Event Dispatch Thread,这可能会冻结您的 UI,因为长时间操作会阻塞 EDT。这些操作应该在辅助工作线程上处理。请参阅事件调度线程。使用SwingWorker来处理这些冗长的任务是很常见的。

于 2013-03-24T21:42:13.420 回答