gpt4 book ai didi

java - 通过选择 JComboBox 选项动态添加 JTextFields 和 JLabels

转载 作者:行者123 更新时间:2023-12-01 14:44:19 27 4
gpt4 key购买 nike

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

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

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

最佳答案

看起来您在迭代结果集的元数据时添加了相同的文本字段:box.add(tf);。这只会添加相同的文本字段一次。在向 box 容器添加新控件后,您还需要对其进行 validate()repaint() 操作。请注意,选择新表时,您还需要从 box 容器中删除所有控件。您可能需要引入滚动 Pane 。此外,SQL 语句执行引用相同的文本字段。当然,除非只有一列和一个始终应该更新的值。

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

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

关于java - 通过选择 JComboBox 选项动态添加 JTextFields 和 JLabels,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/15603036/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com