2

Edited to add the setName function:

I've been using stackoverflow for over a year to help with learning java after only about 6 hours of CS in college. You guys are the best! So getting to it...

My problem is that I've got a JOptionPane with multiple textFields. All the examples of retreiving the text from these fields only show a single textField. I could create a separate DocumentListener for each textField that handles each box separately, but it just seems that there should be a way to create one DocumentListener that can say :

if(namebox changed)

edit name

else if(dataBox changed)

edit data

etc....

Here is my code as it originates:

    public class HumanPlayer extends Player
    {
    /**
     * Constructor for objects of class HumanPlayer
     */
    public HumanPlayer()
    {
        setName("Human " + getOrder());
    }


    @Override
    public void chooseSoldiers()
    {
        JLabel nameLabel = new JLabel("Enter name: " );
        //humans.setPreferredSize(new Dimension(100,50));


        final JTextField nameBox = new JTextField();
        final JTextField infantryBox = new JTextField();
        final JTextField scoutBox = new JTextField();
        final JTextField sniperBox = new JTextField();
        JLabel infLabel = new JLabel("Infantry: " );
        JLabel scLabel = new JLabel("Scouts: " );
        JLabel snLabel = new JLabel("Snipers: " );

        JPanel soldierPanel = new JPanel();
        soldierPanel.setLayout(new GridLayout(4,2,5, 8));
        soldierPanel.add(nameLabel);
        soldierPanel.add(nameBox);
        soldierPanel.add(infLabel);
        soldierPanel.add(infantryBox);
        soldierPanel.add(scLabel);
        soldierPanel.add(scoutBox);
        soldierPanel.add(snLabel);
        soldierPanel.add(sniperBox);

        nameBox.getDocument().addDocumentListener(new NameListener());
        infantryBox.getDocument().addDocumentListener(new NameListener());
        scoutBox.getDocument().addDocumentListener(new NameListener());
        sniperBox.getDocument().addDocumentListener(new NameListener());

        int ok = JOptionPane.showOptionDialog(null, soldierPanel,  
                "Player " + getOrder(), JOptionPane.CANCEL_OPTION,  
            JOptionPane.QUESTION_MESSAGE, null, null, null);        
       }

    public class NameListener implements DocumentListener
    {

        @Override
        public void changedUpdate(DocumentEvent e) {}
        @Override
        public void insertUpdate(DocumentEvent e) {
            try {
                   setName(e.getDocument().getText(0,e.getDocument().getLength()));
            } catch (BadLocationException e1) {e1.printStackTrace();}

        }

        @Override
        public void removeUpdate(DocumentEvent e) {
            try {
                setName(e.getDocument().getText(0,e.getDocument().getLength()));
            } catch (BadLocationException e1) {e1.printStackTrace();
                }               
           }
    }
}

Separate File:

public abstract class Player
{
....
private String name;
 ....

public void setName(String _name)
{
    name = _name;
}
4

1 回答 1

1

如果我对您的理解正确,您想使用一个文档侦听器并让它响应所有JTextFeild数据更改事件。不幸的是, aDocumentListener的事件源是Documents使用addDocumentListener函数注册的,而不是文本组件。所以这个想法是使用:

  1. Document's putProperty("owner", txtFeild): 跟踪它的所有者文本字段Document
  2. On Document change 事件使用getProperty("owner")来获取事件源的所有者:文档实例。
  3. 分配PropertyChangeListener给每个文本字段以将此属性设置为他们自己的文档:因为如果将新文档设置为TextComponent我们正在使用的文档,则无法预测。

仔细检查以下代码片段:

    class MyDocumentListener implements DocumentListener{

       public void updateComponent(DocumentEvent e)
       {
            boolean valid = checkDataValidity(e.getDocument());
            JTextField txtField = (JTextField) e.getDocument().getProperty("owner");

           if(!valid)
             txtField.setEnabled(false);
           else  txtField.setEnabled(true);
       }

         @Override
         public void insertUpdate(DocumentEvent e) {updateComponent(e);}

         @Override
         public void removeUpdate(DocumentEvent e) {updateComponent(e);}

         @Override
         public void changedUpdate(DocumentEvent e) {}
     }

    class MyPropChangeListener implements PropertyChangeListener{

       DocumentListener documentListenr;

       public MyPropChangeListener(DocumentListener documentListener) {
             this.documentListenr = documentListener;
       }

       @Override
       public void propertyChange(PropertyChangeEvent evt) {
           System.out.println("chaning document!!");
           JTextField txtFeild =  (JTextField)evt.getSource();
           txtFeild.getDocument().putProperty("owner", txtFeild);
           txtFeild.getDocument().addDocumentListener(documentListenr);
        }
     }
   //..............

   MyPropChangeListener propChangeListener = new MyPropChangeListener(new MyDocumentListener());

    jTextField1.addPropertyChangeListener("document", propChangeListener);
    jTextField1.setDocument(new PlainDocument());

    jTextField2.addPropertyChangeListener("document", propChangeListener);
    jTextField2.setDocument(new PlainDocument());
于 2013-11-12T19:46:06.940 回答