Skip to content
Advertisement

I want the city selected in the first combo box not to appear in the second

If I choose a city FROM: JComboBox then it shouldn’t appear in TO: combo box. How can I code the ActionListener of this action listener?

Screenshot

Code:

public class CityFromTo {

    public static void main(String[] args) {
        
        String[] cFrom = {"Choose", "Istanbul", "New York", "London", "Milano", "Tokyo", "Paris", "Moscow", "Elâzığ"};
        String[] cTo = {"Choose", "Istanbul", "New York", "London", "Milano", "Tokyo", "Paris", "Moscow", "Elâzığ"};
        
        JLabel from = new JLabel("FROM : ");
        JLabel to = new JLabel("   TO : ");

        JComboBox comboFrom = new JComboBox(cFrom);
        JComboBox comboTo = new JComboBox(cTo);
        
        JFrame frame = new JFrame();
        frame.setLayout(new FlowLayout());

        frame.add(from);
        frame.add(comboFrom);
        frame.add(to);
        frame.add(comboTo);
        
        frame.setSize(400, 350);
        frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        frame.setLocationRelativeTo(null);
        frame.setVisible(true);
    }
}

Advertisement

Answer

I reworked your code to get away from static. You only need one list of cities for your from and to JComboBoxes.

You use an ActionListener to listen for changes in the from JComboBox, and remove the city from the to JComboBox. We remove the city by removing all the cities and adding them back, one at a time. This allows the user to change his mind about the from city.

Here’s the complete runnable code.

import java.awt.BorderLayout;
import java.awt.Dimension;
import java.awt.FlowLayout;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;

import javax.swing.BorderFactory;
import javax.swing.JComboBox;
import javax.swing.JFrame;
import javax.swing.JLabel;
import javax.swing.JPanel;
import javax.swing.SwingUtilities;

public class CityFromTo implements Runnable {
    
    public static void main(String[] args) {
       SwingUtilities.invokeLater(new CityFromTo());
    }
    
    private JComboBox<String> comboFrom;
    private JComboBox<String> comboTo;
    
    private String[] cities = {"Choose", "Istanbul", "New York", "London", 
            "Milano", "Tokyo", "Paris", "Moscow", "Elâzığ"};

    @Override
    public void run() {
        JFrame frame = new JFrame();
        frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        
        frame.add(createMainPanel(), BorderLayout.CENTER);
        
        frame.pack();
        frame.setLocationRelativeTo(null);
        frame.setVisible(true);
    }
    
    private JPanel createMainPanel() {
        JPanel panel = new JPanel(new FlowLayout());
        panel.setBorder(BorderFactory.createEmptyBorder(5, 5, 5, 5));
        panel.setPreferredSize(new Dimension(400, 350));
        
        JLabel from = new JLabel("FROM : ");
        panel.add(from);
        
        comboFrom = new JComboBox<>(cities);
        comboFrom.addActionListener(new FromListener());
        panel.add(comboFrom);
        
        JLabel to = new JLabel("   TO : ");
        panel.add(to);
        
        comboTo = new JComboBox<>(cities);
        panel.add(comboTo);
        
        return panel;
    }
    
    public class FromListener implements ActionListener {

        @Override
        public void actionPerformed(ActionEvent event) {
            String city = (String) comboFrom.getSelectedItem();
            comboTo.removeAllItems();
            for (String s : cities) {
                if (!s.equals(city)) {
                    comboTo.addItem(s);
                }
            }
        }
        
    }

}
User contributions licensed under: CC BY-SA
9 People found this is helpful
Advertisement