0

ここに画像の説明を入力してください

両方のcomboBoxは同じコードを使用しますが、唯一の例外は、「コンボ1」が編集可能として設定され、「コンボ2」が編集可能ではないことです。どちらも「アイテム1」が選択されています。ご覧のとおり、「コンボ1」はコンボテキストフィールドに「[Ljava.lang.Object; @ 77905258」を印刷し、「コンボ2」は選択した名前を印刷します。

「コンボ1」は、コンボボックスのテキストフィールドに「コンボ2」と同じテキストを印刷するにはどうすればよいですか。

Eに準拠するには:(添付の画像を参照)[コンボ1]をクリックすると、アイテム1、アイテム2のリストが表示されますが、テキストフィールドには「[Ljava.lang.Object;@77905258」と表示されます。アイテムが選択されたとき(ここで選択されているのはアイテム1です)。

「コンボ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());       
}
}
4

2 に答える 2

5

最後に...これを実現するには、基本的なカスタムComboBoxエディターを追加し、カスタムエディターを元のコード(質問に含まれている)のコンボボックスに設定する必要がありました。

cmbMyCombo.setEditor(new MyComboEditor());

カスタムコンボボックスエディタークラスは、ComboBoxEditorを実装する必要があります。オーバーライドする6つのメソッドがありました。しかし、ここに3つの主要なものがあります。getEditorComponentで、テキストフィールドを返しますが、任意のタイプのコンポーネントを返すことができます。

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

次に、setItem()で選択したオブジェクトdata [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.htmhttp://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);
}    
}
于 2012-05-30T01:37:43.647 に答える
2

myComboBox.setRenderer(new MyListRenderer());を設定します。リストで選択したものはすべて、コンボテキストフィールドにオブジェクトを返します。注:私のObject [] {id、nomClient}のidは、データベースへの私の参照です。

レンダラー(、と同じ概念)はJTable、すでに存在する( 、、、、 ) 、存在JListしない、、、または内部にJComboBoxある値をフォーマットするためのものです。ColorFontBackgroundForegroundaddputchangemodifyRenderer

どうすればこれを修正できますか?

直接に関するデータを入力Itemsします。この場合、 ComboBoxModelJComboBoxを更新するには、、に注意してください。または、イベントディスパッチスレッドで実行する必要があります。addputchangemodify

于 2012-05-27T18:59:53.610 に答える