Напишите программу для отображения выбранных элементов в списке в порядке выбора с помощью компонентов Java AWT

#java #queue #awt

Вопрос:

Таким образом, основная идея проблемы заключается в том, что нам нужно создать фрагмент кода, который отобразит пользователю список тем для выбора. Пользователь может выбрать несколько параметров в списке, и нам нужно отобразить вывод выбранных параметров в том порядке, в котором пользователь выбрал этот параметр.

Так что, если список пойдет:

Пункт 1, Пункт 2, Пункт 3, Пункт 4.

И пользователь выбирает в порядке:

Пункт 2, Пункт 4, Пункт 1.

Затем нам нужно отобразить порядок, в котором были выбраны параметры.

В настоящее время я создал фрагмент кода, который частично удовлетворяет этому требованию, но результат чрезвычайно странный и трудно объяснимый…

если пользователь выбирает элемент в первый раз, вывод выводится точно, но проблемы начинаются, когда пользователь начинает отменять выбор элементов, а затем снова выбирать их. Когда пользователь отменит выбор элемента, он удалит его из списка вывода, но когда пользователь перейдет к повторному выбору элемента, он вообще не появится в списке вывода. Опять же, это чрезвычайно запутанно объяснять словами или изображениями, поэтому я опубликую код здесь, чтобы любой из вас, ребята, мог скопировать и выполнить самостоятельно, чтобы понять абсурдный вывод.

Я спросил своего друга, как я мог бы заставить это работать, и они предложили мне использовать очереди, но тогда в голову не приходит никаких идей, учитывая определенные входные данные (например, отмену выбора второго элемента, когда всего выбрано 4 элемента), когда очередь полностью разрушится.

(ПРИМЕЧАНИЕ: Этот код будет работать только с версиями Java 1.8 и предыдущими версиями, поскольку он требует использования appletviewer, который был устаревшим с версий 1.9 и выше, пожалуйста, имейте это в виду)

 import java.applet.*;
import java.awt.*;
import java.awt.event.*;
/*<applet code = "ListDemo" width = "500" height = "500"></applet>*/
public class ListDemo extends Applet implements ItemListener{
    List l1;
    String msg;
    int selected = 0;
    int ordered[] = new int[6];
    public void init(){
        l1 = new List(3, true);
        l1.add("Java");         l1.add("Advance Java");
        l1.add("OS");           l1.add("Python");
        l1.add("JavaScript");   l1.add("Data Structures");
        add(l1);
        l1.addItemListener(this);
        for(int i = 0; i < ordered.length; ordered[i  ] = -1);
    }
    public void itemStateChanged(ItemEvent ie){
        repaint();
    }
    private void removeElement(int index){
        for(int i = index; i < selected; i  ){
            ordered[i] = ordered[i  ];
        }
    }
    public void paint(Graphics g){
        msg = "The Selected Subjects are: ";
        int indexes[] = l1.getSelectedIndexes();
        for(int i = 0; i < indexes.length; i  ){
            int j = 0;
            for(; j < ordered.length; j  ){
                if(ordered[j] == indexes[i]){  break;   }
            }
            if(j == ordered.length){
                ordered[selected  ] = indexes[i];
            }
        }
        for(int i = 0; i < selected; i  ){
            int j = 0;
            for(; j < indexes.length; j  ){
                if(ordered[i] == indexes[j]){  break;   }
            }
            if(j == indexes.length){
                selected--;
                removeElement(i);
            }
        }
        for(int i = 0; i < selected; System.out.println(l1.getItem(ordered[i  ])));
        System.out.println("nn");
        for(int i = 0; i < selected; msg  = l1.getItem(ordered[i  ])   " ");
        g.drawString(msg, 10, 200);
    }
}
 

Я начинающий программист, пожалуйста, будьте немного снисходительны ко мне, если я не следую определенным соглашениям, или если имена моих переменных не очень хороши, или если я допустил какие-либо глупые ошибки, которые должны были быть замечены. Любые и все формы вклада приветствуются!

Ответ №1:

Апплеты мертвы — мы не собираемся их поддерживать, вашей школе пора выбираться из темных веков.

Вам повезет, если вы найдете кого-нибудь, у кого уже есть большой опыт работы с AWT, даже с Swing. Пришло время перейти на JavaFX.

В любом случае, это позволит выполнить то, что вы пытаетесь сделать, но вам придется выяснить, как это работает, и повторно применить его к вашему решению

 import java.awt.BorderLayout;
import java.awt.EventQueue;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.awt.event.MouseAdapter;
import java.awt.event.MouseEvent;
import java.util.ArrayList;
import java.util.List;
import javax.swing.DefaultListModel;
import javax.swing.JButton;
import javax.swing.JFrame;
import javax.swing.JList;
import javax.swing.JOptionPane;
import javax.swing.JPanel;
import javax.swing.JScrollPane;

public class Test {

    public static void main(String[] args) {
        new Test();
    }

    public Test() {
        EventQueue.invokeLater(new Runnable() {
            @Override
            public void run() {
                JFrame frame = new JFrame();
                frame.add(new TestPane());
                frame.pack();
                frame.setLocationRelativeTo(null);
                frame.setVisible(true);
            }
        });
    }

    public class TestPane extends JPanel {

        private JList<String> lstItems;
        private List<String> selectedItems = new ArrayList<>(25);

        public TestPane() {
            setLayout(new BorderLayout());

            DefaultListModel<String> model = new DefaultListModel<>();
            model.addElement("Java");
            model.addElement("Advance Java");
            model.addElement("OS");
            model.addElement("Python");
            model.addElement("JavaScript");
            model.addElement("Data Structures");

            lstItems = new JList<>(model);

            add(new JScrollPane(lstItems));

            lstItems.addMouseListener(new MouseAdapter() {                
                @Override
                public void mouseClicked(MouseEvent e) {
                    int index = lstItems.locationToIndex(e.getPoint());
                    if (index >= 0) {
                        String value = lstItems.getModel().getElementAt(index);
                        List<String> selectedValues = lstItems.getSelectedValuesList();

                        List<String> temp = new ArrayList<>(selectedItems);
                        temp.removeAll(selectedValues);
                        selectedItems.removeAll(temp);

                        if (selectedValues.contains(value)) {
                            selectedItems.add(value);
                        }
                    }
                }
            });

            JButton btn = new JButton("Order");
            btn.addActionListener(new ActionListener() {
                @Override
                public void actionPerformed(ActionEvent e) {
                    JOptionPane.showMessageDialog(TestPane.this, selectedItems);
                }
            });
            add(btn, BorderLayout.SOUTH);
        }

    }
}