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);。これにより、同じテキスト フィールドが 1 回だけ追加されます。また、新しいコントロールを追加した後、コンテナーを作成する必要がありvalidate()ます。新しいテーブルを選択するときは、コンテナからすべてのコントロールを削除する必要があることに注意してください。スクロール ペインを導入する必要があるかもしれません。さらに、SQL ステートメントの実行は、同じテキスト フィールドを参照します。もちろん、常に更新する必要がある列と値が1つしかない場合を除きます。repaint()boxbox

全体として、これが非常に特定のテーブルのセットに対する非常に特定のソリューションでない限り、おそらくリストやテーブルなど、より使いやすいコントロールを使用することを検討できます。最初の列がプロパティの名前を指定し、2 番目の列がそのプロパティの値を指定するプロパティ テーブルに似たものかもしれません。値列は編集可能です。新しい SQL テーブルが選択されると、プロパティ テーブルを再設定できます。次に、ステートメントの実行時に、必要な値をすべて収集します。別の方法として、SQL テーブルの関連するビューを表示し、ユーザーが値を微調整して、完了したら SQL を更新できるようにすることもできます。@camickrのTable From Databaseを見てください。

また、 で SQL ステートメントを実行しないでEvent Dispatch Threadください。長時間の操作で EDT がブロックされるため、UI がフリーズする可能性があります。これらの操作は、補助ワーカー スレッドで処理する必要があります。イベントディスパッチスレッドを参照してください。このような時間のかかるタスクを処理 するには、 SwingWorkerを使用するのが一般的です。

于 2013-03-24T21:42:13.420 に答える