2015-08-03 5 views
0
class RuleComboBox extends JComboBox { 

    public RuleComboBox() { 
     super(); 
     this.setModel(new javax.swing.DefaultComboBoxModel(new String[]{"abc", "defg"})); 
     ((JLabel) this.getRenderer()).setHorizontalAlignment(SwingConstants.CENTER); 
    } 

} 

La ligne getRenderer() aligne le texte sur le centre.L'alignement est réinitialisé lors de l'utilisation de setEditable() pour une JComboBox

Lorsque j'utilise ruleComboBox1.setEnabled(false) et ruleComboBox1.setEditable(true), le texte s'aligne à gauche que je ne veux pas. Comment puis-je arrêter cela?

Je devrais expliquer que j'utilise setEditable(true) pour garder l'apparence du texte dans le ComboBox quand je le désactive.

Répondre

1

L'éditeur pour JComboBox doit implémenter l'interface ComboBoxEditor. L'implémentation par défaut s'étend de BasicComboBoxEditor qui renvoie un JTextField en tant qu'éditeur. Un JTextField ne prend pas en charge le concept d'affichage du texte centré.

Vous pouvez donc implémenter votre propre ComboBoxEditor. Je suggère que vous pouvez simplement utiliser le BasicComboBoxEditor et changer le code pour créer un JTextPane au lieu d'un JTextField. Ensuite, lorsque vous créez le volet de texte, vous pouvez utiliser:

SimpleAttributeSet center = new SimpleAttributeSet(); 
StyleConstants.setAlignment(center, StyleConstants.ALIGN_CENTER); 
StyledDocument doc = textPane.getStyledDocument(); 
doc.setParagraphAttributes(0, doc.getLength(), center, false); 

qui entraînera le centrage du code.

Remarque: ce ne sera pas une conversion directe. Un JTextField appelle un ActionListener lorsque la touche Enter est enfoncée. Un JTextPane ne prend pas en charge cette fonctionnalité (la valeur par défaut est l'insertion d'une nouvelle ligne). Vous devrez donc répliquer cette fonctionnalité pour JTextPane. C'est-à-dire que vous devrez utiliser Key Bindings pour gérer la clé Enter. Vous aurez donc besoin d'encapsuler le ActionListener dans un Action personnalisé, puis de lier la touche Entrée au volet de texte.

import javax.swing.*; 
import javax.swing.text.*; 
import javax.swing.border.Border; 
import java.awt.Component; 
import java.awt.event.*; 

import java.lang.reflect.Method; 
//import sun.reflect.misc.MethodUtil; 

/** 
* A custom editor for editable combo boxes. The editor is implemented as a JTextPane. 
* 
*/ 
public class TextPaneComboBoxEditor implements ComboBoxEditor { 
    protected JTextPane editor; 
    private Object oldValue; 

    public TextPaneComboBoxEditor() { 
     editor = createEditorComponent(); 
    } 

    public Component getEditorComponent() { 
     return editor; 
    } 

    /** 
    * Creates the internal editor component. Override this to provide 
    * a custom implementation. 
    * 
    * @return a new editor component 
    * @since 1.6 
    */ 
    protected JTextPane createEditorComponent() { 
     JTextPane editor = new BorderlessTextPane("",9); 
     editor.setBorder(null); 

     SimpleAttributeSet center = new SimpleAttributeSet(); 
     StyleConstants.setAlignment(center, StyleConstants.ALIGN_CENTER); 
     StyledDocument doc = editor.getStyledDocument(); 
     doc.setParagraphAttributes(0, doc.getLength(), center, false); 

     return editor; 
    } 

    /** 
    * Sets the item that should be edited. 
    * 
    * @param anObject the displayed value of the editor 
    */ 
    public void setItem(Object anObject) { 
     String text; 

     if (anObject != null) { 
      text = anObject.toString(); 
      if (text == null) { 
       text = ""; 
      } 
      oldValue = anObject; 
     } else { 
      text = ""; 
     } 

     // workaround for 4530952 
     if (! text.equals(editor.getText())) { 
      editor.setText(text); 
     } 

    } 

    public Object getItem() { 
     Object newValue = editor.getText(); 

     // This code only works for Strings. The default implementation would 
     // use reflection to create Object of whatever class was stored in the 
     // ComboBoxModel. You will need to fix the reflection code if you want 
     // to support other types of data in the model 

/* 
     if (oldValue != null && !(oldValue instanceof String)) { 
      // The original value is not a string. Should return the value in it's 
      // original type. 
      if (newValue.equals(oldValue.toString())) { 
       return oldValue; 
      } else { 
       // Must take the value from the editor and get the value and cast it to the new type. 
       Class<?> cls = oldValue.getClass(); 
       try { 
        Method method = MethodUtil.getMethod(cls, "valueOf", new Class[]{String.class}); 
        newValue = MethodUtil.invoke(method, oldValue, new Object[] { editor.getText()}); 
       } catch (Exception ex) { 
        // Fail silently and return the newValue (a String object) 
       } 
      } 
     } 
*/ 
     return newValue; 
    } 

    public void selectAll() { 
     editor.selectAll(); 
     editor.requestFocus(); 
    } 

    public void addActionListener(ActionListener l) { 
//  editor.addActionListener(l); 

     Action enter = new WrappedActionListener(l); 
     editor.getActionMap().put("insert-break", enter); 
    } 

    public void removeActionListener(ActionListener l) { 
//  editor.removeActionListener(l); 
    } 

    static class BorderlessTextPane extends JTextPane { 
     public BorderlessTextPane(String value,int n) { 
//   super(value,n); 
      setText(value); 
     } 

     // workaround for 4530952 
     public void setText(String s) { 
      if (getText().equals(s)) { 
       return; 
      } 
      super.setText(s); 
     } 

     public void setBorder(Border b) { 
      if (!(b instanceof UIResource)) { 
       super.setBorder(b); 
      } 
     } 
    } 

    /** 
    * A subclass of TextPaneComboBoxEditor that implements UIResource. 
    * TextPaneComboBoxEditor doesn't implement UIResource 
    * directly so that applications can safely override the 
    * cellRenderer property with TextPaneListCellRenderer subclasses. 
    * <p> 
    * <strong>Warning:</strong> 
    * Serialized objects of this class will not be compatible with 
    * future Swing releases. The current serialization support is 
    * appropriate for short term storage or RMI between applications running 
    * the same version of Swing. As of 1.4, support for long term storage 
    * of all JavaBeans&trade; 
    * has been added to the <code>java.beans</code> package. 
    * Please see {@link java.beans.XMLEncoder}. 
    */ 
    public static class UIResource extends TextPaneComboBoxEditor 
    implements javax.swing.plaf.UIResource { 
    } 

    static class WrappedActionListener extends AbstractAction 
    { 
     private ActionListener listener; 

     public WrappedActionListener(ActionListener listener) 
     { 
      this.listener = listener; 
     } 

     @Override 
     public void actionPerformed(ActionEvent e) 
     { 
      listener.actionPerformed(e); 
     } 
    } 
} 

Tout ce que vous avez besoin dans votre code actuel est:

comboBox.setEditor(new TextPaneComboBoxEditor());