【问题标题】:Action listener on comboBox to display selection in textField组合框上的动作侦听器以在 textField 中显示选择
【发布时间】:2014-06-28 02:05:49
【问题描述】:

我有一个包含选择的组合框。我正在尝试应用 actionListener 在 textField 上显示选定的字符串。我不知道如何完成这个,我所读到的一切让我更加困惑。

这是组合框的代码:

JComboBox comboBox = new JComboBox();
        comboBox.setModel(new DefaultComboBoxModel(new String[] {"Select Something", "Selection 1", "Selection 2", "Selection 3", "Selection 4"}));
        panelTop.add(comboBox);
        comboBox.setPreferredSize(new Dimension(160, 20));
        comboBox.addItem("Select Something");

文本域代码:

textField = new JTextField();
        panelTop.add(textField);
        textField.setColumns(40);

到目前为止我对 actionListener 的了解:

public void actionPerformed(ActionEvent e) {
            JComboBox comboBox = (JComboBox)e.getSource();
            String newSelection = (String)comboBox.getSelectedItem();
            currentPattern = newSelection;

        }

完整代码:

package SwingAssign2;

import java.awt.Dimension;
import java.awt.EventQueue;

import javax.swing.BorderFactory;
import javax.swing.JFrame;
import javax.swing.JLabel;
import javax.swing.JPanel;
import javax.swing.JScrollPane;
import javax.swing.JTextPane;

import java.awt.BorderLayout;

import javax.swing.JComboBox;
import javax.swing.JTextField;

import java.awt.FlowLayout;

import javax.swing.SwingConstants;

import java.awt.GridLayout;
import java.awt.event.ActionEvent;
import java.awt.event.ItemEvent;
import java.awt.event.ItemListener;

import javax.swing.DefaultComboBoxModel;

public class SwingAssign2 {

    private JFrame frame;
    private JTextField textField;

    /**
     * Launch the application.
     */
    public static void main(String[] args) {
        EventQueue.invokeLater(new Runnable() {
            public void run() {
                try {
                    SwingAssign2 window = new SwingAssign2();
                    window.frame.setVisible(true);
                } catch (Exception e) {
                    e.printStackTrace();
                }
            }
        });
    }

    /**
     * Create the application.
     */
    public SwingAssign2() {
        initialize();
    }

    /**
     * Initialize the contents of the frame.
     */
    private void initialize() {
        frame = new JFrame();
        frame.setSize(600, 500);
        frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);

        JPanel panelTop = new JPanel();
        FlowLayout fl_panelTop = (FlowLayout) panelTop.getLayout();
        fl_panelTop.setAlignment(FlowLayout.LEFT);
        frame.getContentPane().add(panelTop, BorderLayout.NORTH);
        //panel.setLayout(new FlowLayout(FlowLayout.LEFT, 5, 5));

        final JComboBox comboBox = new JComboBox();
        comboBox.setModel(new DefaultComboBoxModel(new String[] {"Select Something", "Selection 1", "Selection 2", "Selection 3", "Selection 4"}));
        panelTop.add(comboBox);
        comboBox.setPreferredSize(new Dimension(160, 20));
        comboBox.addItem("Select Something");


        textField = new JTextField();
        panelTop.add(textField);
        textField.setColumns(40);

        JPanel panelBottom = new JPanel();
        frame.getContentPane().add(panelBottom, BorderLayout.SOUTH);
        panelBottom.setLayout(new BorderLayout(0, 0));

        JLabel status = new JLabel("Status");
        status.setHorizontalAlignment(SwingConstants.CENTER);
        panelBottom.add(status, BorderLayout.SOUTH);
        status.setBorder(BorderFactory.createLoweredBevelBorder());

        JTextPane txtpnSomeContentOn_B = new JTextPane();
        txtpnSomeContentOn_B.setText("Some content on the bottom panel\r\nMore content\r\nSome more content\r\nMore and more content\r\nMore and more content\r\nMore and more content\r\nMore and more content\r\nMore and more content\r\nMore and more content\r\nMore and more content\r\nMore and more content\r\nMore and more content\r\nMore and more content\r\nMore and more content\r\nMore and more content\r\nMore and more content\r\nMore and more content\r\nMore and more content\r\nMore and more content\r\nMore and more content\r\nMore and more content\r\nMore and more content");
        JScrollPane jScrollPane3 = new JScrollPane(txtpnSomeContentOn_B);
        jScrollPane3.setHorizontalScrollBarPolicy(
                JScrollPane.HORIZONTAL_SCROLLBAR_ALWAYS);
        jScrollPane3.setVerticalScrollBarPolicy(
                JScrollPane.VERTICAL_SCROLLBAR_ALWAYS);
        panelBottom.add(jScrollPane3, BorderLayout.NORTH);
        jScrollPane3.setPreferredSize(new Dimension(200, 200));
        //bText.setBorder(BorderFactory.createLoweredBevelBorder());

        JPanel panelCenter = new JPanel();
        frame.getContentPane().add(panelCenter, BorderLayout.CENTER);
        panelCenter.setLayout(new GridLayout(0, 2, 0, 0));

        JTextPane txtpnSomeContentOn_0 = new JTextPane();
        txtpnSomeContentOn_0.setText("Some content on the left panel\r\nMore content\r\nSome more content\r\nMore and more content\r\nMore and more content\r\nMore and more content\r\nMore and more content\r\nMore and more content\r\nMore and more content\r\nMore and more content\r\nMore and more content\r\nMore and more content\r\nMore and more content\r\nMore and more content\r\nMore and more content\r\nMore and more content\r\nMore and more content\r\nMore and more content\r\nMore and more content\r\nMore and more content\r\nMore and more content\r\nMore and more content");
        JScrollPane jScrollPane1 = new JScrollPane(txtpnSomeContentOn_0);
        jScrollPane1.setHorizontalScrollBarPolicy(
                JScrollPane.HORIZONTAL_SCROLLBAR_ALWAYS);
        jScrollPane1.setVerticalScrollBarPolicy(
                JScrollPane.VERTICAL_SCROLLBAR_ALWAYS);
        panelCenter.add(jScrollPane1);

        JTextPane txtpnSomeContentOn = new JTextPane();
        txtpnSomeContentOn.setText("Some content on the right panel\r\nMore content\r\nSome more content\r\nMore and more content\r\nMore and more content\r\nMore and more content\r\nMore and more content\r\nMore and more content\r\nMore and more content\r\nMore and more content\r\nMore and more content\r\nMore and more content\r\nMore and more content\r\nMore and more content\r\nMore and more content\r\nMore and more content\r\nMore and more content\r\nMore and more content\r\nMore and more content\r\nMore and more content\r\nMore and more content\r\nMore and more content");
        JScrollPane jScrollPane2 = new JScrollPane(txtpnSomeContentOn);
        jScrollPane2.setHorizontalScrollBarPolicy(
                JScrollPane.HORIZONTAL_SCROLLBAR_ALWAYS);
        jScrollPane2.setVerticalScrollBarPolicy(
                JScrollPane.VERTICAL_SCROLLBAR_ALWAYS);
        panelCenter.add(jScrollPane2);

        comboBox.addItemListener(new ItemListener() {
            @Override
            public void itemStateChanged(ItemEvent e) {
                if(e.getStateChange() == ItemEvent.SELECTED) {
                    textField.setText((String) comboBox.getSelectedItem());
                }
            }
        });


    }

}

【问题讨论】:

    标签: java swing combobox


    【解决方案1】:

    考虑将ItemListener 添加到JComboBox 并检查ItemEvent 状态是否为ItemEvent.SELECTED。您可以在itemStateChanged 方法中设置文本字段的文本:

    comboBox.addItemListener(new ItemListener() {
        @Override
        public void itemStateChanged(ItemEvent e) {
            if(e.getStateChange() == ItemEvent.SELECTED) {
                textField.setText((String) comboBox.getSelectedItem());
            }
        }
    });
    

    【讨论】:

    • 好的,这似乎可行,谢谢!由于某种原因,当我添加侦听器时,我的 textField 不再呈现?我已经发布了完整的代码。
    • @KevinSchultz 您在panelTop 中使用了FlowLayout,而您添加的JTextField 太大而无法显示,导致它在JComboBox 下方换行。要么使 JTextField 更小,要么将 frame.pack(); 添加到 initialize() 方法的末尾。
    • 非常感谢。菜鸟问题, frame.pack() 做什么?完整的布局发生了变化,但我认为这是因为我将默认尺寸设置为其他字段。
    • @KevinSchultz 你可以参考pack()的API。本质上,它将窗口大小设置为所有窗口元素的首选大小。
    【解决方案2】:

    你在正确的轨道上。我不确定您现有的 actionListener 的上下文是什么,但您可以这样做的一种方法如下:

    comboBox.addItemListener(new ItemListener() {
       @Override
       public void itemStateChanged(ItemEvent arg0) { // picks up changes to combobox selection
          if (arg0.getStateChange() == ItemEvent.SELECTED) {
             String newSelection = comboBox.getSelectedItem(); // takes the selected item
             textField.setText(newSelection); // publishes to the textfield
          }
       }
    });
    

    【讨论】:

      【解决方案3】:

      将覆盖actionPerformed 方法的ActionListener 添加到组合框。请参阅下面的工作示例

      import java.awt.EventQueue;
      import java.util.Vector;
      
      import javax.swing.DefaultComboBoxModel;
      import javax.swing.GroupLayout;
      import javax.swing.GroupLayout.Alignment;
      import javax.swing.JFrame;
      import javax.swing.JPanel;
      import javax.swing.JTextField;
      import javax.swing.border.EmptyBorder;
      import javax.swing.JComboBox;
      
      import java.awt.event.ActionListener;
      import java.awt.event.ActionEvent;
      
      public class JTextFieldTest extends JFrame {
      
          private JPanel contentPane;
          private JTextField textField;
      
          /**
           * Launch the application.
           */
          public static void main(String[] args) {
              EventQueue.invokeLater(new Runnable() {
                  public void run() {
                      try {
                          JTextFieldTest frame = new JTextFieldTest();
                          frame.setVisible(true);
                      } catch (Exception e) {
                          e.printStackTrace();
                      }
                  }
              });
          }
      
          /**
           * Create the frame.
           */
          public JTextFieldTest() {
              setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
              setBounds(100, 100, 298, 220);
              contentPane = new JPanel();
              contentPane.setBorder(new EmptyBorder(5, 5, 5, 5));
              setContentPane(contentPane);
      
              Vector<String> comboBoxItems=new Vector();
              comboBoxItems.add("A");
              comboBoxItems.add("B");
              comboBoxItems.add("C");
              final DefaultComboBoxModel model = new DefaultComboBoxModel(comboBoxItems);
              final JComboBox comboBox = new JComboBox(model);
              comboBox.addActionListener(new ActionListener() {
                  public void actionPerformed(ActionEvent arg0) {//here your actionPerformed method
                      textField.setText((String) comboBox.getSelectedItem());
                  }
              });
      
              textField = new JTextField();
              textField.setColumns(10);
              GroupLayout gl_contentPane = new GroupLayout(contentPane);
              gl_contentPane.setHorizontalGroup(
                  gl_contentPane.createParallelGroup(Alignment.LEADING)
                      .addGroup(gl_contentPane.createSequentialGroup()
                          .addGroup(gl_contentPane.createParallelGroup(Alignment.LEADING)
                              .addGroup(gl_contentPane.createSequentialGroup()
                                  .addGap(110)
                                  .addComponent(comboBox, GroupLayout.PREFERRED_SIZE, GroupLayout.DEFAULT_SIZE, GroupLayout.PREFERRED_SIZE))
                              .addGroup(gl_contentPane.createSequentialGroup()
                                  .addGap(83)
                                  .addComponent(textField, GroupLayout.PREFERRED_SIZE, GroupLayout.DEFAULT_SIZE, GroupLayout.PREFERRED_SIZE)))
                          .addContainerGap(103, Short.MAX_VALUE))
              );
              gl_contentPane.setVerticalGroup(
                  gl_contentPane.createParallelGroup(Alignment.LEADING)
                      .addGroup(gl_contentPane.createSequentialGroup()
                          .addGap(37)
                          .addComponent(comboBox, GroupLayout.PREFERRED_SIZE, GroupLayout.DEFAULT_SIZE, GroupLayout.PREFERRED_SIZE)
                          .addGap(18)
                          .addComponent(textField, GroupLayout.PREFERRED_SIZE, GroupLayout.DEFAULT_SIZE, GroupLayout.PREFERRED_SIZE)
                          .addContainerGap(76, Short.MAX_VALUE))
              );
              contentPane.setLayout(gl_contentPane);
          }
      
      }
      

      【讨论】:

        【解决方案4】:

        我正在尝试应用 actionListener 以在 textField 上显示所选字符串

        JComboBox 上添加ActionListener 添加在JTextField 中设置文本。

        示例代码:

        final JTextField jTextField = new JTextField();
        
        final JComboBox<String> comboBox = new JComboBox<String>();
        comboBox.setModel(new DefaultComboBoxModel<String>(new String[] { 
            "Select Something", "Selection 1", "Selection 2",   
            "Selection 3", "Selection 4" }));
        
        // set first one selected
        comboBox.setSelectedIndex(0);
        
        comboBox.addActionListener(new ActionListener() {
            
            @Override
            public void actionPerformed(ActionEvent ae) {
                // check whether there is any selection
                if(comboBox.getSelectedIndex()!=-1){
                    jTextField.setText(comboBox.getSelectedItem().toString());
                }
            }
        });
        

        值得一读How to Use Combo Boxes

        几点:

        例如:

        final JPanel panel = new JPanel(){
        
            @Override
            public Dimension getPreferredSize() {
                return new Dimension(...,...);
            }
        };
        

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 2015-09-20
          • 1970-01-01
          • 1970-01-01
          • 2018-09-14
          • 1970-01-01
          • 2017-12-19
          • 1970-01-01
          • 2013-03-23
          相关资源
          最近更新 更多