2015-05-29 50 views
-2

是否可以像這樣在JTextField中分配一個字符串(在藍色文本字段中爲「bruno」)。

JTextField被自動分割成許多等距的位置作爲最大列值。
enter image description here如何在JTextField中分發字符

我寫這篇文章的代碼解釋爲什麼字體跟蹤不爲我工作:

import java.awt.Dimension; 
import java.awt.FlowLayout; 
import java.awt.Font; 
import java.awt.Graphics; 
import java.awt.font.TextAttribute; 
import java.text.DecimalFormat; 
import java.util.HashMap; 
import java.util.Map; 

import javax.swing.JFrame; 
import javax.swing.JLabel; 
import javax.swing.JSpinner; 
import javax.swing.JTextField; 
import javax.swing.SpinnerNumberModel; 
import javax.swing.SwingUtilities; 
import javax.swing.WindowConstants; 
import javax.swing.text.AttributeSet; 
import javax.swing.text.BadLocationException; 
import javax.swing.text.PlainDocument; 

public class SpacedFieldTest extends JFrame{ 

    Map<TextAttribute, Object> fontAttributes = new HashMap<TextAttribute,  Object>(); 
    int maxColumn; 
    String text; 
    public SpacedFieldTest(String text, int maxColumn) { 
     this.text = text; 
     this.maxColumn = maxColumn; 
     addContent(); 
     pack(); 
    } 

    private void addContent() { 
     setLayout(new FlowLayout()); 
     final SpacedField field = new SpacedField(); 
     configureField(field, "Arial", 20f); 
     getContentPane().add(field); 

     JSpinner spinner = createSpinner(field); 
     getContentPane().add(spinner); 

     JLabel tracking = new JLabel("Tracking"); 
     getContentPane().add(tracking); 
    } 

    private JSpinner createSpinner(final SpacedField field) { 
     float min = 0.0f; 
     float value = 0.1f; 
     float max = 3.0f; 
     float stepSize = 0.1f; 
      SpinnerNumberModel model = new SpinnerNumberModel(value, min,  max, stepSize); 
      JSpinner spinner = new JSpinner(model){ 
       @Override 
       public Object getValue() { 
        fontAttributes.put(TextAttribute.TRACKING,  super.getValue()); 
         field.setFont(field.getFont().deriveFont(fontAttributes)); 
        return super.getValue(); 
       } 

      }; 
     spinner.setPreferredSize(new Dimension(50,25)); 
     JSpinner.NumberEditor editor =  (JSpinner.NumberEditor)spinner.getEditor(); 
     DecimalFormat format = editor.getFormat(); 
     format.setMinimumFractionDigits(1); 
     return spinner; 
    } 

    private void configureField(JTextField field, String family, float  fontSize) { 

     fontAttributes.put(TextAttribute.SIZE, fontSize); 
     fontAttributes.put(TextAttribute.FAMILY, family); 
     Font font = Font.getFont(fontAttributes); 
     field.setFont(font); 
     field.setText(text); 
    } 

    class SpacedField extends JTextField{ 
     final int WIDTH = 300; 
     final int HEIGHT = 25; 
     int gridWidth; 
     public SpacedField() { 

      gridWidth = WIDTH/maxColumn; 
      setPreferredSize(new Dimension(WIDTH, HEIGHT)); 
      setDocument(new SpacedFieldDocument()); 
     } 
     public void paintComponent(Graphics g){ 
      super.paintComponent(g); 
      paintGrid(g); 
     } 
     private void paintGrid(Graphics g) { 
      for(int i=1; i<=maxColumn; i++){ 
       g.drawLine(i*gridWidth, HEIGHT/2, i*gridWidth, HEIGHT); 
      } 

     } 
    } 

    class SpacedFieldDocument extends PlainDocument{ 
     public void insertString(int offs, String str, AttributeSet a) 
       throws BadLocationException { 

      if(getLength()>maxColumn) 
       return; 
      super.insertString(offs, str, a); 
     } 
    } 

    public static void main(String args[]){ 

     final SpacedFieldTest sf = new SpacedFieldTest("abcde", 5); 
     sf.setDefaultCloseOperation(WindowConstants.EXIT_ON_CLOSE); 
     SwingUtilities.invokeLater(new Runnable() { 
      public void run() { 
       sf.setVisible(true); 
      } 
     }); 
    } 
} 
+2

什麼是「這樣的」?給出適當的輸入和預期的輸出。另外,發佈您試圖做到的代碼。 – user1803551

+0

你可能想看看這裏:http://stackoverflow.com/questions/5673281/how-to-modify-letter-spacing-in-a-jtextpane –

+0

它不起作用,我認爲間距必須取決於字段寬度和列數允許 – user2358141

回答

0

可能十歲上下。

你想要做的是爲每個可用字符設置一個單獨的JTextField。這最好是作爲一個獨立的類來實現的,它擴展了JComponent,但這取決於你。

我建議您在初始化拋出這些:

private final LinkedList<JTextField> fields = new LinkedList<>(); 
private KeyListener fieldKeyListener = new KeyListener(){ 

    @Override 
    public void keyTyped(KeyEvent e) { 
    } 

    @Override 
    public void keyPressed(KeyEvent e) { 
     if(e.getKeyCode() != KeyEvent.VK_BACK_SPACE && e.getKeyCode() != KeyEvent.VK_DELETE) { 
      System.out.println("Key code: " + e.getKeyCode()); 
      int index = fields.indexOf(e.getSource()); 
      int newIndex = index + 1; 
      if(newIndex < fields.size()) fields.get(newIndex).requestFocus(); 
      else 
       System.out.println(gatherString()); 
       //or use whichever action should retrieve the string 
     } 
    } 

    @Override 
    public void keyReleased(KeyEvent e) { 
    } 

}; 

對於它的肉,你要做到這一點。我繼續在JFrame的中間構建它,但是如果你可以想象不止一次這樣做,你會想要將它調整到構造函數的初始化器。

private JComponent getDistField() { 
    JPanel panel = new JPanel(); 
    panel.setLayout(new GridLayout(1, charCount)); 

    for(int i = 0; i < charCount; i++) { 
     fields.add(new JTextField(1)); 

     /* All customizations to look and feel, for each component, go here */ 

     //document must be unique for each field, or text will duplicate. 
     fields.getLast().setDocument(new PlainDocument(){ 
      @Override 
      public void insertString(int offs, String str, AttributeSet a) 
        throws BadLocationException { 
       if(getLength() + str.length() <= 1) 
        super.insertString(offs, str, a); 
      } 
     }); 
     fields.getLast().addKeyListener(fieldKeyListener); 
     panel.add(fields.getLast()); 
    } 

    return panel; 
} 

我假定「charCount」先前設置(甚至傳過來的參數),該字段接受的字符數。該迭代器創建一個子文本字段序列;其中每個將處理一個角色並立即更新插入符號的位置。請注意,文檔需要對每個字段都是唯一的,否則文本將以整個方式自我複製!

在理論上,你也可以用脫口秀聽衆而不是關鍵聽衆來做這件事;但是,它們與按鍵相切並且完全不知道哪個鍵剛剛關閉。這並不意味着它是不可能的,但我找不到一個乾淨的方式來做到這一點。

當您準備好您輸入的字符串的全部內容,稱這樣的事情:

public String gatherString() { 
    StringBuilder builder = new StringBuilder(); 
    for(JTextField field : fields) { 
     builder.append(field.getText()); 
    } 
    return builder.toString(); 
} 

它集合來自各個領域的內容的字符串。值得慶幸的是,空的領域沒有貢獻;如果你希望他們也是不可編輯的,你可以嘗試將它們設置爲禁用並觸發它們對其前面的字段的啓用;甚至可以添加一個鼠標偵聽器來查找最後未編輯的字段,並在任何點擊時將其突出顯示。這都是關於聽衆(/觀察員)的。

希望這會爲你做,我相信你可以看到爲什麼你可能希望這是它自己的模塊。祝你好運!

此外,如果您在將來查看適當格式的問題,它將非常有幫助。我目前的狀況無法讓它升級,社區也會收到更好的結果。它會幫助你查看"How do I ask a good question?"

+0

此解決方案非常昂貴。我必須重新執行所有事件(插入符號,選擇,使用箭頭鍵導航,撤消,重做......) – user2358141