swing:combo_box

Combo Boxes

Ένα Combo Box αποτελείται από μία drop-down λίστα. Τα combo boxes διακρίνονται σε editable και non-editable combo boxes. Σε αναλογία με την κλάση JList, η κλάση java.swing.JComboBox απαιτεί την χρήση μία κλάσης τύπου javax.swing.ComboBoxModel για την διαχείριση των δεδομένων. Μπορείτε να επιλέξετε έναν πίνακα ή ένα αντικείμενο της κλάσης Vector για την αρχικοποίηση του Combo Box, θα πρέπει όμως να έχετε υπόψη σας ότι σε αυτή την περίπτωση τα περιεχόμενα του ComboBox δεν μπορούν να μεταβληθούν.

By default ένα Combo Box είναι non-editable. Προκειμένου να είναι editable απαιτείται μία δήλωση της μορφής

comboList.setEditable(true);

Listener Interface

Ένα Combo Box συνδέεται με ένα ή περισσότερα αντικείμενα του τύπου ActionListener. Για να εντοπίσετε την επιλογή του χρήστη αρκεί να κάνετε τα εξής (με την προϋπόθεση ότι έχετε ορίσει τον κατάλληλο Listener για το ComboBox σας):

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

Παρακάτω δίνονται δύο παραδείγματα από το site της Oracle, ένα για non-editable combo box και ένα για editable combo box.

Νon-editable combo box

ComboBoxDemo.java
package components;
 
import java.awt.*;
import java.awt.event.*;
import javax.swing.*;
 
/*
 * ComboBoxDemo.java uses these additional files:
 *   images/Bird.gif
 *   images/Cat.gif
 *   images/Dog.gif
 *   images/Rabbit.gif
 *   images/Pig.gif
 */
public class ComboBoxDemo extends JPanel
              implements ActionListener {
  JLabel picture;
 
  public ComboBoxDemo() {
    super(new BorderLayout());
 
    String[] petStrings = { "Bird", "Cat", "Dog", "Rabbit", "Pig" };
 
    //Create the combo box, select the item at index 4.
    //Indices start at 0, so 4 specifies the pig.
    JComboBox petList = new JComboBox(petStrings);
    petList.setSelectedIndex(4);
    petList.addActionListener(this);
 
    //Set up the picture.
    picture = new JLabel();
    picture.setFont(picture.getFont().deriveFont(Font.ITALIC));
    picture.setHorizontalAlignment(JLabel.CENTER);
    updateLabel(petStrings[petList.getSelectedIndex()]);
    picture.setBorder(BorderFactory.createEmptyBorder(10,0,0,0));
 
    //The preferred size is hard-coded to be the width of the
    //widest image and the height of the tallest image + the border.
    //A real program would compute this.
    picture.setPreferredSize(new Dimension(177, 122+10));
 
    //Lay out the demo.
    add(petList, BorderLayout.PAGE_START);
    add(picture, BorderLayout.PAGE_END);
    setBorder(BorderFactory.createEmptyBorder(20,20,20,20));
  }
 
  /** Listens to the combo box. */
  public void actionPerformed(ActionEvent e) {
    JComboBox cb = (JComboBox)e.getSource();
    String petName = (String)cb.getSelectedItem();
    updateLabel(petName);
  }
 
  protected void updateLabel(String name) {
    ImageIcon icon = createImageIcon("images/" + name + ".gif");
    picture.setIcon(icon);
    picture.setToolTipText("A drawing of a " + name.toLowerCase());
    if (icon != null) {
      picture.setText(null);
    } else {
      picture.setText("Image not found");
    }
  }
 
  /** Returns an ImageIcon, or null if the path was invalid. */
  protected static ImageIcon createImageIcon(String path) {
    java.net.URL imgURL = ComboBoxDemo.class.getResource(path);
    if (imgURL != null) {
      return new ImageIcon(imgURL);
    } else {
      System.err.println("Couldn't find file: " + path);
      return null;
    }
  }
 
  /**
   * Create the GUI and show it.  For thread safety,
   * this method should be invoked from the
   * event-dispatching thread.
   */
  private static void createAndShowGUI() {
    //Create and set up the window.
    JFrame frame = new JFrame("ComboBoxDemo");
    frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
 
    //Create and set up the content pane.
    JComponent newContentPane = new ComboBoxDemo();
    newContentPane.setOpaque(true); //content panes must be opaque
    frame.setContentPane(newContentPane);
 
    //Display the window.
    frame.pack();
    frame.setVisible(true);
  }
 
  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() {
        createAndShowGUI();
      }
    });
  }
}

Το παραπάνω πρόγραμμα προϋποθέτει τις παρακάτω εικόνες animals.zip.

Εditable combo box

ComboBoxDemo2.java
package components;
 
import java.awt.*;
import java.awt.event.*;
import javax.swing.*;
import javax.swing.border.*;
import java.util.*;
import java.text.SimpleDateFormat;
 
/* ComboBoxDemo2.java requires no other files. */
public class ComboBoxDemo2 extends JPanel
               implements ActionListener {
  static JFrame frame;
  JLabel result;
  String currentPattern;
 
  public ComboBoxDemo2() {
    setLayout(new BoxLayout(this, BoxLayout.PAGE_AXIS));
    String[] patternExamples = {
         "dd MMMMM yyyy",
         "dd.MM.yy",
         "MM/dd/yy",
         "yyyy.MM.dd G 'at' hh:mm:ss z",
         "EEE, MMM d, ''yy",
         "h:mm a",
         "H:mm:ss:SSS",
         "K:mm a,z",
         "yyyy.MMMMM.dd GGG hh:mm aaa"
         };
 
    currentPattern = patternExamples[0];
 
    //Set up the UI for selecting a pattern.
    JLabel patternLabel1 = new JLabel("Enter the pattern string or");
    JLabel patternLabel2 = new JLabel("select one from the list:");
 
    JComboBox patternList = new JComboBox(patternExamples);
    patternList.setEditable(true);
    patternList.addActionListener(this);
 
    //Create the UI for displaying result.
    JLabel resultLabel = new JLabel("Current Date/Time",
                    JLabel.LEADING); //== LEFT
    result = new JLabel(" ");
    result.setForeground(Color.black);
    result.setBorder(BorderFactory.createCompoundBorder(
       BorderFactory.createLineBorder(Color.black),
       BorderFactory.createEmptyBorder(5,5,5,5)
    ));
 
    //Lay out everything.
    JPanel patternPanel = new JPanel();
    patternPanel.setLayout(new BoxLayout(patternPanel,
                 BoxLayout.PAGE_AXIS));
    patternPanel.add(patternLabel1);
    patternPanel.add(patternLabel2);
    patternList.setAlignmentX(Component.LEFT_ALIGNMENT);
    patternPanel.add(patternList);
 
    JPanel resultPanel = new JPanel(new GridLayout(0, 1));
    resultPanel.add(resultLabel);
    resultPanel.add(result);
 
    patternPanel.setAlignmentX(Component.LEFT_ALIGNMENT);
    resultPanel.setAlignmentX(Component.LEFT_ALIGNMENT);
 
    add(patternPanel);
    add(Box.createRigidArea(new Dimension(0, 10)));
    add(resultPanel);
 
    setBorder(BorderFactory.createEmptyBorder(10,10,10,10));
 
    reformat();
  } //constructor
 
  public void actionPerformed(ActionEvent e) {
    JComboBox cb = (JComboBox)e.getSource();
    String newSelection = (String)cb.getSelectedItem();
    currentPattern = newSelection;
    reformat();
  }
 
  /** Formats and displays today's date. */
  public void reformat() {
    Date today = new Date();
    SimpleDateFormat formatter =
       new SimpleDateFormat(currentPattern);
    try {
      String dateString = formatter.format(today);
      result.setForeground(Color.black);
      result.setText(dateString);
    } catch (IllegalArgumentException iae) {
      result.setForeground(Color.red);
      result.setText("Error: " + iae.getMessage());
    }
  }
 
  /**
   * Create the GUI and show it.  For thread safety,
   * this method should be invoked from the
   * event-dispatching thread.
   */
  private static void createAndShowGUI() {
    //Create and set up the window.
    JFrame frame = new JFrame("ComboBoxDemo2");
    frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
 
    //Create and set up the content pane.
    JComponent newContentPane = new ComboBoxDemo2();
    newContentPane.setOpaque(true); //content panes must be opaque
    frame.setContentPane(newContentPane);
 
    //Display the window.
    frame.pack();
    frame.setVisible(true);
  }
 
  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() {
        createAndShowGUI();
      }
    });
  }
}
swing/combo_box.txt · Last modified: 2016/02/26 11:15 (external edit)