JButton становится включенным после действия по умолчанию JTextfield - PullRequest
0 голосов
/ 30 декабря 2018

Я снова разбираюсь с Java и играю с Swing.В настоящее время пытаюсь понять JList.

При выборе элементов в JList я включаю кнопку (кнопка «Удалить»).Если выбора нет, кнопка должна быть отключена (невозможно удалить элемент, если он не выбран, JVM имеет тенденцию вызывать рвоту, если у вас нет индекса элемента).

При добавлении элемента списка с помощьюдействие JTextField по умолчанию (ввод), кнопка активируется, но в JList нет выбора.Код для включения кнопки даже не запускается.Как это происходит?Может быть, я где-то скучаю по слушателю?

Все слушатели в основном классе, но, похоже, с другими это не проблема.Я не могу видеть, как класс был создан дважды, так что это не так.Любые идеи были бы хорошими?

import java.awt.FlowLayout;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;

import javax.swing.DefaultListModel;
import javax.swing.JButton;
import javax.swing.JFrame;
import javax.swing.JList;
import javax.swing.JScrollPane;
import javax.swing.JTextField;
import javax.swing.ListSelectionModel;
import javax.swing.event.DocumentEvent;
import javax.swing.event.DocumentListener;
import javax.swing.event.ListDataEvent;
import javax.swing.event.ListDataListener;
import javax.swing.event.ListSelectionEvent;
import javax.swing.event.ListSelectionListener;

public class GUI extends JFrame implements Runnable, ActionListener, DocumentListener, ListDataListener, ListSelectionListener {

    /**
     * 
     */
    private static final long serialVersionUID = 1L;

    //declare and instantiate interface components
    DefaultListModel<String> lm=new DefaultListModel<String>();
    JList<String> jl=new JList<String>(lm);

    JTextField jt=new JTextField(50);

    JButton b_add=new JButton("Add");
    JButton b_del=new JButton("Remove");    

    @Override
    public void run() {
        //FROM RUNNABLE INTERFACE

        //set GUI (JFrame) attributes
        setDefaultCloseOperation(DISPOSE_ON_CLOSE);
        setLocationByPlatform(true);
        setName("List of Lists");
        setSize(1280, 500);
        setLayout(new FlowLayout());

        //set component attributes
        jl.setSelectionMode(ListSelectionModel.SINGLE_SELECTION); //single selection list

        jt.getDocument().addDocumentListener(this);

        //other interface components
        JScrollPane sp=new JScrollPane(jl);
        JButton b_exit=new JButton("Exit");


        //other component attributes
        sp.setSize(500, 500);

        b_add.setEnabled(false);
        b_del.setEnabled(false);


        //set component listeners
        b_add.addActionListener(this);
        b_del.addActionListener(this);
        b_exit.addActionListener(this);

        jt.setActionCommand("TXT");
        jt.addActionListener(this);

        lm.addListDataListener(this);
        jl.addListSelectionListener(this);


        //add GUI components
        add(jt);
        add(sp);
        add(b_add);
        add(b_del);
        add(b_exit);

        //set GUI visible
        setVisible(true);
    }

    //FROM ACTIONLISTENER INTERFACE
    @Override
    public void actionPerformed(ActionEvent ae) {

        //default action on text field (enter key)
        if (ae.getActionCommand()=="TXT") {     
            lm.addElement(jt.getText());
            jt.setText(null);

        } else {

            //actions from buttons
            switch (ae.getActionCommand()) {

            //add button
            case "Add":
                lm.addElement(jt.getText());
                jt.setText(null);
                break;

            //remove button
            case "Remove":
                if (jl.getSelectedIndex()>=0) {
                    lm.remove(jl.getSelectedIndex());

                }
                break;

            //exit button   
            case "Exit":
                setVisible(false);
                dispose();
                break;

            //just in case
            default:
                break;

            }
        }
    }

    //FROM DOCUMENTEVENTLISTENER INTERFACE
    @Override
    public void changedUpdate(DocumentEvent de) {

        b_add.setEnabled(de.getDocument().getLength()>0);
    }


    @Override
    public void insertUpdate(DocumentEvent de) {

        b_add.setEnabled(de.getDocument().getLength()>0);
    }


    @Override
    public void removeUpdate(DocumentEvent de) {

        b_add.setEnabled(de.getDocument().getLength()>0);
    }

    //FROM LISTDATALISTENER INTERFACE
    @Override
    public void contentsChanged(ListDataEvent ld) {

        b_del.setEnabled(lm.getSize()>0);
    }


    @Override
    public void intervalAdded(ListDataEvent ld) {

        b_del.setEnabled(lm.getSize()>0);
    }


    @Override
    public void intervalRemoved(ListDataEvent ld) {

        b_del.setEnabled(lm.getSize()>0);

    }

    //FROM LISTSELECTIONLISTENER INTERFACE
    @Override
    public void valueChanged(ListSelectionEvent ls) {

        b_del.setEnabled(jl.getSelectedIndex()>=0);
    }

}

Что должно случиться, что кнопка «Удалить» должна включаться только тогда, когда элемент в JList выделен (выбран).

Ответы [ 2 ]

0 голосов
/ 30 декабря 2018

Что должно произойти, это то, что кнопка «Удалить» должна включаться только тогда, когда элемент в JList выделен (выбран).

Тогда у вас слишком много слушателей в вашем коде.

Нет необходимости в DocumentListener.Не имеет значения, изменились ли данные в текстовом поле.Когда вы добавляете данные из текстового поля в JList, выбор не изменяется автоматически.

Нет необходимости в ListDataListener.Опять же, вам все равно, изменятся ли данные.

Единственный слушатель, который имеет отношение к этому требованию, это ListSelectionListener.Этот слушатель будет запускать событие при изменении выбора.Затем в коде слушателя вы можете включить / отключить кнопку на основе выбора в списке.

Базовый код в слушателе может быть:

int index = list.getSelectedIndex();
button.setEnabled( index = -1 ? false : true );

Читать раздел из учебника по Swing на Как написать ListSelectionListener для получения дополнительной информации и рабочего примера.

0 голосов
/ 30 декабря 2018

Просто добавьте b_del.setEnabled(false); в случае добавления.

  //add button
        case "Add":
            lm.addElement(jt.getText());
            jt.setText(null);
            b_del.setEnabled(false);
            break;

Кроме того, я рекомендую использовать system.exit(0) вместо dispose ().Только из соображений памяти (очевидно, это зависит от ваших потребностей :)).

...