【问题标题】:Setting the text field in editable JComboBox from custom render从自定义渲染设置可编辑 JComboBox 中的文本字段
【发布时间】:2012-06-02 08:02:09
【问题描述】:

两个组合框使用相同的代码,唯一的例外是“组合 1”被设置为可编辑,而“组合 2”不​​是。两者都选择了“项目 1”。如您所见,“Combo 1”在组合文本字段中打印“[Ljava.lang.Object;@77905258”,“Combo 2”打印所选名称。

“Combo 1”如何在组合框文本字段中打印与“Combo 2”相同的文本?

符合E:(参考附图) If you click on "Combo 1" you will see the list of item 1, item 2... But the Text feild will show "[Ljava.lang.Object;@77905258" when item is selected (here it is item 1 that被选中)。

如果您单击“组合2”,则会看到第1项列表,第2项......和非可编辑文本,在选择“项目1”时将显示“项目1”。

代码如下:

我正在使用自定义渲染器:

public class MyListRenderer extends JLabel 
 implements ListCellRenderer{
  @Override
  public Component getListCellRendererComponent(
   JList list, Object value,
   int index, boolean isSelected,
   boolean cellHasFocus) {

    Object[] itemData =(Object[])value;        
    setText((String)itemData[1]);
    return this;
    } 
 }

这里是设置 2 个组合框列表的代码:

private void iniCombobox() {            
   cmbMyCombo.addItem(new Object[] {"1", "Item 1"});
   cmbMyCombo.addItem(new Object[] {"2", "Item 2"});
   cmbMyCombo.addItem(new Object[] {"3", "Item 3"});

   cmbMyCombo2.addItem(new Object[] {"1", "Item 1"});
   cmbMyCombo2.addItem(new Object[] {"2", "Item 2"});
   cmbMyCombo2.addItem(new Object[] {"3", "Item 3"});

   cmbMyCombo.setRenderer(new MyListRenderer());
   cmbMyCombo2.setRenderer(new MyListRenderer());       
}

这是事件的代码。这将设置每个选定项目的文本字段:

private void cmbMyComboActionPerformed(
 java.awt.event.ActionEvent evt) {
    Object mySelectedItem = cmbMyCombo.getSelectedItem();
    Object myObject[] = (Object[])mySelectedItem;
    txtID.setText(myObject[0].toString());
    txtName.setText(myObject[1].toString());        
}

private void cmbMyCombo2ActionPerformed(
 java.awt.event.ActionEvent evt) {
    Object mySelectedItem = cmbMyCombo.getSelectedItem();
    Object myObject[] = (Object[])mySelectedItem;
    txtID1.setText(myObject[0].toString());
    txtName1.setText(myObject[1].toString());  
}

这里是完整的代码,可以剪切和过去以符合 SC 和 C。不要忘记添加自定义渲染器“MyListRenderer”类。 (使用 NetBean 7.1 编译):

package combobox;

public class MyComboBox extends javax.swing.JFrame {

public MyComboBox() {
    initComponents();
    iniCombobox();
}
private void initComponents() {

    jPanel1 = new javax.swing.JPanel();
    cmbMyCombo = new javax.swing.JComboBox();
    lblId = new javax.swing.JLabel();
    txtID = new javax.swing.JTextField();
    lblName = new javax.swing.JLabel();
    txtName = new javax.swing.JTextField();
    jPanel2 = new javax.swing.JPanel();
    cmbMyCombo2 = new javax.swing.JComboBox();
    txtID1 = new javax.swing.JTextField();
    lblId1 = new javax.swing.JLabel();
    txtName1 = new javax.swing.JTextField();
    lblName1 = new javax.swing.JLabel();

    setDefaultCloseOperation(javax.swing.WindowConstants
    .EXIT_ON_CLOSE);

    jPanel1.setBorder(javax.swing.BorderFactory
    .createTitledBorder("Combo 1"));

    cmbMyCombo.setEditable(true);
    cmbMyCombo.addActionListener(new java.awt.event
    .ActionListener() {
        public void actionPerformed(java.awt.event
        .ActionEvent evt) {
            cmbMyComboActionPerformed(evt);
        }
    });

    lblId.setText("ID:");
    lblName.setText("Name:");

    javax.swing.GroupLayout jPanel1Layout = new javax
    .swing.GroupLayout(jPanel1);
    jPanel1.setLayout(jPanel1Layout);
    jPanel1Layout.setHorizontalGroup(
        jPanel1Layout.createParallelGroup(javax
        .swing.GroupLayout.Alignment.LEADING)
        .addGroup(jPanel1Layout.createSequentialGroup()
            .addContainerGap()
            .addGroup(jPanel1Layout.createParallelGroup(
             javax.swing.GroupLayout.Alignment.LEADING)
                .addGroup(javax.swing.GroupLayout
                 .Alignment.TRAILING,
         jPanel1Layout.createSequentialGroup()
                    .addGap(0, 0, Short.MAX_VALUE)
                    .addComponent(cmbMyCombo, javax
                     .swing.GroupLayout.PREFERRED_SIZE,
                     141,
         javax.swing.GroupLayout
         .PREFERRED_SIZE)
                    .addGap(40, 40, 40))
                .addGroup(jPanel1Layout
                .createSequentialGroup()
                    .addGroup(jPanel1Layout
                     .createParallelGroup(
                       javax.swing.GroupLayout
                       .Alignment.LEADING)
                        .addGroup(jPanel1Layout
                         .createSequentialGroup()
                            .addComponent(lblId)
                            .addGap(28, 28, 28)
                            .addComponent(txtID, javax
                              .swing.GroupLayout
                              .PREFERRED_SIZE, 66,
                               javax.swing.GroupLayout
                              .PREFERRED_SIZE)
                            .addPreferredGap(javax
                             .swing.LayoutStyle
             .ComponentPlacement.RELATED,
             81,
             javax.swing.GroupLayout
             .PREFERRED_SIZE))
                        .addGroup(jPanel1Layout
                         .createSequentialGroup()
                            .addComponent(lblName)
                            .addPreferredGap(javax
                             .swing.LayoutStyle
                             .ComponentPlacement.RELATED)
                            .addComponent(txtName,
                             javax.swing.GroupLayout
                               .PREFERRED_SIZE,
                                147, javax.swing
                               .GroupLayout
                               .PREFERRED_SIZE)))
                    .addContainerGap(
                      35, Short.MAX_VALUE))))
    );
    jPanel1Layout.setVerticalGroup(
        jPanel1Layout.createParallelGroup(javax
        .swing.GroupLayout.Alignment.LEADING)
        .addGroup(jPanel1Layout.createSequentialGroup()
            .addComponent(cmbMyCombo, javax.swing
             .GroupLayout.PREFERRED_SIZE,
      javax.swing.GroupLayout.DEFAULT_SIZE,
      javax.swing.GroupLayout.PREFERRED_SIZE)
            .addPreferredGap(javax.swing.LayoutStyle
             .ComponentPlacement.RELATED)
            .addGroup(jPanel1Layout.createParallelGroup(
              javax.swing.GroupLayout.Alignment.BASELINE)
                .addComponent(txtID, 
                  javax.swing.GroupLayout
                   .PREFERRED_SIZE, javax.swing
                   .GroupLayout.DEFAULT_SIZE, 
                   javax.swing.GroupLayout.PREFERRED_SIZE)
                .addComponent(lblId))
            .addPreferredGap(javax.swing.LayoutStyle
             .ComponentPlacement.RELATED)
            .addGroup(jPanel1Layout.createParallelGroup(
             javax.swing.GroupLayout.Alignment.BASELINE)
                .addComponent(lblName)
                .addComponent(txtName, 
                 javax.swing.GroupLayout.PREFERRED_SIZE,
                  javax.swing.GroupLayout.DEFAULT_SIZE,
                  javax.swing.GroupLayout.PREFERRED_SIZE))
            .addContainerGap(javax.swing.GroupLayout
             .DEFAULT_SIZE, Short.MAX_VALUE))
    );

    jPanel2.setBorder(javax.swing.BorderFactory
    .createTitledBorder("Combo 2"));

    cmbMyCombo2.setToolTipText("");
    cmbMyCombo2.addActionListener(
     new java.awt.event.ActionListener() {
        public void actionPerformed(
         java.awt.event.ActionEvent evt) {
            cmbMyCombo2ActionPerformed(evt);
        }
    });

    lblId1.setText("ID:");

    lblName1.setText("Name:");

    javax.swing.GroupLayout jPanel2Layout = 
      new javax.swing.GroupLayout(jPanel2);
    jPanel2.setLayout(jPanel2Layout);
    jPanel2Layout.setHorizontalGroup(
        jPanel2Layout.createParallelGroup(
         javax.swing.GroupLayout.Alignment.LEADING)
        .addGroup(jPanel2Layout.createSequentialGroup()
            .addGroup(jPanel2Layout.createParallelGroup(
              javax.swing.GroupLayout.Alignment.LEADING)
                .addGroup(
                   jPanel2Layout.createSequentialGroup()
                    .addGap(41, 41, 41)
                    .addComponent(
                      cmbMyCombo2,
                      javax.swing.GroupLayout
                      .PREFERRED_SIZE, 135,
                      javax.swing.GroupLayout
                      .PREFERRED_SIZE))
                .addGroup(
                 jPanel2Layout.createSequentialGroup()
                    .addGap(18, 18, 18)
                    .addGroup(jPanel2Layout
                     .createParallelGroup(
                       javax.swing.GroupLayout
                       .Alignment.LEADING)
                        .addGroup(
                          jPanel2Layout
                          .createSequentialGroup()
                            .addComponent(lblId1)
                            .addGap(28, 28, 28)
                            .addComponent(txtID1,
                             javax.swing.GroupLayout
                             .PREFERRED_SIZE,
                              66,
                              javax.swing.GroupLayout
                              .PREFERRED_SIZE)
                            .addPreferredGap(
                             javax.swing.LayoutStyle
                             .ComponentPlacement.RELATED,
                             81, javax.swing.GroupLayout
                             .PREFERRED_SIZE))
                        .addGroup(jPanel2Layout
                         .createSequentialGroup()
                            .addComponent(lblName1)
                            .addPreferredGap(
                             javax.swing.LayoutStyle
                             .ComponentPlacement.RELATED)
                            .addComponent(txtName1,
                             javax.swing.GroupLayout
                             .PREFERRED_SIZE,
                              147,
                              javax.swing.GroupLayout
                             .PREFERRED_SIZE)))))
            .addContainerGap(25, Short.MAX_VALUE))
    );
    jPanel2Layout.setVerticalGroup(
        jPanel2Layout.createParallelGroup(
         javax.swing.GroupLayout.Alignment.LEADING)
        .addGroup(jPanel2Layout.createSequentialGroup()
            .addComponent(
              cmbMyCombo2,
              javax.swing.GroupLayout.PREFERRED_SIZE,
              javax.swing.GroupLayout.DEFAULT_SIZE,
              javax.swing.GroupLayout.PREFERRED_SIZE)
            .addPreferredGap(javax.swing.LayoutStyle
             .ComponentPlacement.RELATED)
            .addGroup(jPanel2Layout.createParallelGroup(
             javax.swing.GroupLayout.Alignment.BASELINE)
                .addComponent(
                 txtID1,
                 javax.swing.GroupLayout.PREFERRED_SIZE,
                 javax.swing.GroupLayout.DEFAULT_SIZE,
                 javax.swing.GroupLayout.PREFERRED_SIZE)
                .addComponent(lblId1))
            .addPreferredGap(
             javax.swing.LayoutStyle.ComponentPlacement
             .RELATED)
            .addGroup(
              jPanel2Layout.createParallelGroup(
               javax.swing.GroupLayout.Alignment.BASELINE)
                .addComponent(lblName1)
                .addComponent(txtName1,
                javax.swing.GroupLayout.PREFERRED_SIZE,
                javax.swing.GroupLayout.DEFAULT_SIZE,
                javax.swing.GroupLayout.PREFERRED_SIZE))
            .addContainerGap(
             javax.swing.GroupLayout.DEFAULT_SIZE,
             Short.MAX_VALUE))
    );

    javax.swing.GroupLayout layout = 
     new javax.swing.GroupLayout(getContentPane());
    getContentPane().setLayout(layout);
    layout.setHorizontalGroup(
        layout.createParallelGroup(
         javax.swing.GroupLayout.Alignment.LEADING)
        .addGroup(layout.createSequentialGroup()
            .addContainerGap()
            .addComponent(
             jPanel1,
             javax.swing.GroupLayout.PREFERRED_SIZE,
             javax.swing.GroupLayout.DEFAULT_SIZE,
             javax.swing.GroupLayout.PREFERRED_SIZE)
            .addGap(18, 18, 18)
            .addComponent(
              jPanel2,
              javax.swing.GroupLayout.DEFAULT_SIZE,
              javax.swing.GroupLayout.DEFAULT_SIZE,
              Short.MAX_VALUE)
            .addContainerGap())
    );
    layout.setVerticalGroup(
        layout.createParallelGroup(
         javax.swing.GroupLayout.Alignment.LEADING)
        .addGroup(layout.createSequentialGroup()
            .addContainerGap()
            .addGroup(layout.createParallelGroup(
             javax.swing.GroupLayout.Alignment.LEADING,
              false)
                .addComponent(
                 jPanel1,
                 javax.swing.GroupLayout.DEFAULT_SIZE,
         javax.swing.GroupLayout.DEFAULT_SIZE,
         Short.MAX_VALUE)
                .addComponent(
         jPanel2,
         javax.swing.GroupLayout.DEFAULT_SIZE,
         javax.swing.GroupLayout.DEFAULT_SIZE,
         Short.MAX_VALUE))
            .addContainerGap(
     javax.swing.GroupLayout.DEFAULT_SIZE,
     Short.MAX_VALUE))
    );

    pack();
}

private void cmbMyComboActionPerformed(
java.awt.event.ActionEvent evt) {
    Object mySelectedItem = cmbMyCombo.getSelectedItem();
    Object myObject[] = (Object[])mySelectedItem;
    txtID.setText(myObject[0].toString());
    txtName.setText(myObject[1].toString());        
}

private void cmbMyCombo2ActionPerformed(
java.awt.event.ActionEvent evt) {
    Object mySelectedItem = cmbMyCombo2.getSelectedItem();
    Object myObject[] = (Object[])mySelectedItem;
    txtID1.setText(myObject[0].toString());
    txtName1.setText(myObject[1].toString());
}

public static void main(String args[]) {

    java.awt.EventQueue.invokeLater(new Runnable() {

        public void run() {
            new MyComboBox().setVisible(true);
        }
    });
}

private javax.swing.JComboBox cmbMyCombo;
private javax.swing.JComboBox cmbMyCombo2;
private javax.swing.JPanel jPanel1;
private javax.swing.JPanel jPanel2;
private javax.swing.JLabel lblId;
private javax.swing.JLabel lblId1;
private javax.swing.JLabel lblName;
private javax.swing.JLabel lblName1;
private javax.swing.JTextField txtID;
private javax.swing.JTextField txtID1;
private javax.swing.JTextField txtName;
private javax.swing.JTextField txtName1;
// End of variables declaration

private void iniCombobox() {

   cmbMyCombo.addItem(new Object[] {"1", "Item 1"});
   cmbMyCombo.addItem(new Object[] {"2", "Item 2"});
   cmbMyCombo.addItem(new Object[] {"3", "Item 3"});

   cmbMyCombo2.addItem(new Object[] {"1", "Item 1"});
   cmbMyCombo2.addItem(new Object[] {"2", "Item 2"});
   cmbMyCombo2.addItem(new Object[] {"3", "Item 3"});

   cmbMyCombo.setRenderer(new MyListRenderer());
   cmbMyCombo2.setRenderer(new MyListRenderer());       
}
}

【问题讨论】:

  • 如需尽快获得更好的帮助,请发帖SSCCE
  • 好的...你为什么告诉我你用我不建议你发布的东西编辑了你的问题?
  • 我只是想让它更清楚。我真的很难用这个。
  • “我只是想让它更清晰一些。” 对我来说,它就像泥巴一样清晰。发布 SSCCE。
  • 重新编辑。希望我能回答所有 SSCCE 标准。我知道我忘了把我的代码剪成 62 个字符。但对于其余的,如果我缺少符合 SSCCE 的内容,请告诉我确切的信息。谢谢!

标签: java swing jcombobox


【解决方案1】:

最后...要实现这一点,我必须添加一个基本的自定义 ComboBox 编辑器,并将自定义编辑器设置为我的原始代码中的组合框(包含在我的问题中):

cmbMyCombo.setEditor(new MyComboEditor());

自定义组合框编辑器类需要实现 ComboBoxEditor。我有 6 种方法可以覆盖。但这里有3个主要的。在 getEditorComponent 中,我返回一个文本字段,但我可以返回任何类型的组件。

@Override
public Component getEditorComponent() {
    return textFeild;
}

然后我根据我在 setItem() 中选择的对象数据 [1] 设置 textFeild 中的文本(请注意,我保留了我的原始对象以便稍后返回“myReturnObject”):

 @Override
 public void setItem(Object anObject) {

    if(anObject != null){
        myObject = (Object[])anObject;
        myReturnObject = anObject;
        //I can now set whatever i want in the text feild            
        textFeild.setText(myObject[1].toString());//<--
     }
     else{ 
       myReturnObject = anObject;
     }
}

然后,如果从列表中选择原始对象,则返回原始对象;如果文本字段已被编辑,则返回自定义对象。

@Override
public Object getItem() {
    String objectTxt = myObject[1].toString();
    String feildTxt = textFeild.getText();

    if(objectTxt.equals(feildTxt)){
        return myReturnObject;
    }
    else{
        //Creating and returning custom object with the Feild text
        //and setting the contnent of the text feild in the object
        return new Object[]{"0",textFeild.getText()};
    }
}

这对于组合框来说是很多工作,但在我的情况下这是值得的。希望这可以帮助其他人。

以下是这项工作的参考资料: http://www.java2s.com/Code/Java/Swing-JFC/AfancyexampleofJComboBoxwithacustomrendererandeditor.htm http://docs.oracle.com/javase/tutorial/uiswing/components/combobox.html 以下是自定义组合编辑器“MyComboEditor()”的完整代码:

package combobox;

import java.awt.Component;
import java.awt.event.ActionListener;
import javax.swing.ComboBoxEditor;
import javax.swing.JTextField;

public class MyComboEditor implements ComboBoxEditor {
  JTextField textFeild;
  Object myObject[];
  Object myReturnObject;

public MyComboEditor(){
    textFeild = new JTextField();     
}

@Override
public Component getEditorComponent() {
    return textFeild;
}

@Override
public void setItem(Object anObject) {

    if(anObject != null){
        myObject = (Object[])anObject;
        myReturnObject = anObject;            
        textFeild.setText(myObject[1].toString());
     }
     else{ 
       myReturnObject = anObject;
     }
}

@Override
public Object getItem() {
    String objectTxt = myObject[1].toString();
    String feildTxt = textFeild.getText();

    if(objectTxt.equals(feildTxt)){
        return myReturnObject;
    }
    else{
        return new Object[]{"0",textFeild.getText()};
    }
}

@Override
public void selectAll() {
    throw new UnsupportedOperationException(
            "Not supported yet. in select All");
}

@Override
public void addActionListener(ActionListener l) {
    textFeild.addActionListener(l);     
}

@Override
public void removeActionListener(ActionListener l) {
    textFeild.removeActionListener(l);
}    
}

【讨论】:

    【解决方案2】:

    我确实设置了 myComboBox.setRenderer(new MyListRenderer());我在列表中选择的任何内容都会返回组合文本字段中的对象。注意:我的 Object[]{id, nomClient} 中的 id 是我对数据库的引用。

    RendererJTableJListJComboBox 的概念相同)用于格式化已经存在的值(ColorFontBackgroundForeground),不要't add, put, changemodify Renderer 里面的任何东西@

    我该如何解决这个问题?

    将数据作为Items直接放入JComboBox,在你的情况下更新ComboBoxModel,注意addputchangemodify必须在Event Dispatch Thread上完成

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2013-01-30
      • 1970-01-01
      • 1970-01-01
      • 2015-01-27
      • 2018-06-23
      相关资源
      最近更新 更多