Welcome to ShenZhenJia Knowledge Sharing Community for programmer and developer-Open, Learning and Share
menu search
person
Welcome To Ask or Share your Answers For Others

Categories

I have 2 Jcombo Boxs: which is combo1 and combo2

I choose combo1 and I can get information for combo2 but The problem is I can get informatiob for combo2 but it is not updated. I also try to use updata.UI() but it doesn't help.

This is the code in side

public void actionPerformed(ActionEvent e) { 
    JComboBox cb = (JComboBox)e.getSource();
    String uname1 = (String)cb.getSelectedItem();

        combo2 = update(uname1);
        combo2.updateUI();

}

This is code inside update

protected JComboBox update(String name) {
    JComboBox tmp = new JComboBox();
    //Read Content from XML file (University is bigger than Year)
    NodeList nList = doc.getElementsByTagName("University");
    System.out.println("Inside Fn " + name);
    for(int i = 0 ; i < nList.getLength();i++) {
        Element el = (Element)nList.item(i);
        if(name.contentEquals(el.getAttributeNode("name").getNodeValue()))
        {
            NodeList tmpyList = el.getElementsByTagName("Year");
            for(int j = 0 ; j < tmpyList.getLength();j++) 
            {
                Element yl = (Element)tmpyList.item(j);
                System.out.println(yl.getAttribute("yr"));
                tmp.addItem(yl.getAttribute("yr"));
            }
        }
    }
    return tmp; //Return ComboBox to combo2
}

Thank you for your kindness, I try to use your code but it is not work (It still not update), please help me

This is my constructor

public JFrameExample() {
    String[] comboboxdefault = { "Select" };

    JComboBox combo1 = Universitylist();
    JComboBox combo2 = new JComboBox(comboboxdefault);
    JComboBox combo3 = new JComboBox(comboboxdefault);

    uList.addActionListener(this);
    yList.addActionListener(this);
    dList.addActionListener(this);


    JPanel student_information = new JPanel(new GridLayout(0,1));
    uList.setName("University List");
    yList.setName("Year List");

    // University List

    student_information.add(combo1);
    // Database Year List

    student_information.add(combo2);
    // Programme List

    student_information.add(combo3);
    //Add Components to this container, using the default FlowLayout.
    add(student_information);

}

This is the combo2 Update it is return String Array

protected String[] updateyList(String name)  
{
    String[] tmp = null;

           //Read from XML file
    for(int i = 0 ; i < nList.getLength();i++) {
        Element el = (Element)nList.item(i);
        if(name.contentEquals(el.getAttributeNode("name").getNodeValue()))
        {
            NodeList tmpyList = el.getElementsByTagName("Year");
            tmp = new String[tmpyList.getLength()];
            for(int j = 0 ; j < tmpyList.getLength();j++) 
            {
                Element yl = (Element)tmpyList.item(j);
                //Add to String Array
                tmp[j] = yl.getAttribute("yr");
            }
        }
    }

    return tmp;
}

In the Action Perform

public void actionPerformed(ActionEvent e) {
    JComboBox cb = (JComboBox)e.getSource();
    String uname1 = (String)cb.getSelectedItem();
    System.out.println(cb.getName()); // To make sure I got the combo1. 
    try {
        //I change to the model method 
        DefaultComboBoxModel model = new DefaultComboBoxModel(  updateyList(uname1) );
        System.out.println(model.getSize()); 
        combo2 = new JComboBox(); // If I don't have this line it will throw  error Exception in thread "AWT-EventQueue-0" java.lang.NullPointerException
        combo2.setModel(model);

    } catch (ParserConfigurationException e1) {
        // TODO Auto-generated catch block
        e1.printStackTrace();
    } catch (SAXException e1) {
        // TODO Auto-generated catch block
        e1.printStackTrace();
    } catch (IOException e1) {
        // TODO Auto-generated catch block
        e1.printStackTrace();
    }

}

And this is for creating GUI function

private static void createAndShowLoginGUI() {

   //Create and set up the window.
    JFrame frame = new JFrame("Login");
    frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);

    //Create and set up the content pane.
    JFrameExample newContentPane = new JFrameExample();
    newContentPane.setOpaque(true); //content panes must be opaque
    frame.setContentPane(newContentPane);

    //Display the window.
    frame.pack();
    frame.setVisible(true);
}

This is main function

public static void main(String[] args)
{
    //Schedule a job for the event-dispatching thread:

    //creating and showing this application's GUI.

    javax.swing.SwingUtilities.invokeLater(new Runnable() {
        public void run() {
            createAndShowLoginGUI(); 
        }
    });
}

I think I did something wrong but I don't know where

See Question&Answers more detail:os

与恶龙缠斗过久,自身亦成为恶龙;凝视深渊过久,深渊将回以凝视…
thumb_up_alt 0 like thumb_down_alt 0 dislike
643 views
Welcome To Ask or Share your Answers For Others

1 Answer

There is no need to use the updateUI() method.

If you want to change the data in the second combo box then you should change the model (DON'T create a new combo box):

comboBox2.setModel(...);

It will repaint itself automaitcally. You can create a DefaultComboBoxModel and add the data directly to it.

Edit:

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

public class ComboBoxTwo extends JFrame implements ActionListener
{
    private JComboBox mainComboBox;
    private JComboBox subComboBox;
    private Hashtable subItems = new Hashtable();

    public ComboBoxTwo()
    {
        String[] items = { "Select Item", "Color", "Shape", "Fruit" };
        mainComboBox = new JComboBox( items );
        mainComboBox.addActionListener( 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 );

        //  Create sub combo box with multiple models

        subComboBox = new JComboBox();
        subComboBox.setPrototypeDisplayValue("XXXXXXXXXX"); // JDK1.4
        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);
    }

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

    public static void main(String[] args)
    {
        JFrame frame = new ComboBoxTwo();
        frame.setDefaultCloseOperation( EXIT_ON_CLOSE );
        frame.pack();
        frame.setLocationRelativeTo( null );
        frame.setVisible( true );
     }
}

与恶龙缠斗过久,自身亦成为恶龙;凝视深渊过久,深渊将回以凝视…
thumb_up_alt 0 like thumb_down_alt 0 dislike
Welcome to ShenZhenJia Knowledge Sharing Community for programmer and developer-Open, Learning and Share
...