0

JComboBoxコンポーネントに関するヘルプが必要です。MySQL データベースからデータをロードし、このデータをコンボに書き込みました。で 4 つのコンボ ボックスを使用しItemListenerます。1 つのコンボ ボックスを変更すると、すべての子コンボ ボックスがデータベースからデータをリロードします。1 番目と 2 番目は正常に機能しますが、3 番目と 4 番目は正常な値を示しませんが、適切な値が存在します。私だけは見せません。その後、コンボボックスで空のフィールドを選択すると、良い結果が得られます。

ソースコード:

public class Vyhladat extends Okno {
    private static final long serialVersionUID = 1L;
    JComboBox nominalBOX,statBOX,podpisBOX,tlacDoskaBOX;
    Font sherif = new Font("Sherif",Font.BOLD,20);
    Font normal = new Font("Sherif",Font.PLAIN,20);
    JFrame uh = new JFrame();
            private String adresa="jdbc:mysql://localhost:3306/jarodb";
    private String meno="JKARAK";
    private String heslo="bankovka";
    String nominal,stat,podpis,tlacDoska,statH;
    private String nominalSQL = "SELECT DISTINCT(nominal) FROM prehlad";
    private String statSQL = "SELECT DISTINCT(concat(stat,'/',seria)) FROM prehlad WHERE nominal=? ORDER BY stat";
    private String podpisSQL = "SELECT DISTINCT(podpis) FROM prehlad WHERE nominal=? AND stat=? ";
    private String tlacDoskaSQL = "SELECT DISTINCT(doska) FROM prehlad WHERE nominal=? AND stat=? AND podpis=? ";

    Vector nominalV=new Vector();
    Vector statV=new Vector();
    Vector podpisV=new Vector();
    Vector tlacDoskaV=new Vector();

    Vyhladat()
    {

        vlozPopis(nominalLAB,"NOMIN\u00C1L EUROBANKOVKY:   ",0,0,sherif);
        vlozPopis(statLAB,"\u0160T\u00C1T/S\u00C9RIA:",0,1,sherif);
        vlozPopis(podpisLAB,"PODPIS:",0,2,sherif);
        vlozPopis(tlacDoskaLAB,"TLA\u010COV\u00C1 DOSKA:",0,3,sherif);

        gbc.gridx=1;
        gbc.gridy=0;
        nacitajVyber(nominalSQL,nominalBOX,nominalV,false,false,false);
        nominalBOX = new JComboBox(nominalV);

        nominalBOX.addItemListener(new ItemListener()
        {
            public void itemStateChanged(ItemEvent e) 
            {
                nominal = (String)nominalBOX.getSelectedItem();

                if(nominal!=" ")
                {
                    nacitajVyber(statSQL,statBOX,statV,true,false,false);
                }
                else{
                    statBOX.removeAllItems();
                    podpisBOX.removeAllItems();
                    tlacDoskaBOX.removeAllItems();
                    }
            }   
        });
        nominalBOX.setPrototypeDisplayValue("500");
        nominalBOX.setFont(normal);
        nominalBOX.setSelectedIndex(0);
        nominalBOX.setToolTipText("Vyber z mo\u017Enost\u00ED nomin\u00E1lu bankoviek 5,10,20,50.");
        add(nominalBOX,gbc);

        gbc.gridx=1;
        gbc.gridy=1;
        statV.add(" ");
        statBOX= new JComboBox(statV);
        statBOX.addItemListener(new ItemListener()
        {
            public void itemStateChanged(ItemEvent e) 
            {
                stat = (String)statBOX.getSelectedItem();

                if(stat!=null)
                {
                    String [] statM= stat.split("/");
                    statH = statM[0];
                }

                if(stat!=" " & stat!=null)
                {
                    nacitajVyber(podpisSQL,podpisBOX,podpisV,false,true,false);
                }
                else{
                  podpisBOX.removeAllItems();
                  tlacDoskaBOX.removeAllItems();
                    }
            }   
        });
        statBOX.setPrototypeDisplayValue("Portugalsko/E");
        statBOX.setFont(normal);
        statBOX.setSelectedIndex(0);
        statBOX.setToolTipText("Vyber z mo\u017Enost\u00ED \u0161t\u00E1t/s\u00E9riu.");
        add(statBOX,gbc);

        gbc.gridx=1;
        gbc.gridy=2;
        podpisV.add(" ");
        podpisBOX = new JComboBox(podpisV);
        podpisBOX.addItemListener(new ItemListener()
        {
            public void itemStateChanged(ItemEvent e) 
            {
                podpis = (String)podpisBOX.getSelectedItem();

                if(podpis!=" " & podpis!=null)
                {
                    nacitajVyber(tlacDoskaSQL,tlacDoskaBOX,tlacDoskaV,false,false,true);
                }
                else{
                  tlacDoskaBOX.removeAllItems();
                    }
            }   
        });
        podpisBOX.setPrototypeDisplayValue("Jean-Claude Trichet ");
        podpisBOX.setFont(normal);
        podpisBOX.setSelectedIndex(0);
        podpisBOX.setToolTipText("Vyber z mo\u017Enost\u00ED troch podpisov.");
        add(podpisBOX,gbc);

        gbc.gridx=1;
        gbc.gridy=3;
        tlacDoskaV.add(" ");
        tlacDoskaBOX = new JComboBox(tlacDoskaV);

        tlacDoskaBOX.addItemListener(new ItemListener()
        {
            public void itemStateChanged(ItemEvent e) 
            {
                tlacDoska = (String)tlacDoskaBOX.getSelectedItem();

                if((nominal!=" " & nominal!=null) & (statH!=" " & statH!=null) & (podpis!=" " & podpis!=null) & (tlacDoska!=" " & tlacDoska!=null))
                {
                    zobraz.setEnabled(true);
                }

            }   
        });
        tlacDoskaBOX.setPrototypeDisplayValue("E010");
        tlacDoskaBOX.setFont(normal);
        tlacDoskaBOX.setSelectedIndex(0);
        tlacDoskaBOX.setToolTipText("Vyber z mo\u017Enost\u00ED tla\u010Dov\u00FDch dosiek.");
        add(tlacDoskaBOX,gbc);
}
private void nacitajVyber(String sqlDotaz, JComboBox chr,Vector v,
        boolean jedna,boolean dva, boolean tri)
{
    try
    {
        Class.forName("com.mysql.jdbc.Driver");
        Connection conn = DriverManager.getConnection(adresa,meno,heslo);
        PreparedStatement stmt = conn.prepareStatement(sqlDotaz);
        if(jedna==true)
            {
            chr.removeAllItems();
        stmt.setString(1, nominal);
        }
        if(dva==true)
        {
                    chr.removeAllItems();
            stmt.setString(1, nominal);
            stmt.setString(2, statH);
        }
        if(tri==true)
        {
                    chr.removeAllItems();
            stmt.setString(1, nominal);
            stmt.setString(2, statH);
            stmt.setString(3, podpis);
        }

        ResultSet rs = stmt.executeQuery();
           v.addElement(" ");
            while (rs.next())
                {v.addElement(rs.getString(1).trim());
            System.out.println(rs.getString(1));}



        validate();
        rs.close();
        stmt.close();
        conn.close();
    }
    catch(Exception e){
        JOptionPane.showMessageDialog(uh,e.toString(),
                "Chyba pripojenia",
                JOptionPane.ERROR_MESSAGE);
    }

}
}
4

2 に答える 2

3
  • JComboBox はどういうわけか下層の Vector が変更されていることを認識していません。その場で JComboBox 用にこの配列を再初期化する必要がありますが、これは間違った方法です。

  • JComboBox のアイテムを格納するためにXxxComboBoxModelを使用するためのランタイムの変更

  • JDBC または FileIO の場合、同時実行の問題が発生する可能性があります。すべての更新に必要な Swing JComponents (この場合は JComboBox とその XxxComboBoxModel)を EDT で実行する必要があります。

  • またはDatabaseからイベントを呼び出し、この (潜在的に) ハードで長時間実行されるタスクを にリダイレクトします。そうしないと、Swing GUI がフリーズするか、JDBC が終了するまで (マウスおよびキー イベントの場合) 応答しなくなります。Runnable#ThreadSwingWorkerWorkers Thread

  • SwingWorkers メソッド publish()、process()、および done()は、すべての出力が EDT で行われることを非常に適切に保証します。

例えば

import java.awt.*;
import java.awt.event.*;
import java.util.*;
import javax.swing.*;

public class ComboBoxTwo extends JFrame implements ActionListener, ItemListener {

    private static final long serialVersionUID = 1L;
    private JComboBox mainComboBox;
    private JComboBox subComboBox;
    private Hashtable<Object, Object> subItems = new Hashtable<Object, Object>();

    public ComboBoxTwo() {
        String[] items = {"Select Item", "Color", "Shape", "Fruit"};
        mainComboBox = new JComboBox(items);
        mainComboBox.addActionListener(this);
        mainComboBox.addItemListener(this);
        //prevent action events from being fired when the up/down arrow keys are used
        //mainComboBox.putClientProperty("JComboBox.isTableCellEditor", Boolean.TRUE);
        getContentPane().add(mainComboBox, BorderLayout.WEST);
        subComboBox = new JComboBox();//  Create sub combo box with multiple models
        subComboBox.setPrototypeDisplayValue("XXXXXXXXXX"); // JDK1.4
        subComboBox.addItemListener(this);
        getContentPane().add(subComboBox, BorderLayout.EAST);
        String[] subItems1 = {"Select Color", "Red", "Blue", "Green"};
        subItems.put(items[1], subItems1);
        String[] subItems2 = {"Select Shape", "Circle", "Square", "Triangle"};
        subItems.put(items[2], subItems2);
        String[] subItems3 = {"Select Fruit", "Apple", "Orange", "Banana"};
        subItems.put(items[3], subItems3);
//      mainComboBox.setSelectedIndex(1);
    }

    @Override
    public void actionPerformed(ActionEvent e) {
        String item = (String) mainComboBox.getSelectedItem();
        Object o = subItems.get(item);
        if (o == null) {
            subComboBox.setModel(new DefaultComboBoxModel());
        } else {
            subComboBox.setModel(new DefaultComboBoxModel((String[]) o));
        }
    }

    @Override
    public void itemStateChanged(ItemEvent e) {
        if (e.getStateChange() == ItemEvent.SELECTED) {
            if (e.getSource() == mainComboBox) {
                if (mainComboBox.getSelectedIndex() != 0) {
                    FirstDialog firstDialog = new FirstDialog(ComboBoxTwo.this,
                            mainComboBox.getSelectedItem().toString(), "Please wait,  Searching for ..... ");
                }
            } 
        }
    }

    private class FirstDialog extends JDialog { //sipmle simulation of JDBC events, by using Swing Timer

        private static final long serialVersionUID = 1L;

        FirstDialog(final Frame parent, String winTitle, String msgString) {
            super(parent, winTitle);
            setModalityType(Dialog.ModalityType.APPLICATION_MODAL);
            JLabel myLabel = new JLabel(msgString);
            JButton bNext = new JButton("Stop Processes");
            add(myLabel, BorderLayout.CENTER);
            add(bNext, BorderLayout.SOUTH);
            bNext.addActionListener(new ActionListener() {

                @Override
                public void actionPerformed(ActionEvent evt) {
                    setVisible(false);
                }
            });
            javax.swing.Timer t = new javax.swing.Timer(1000, new ActionListener() {

                @Override
                public void actionPerformed(ActionEvent e) {
                    setVisible(false);
                }
            });
            t.setRepeats(false);
            t.start();
            setLocationRelativeTo(parent);
            setSize(new Dimension(400, 100));
            setVisible(true);
        }
    }

    public static void main(String[] args) {
        JFrame frame = new ComboBoxTwo();
        frame.setDefaultCloseOperation(EXIT_ON_CLOSE);
        frame.pack();
        frame.setLocationRelativeTo(null);
        frame.setVisible(true);
    }
}
于 2013-01-25T11:28:52.257 に答える
0

GUI が正しく再描画できない可能性があります。あなたは、イベント ディスパッチ スレッドで懸命に取り組んでいます。このスレッドは itemStateChanged を呼び出します。しかし、このスレッドは GUI の再描画も担当しています。データベースでハードワークを実行させているため、それを停止しています。

代わりに、別のスレッドを使用してハードワークを行うことができます。

    public void itemStateChanged(ItemEvent e)
    {
        new Thread(new Runnable() {
            public void run() {
                ....あなたのコード...
            }
        })。始める();
    }

または、より適切な方法でこれを行う SwingWorker を見てください。

また、itemStateChanged は、選択ごとに 2 回呼び出される可能性があります。これが問題を引き起こしている可能性があります。「e.getStateChange()」を使用して、受信したイベントのタイプを確認します。選択されたものと選択されていないもの (古いアイテムから) を受け取る必要があります。

于 2013-01-25T11:24:11.283 に答える