编写一个程序,使用 Java AWT 组件按选择顺序在列表中显示所选项目

Posted

技术标签:

【中文标题】编写一个程序,使用 Java AWT 组件按选择顺序在列表中显示所选项目【英文标题】:Write a program to display the selected items in a list in the order of selection using Java AWT Components 【发布时间】:2021-12-04 03:39:06 【问题描述】:

所以这个问题的基本思想是我们需要创建一段代码,向用户显示一个可供选择的主题列表。用户可以在列表中选择多个选项,我们需要按照用户选择选项的顺序显示选择的选项的输出。

如果列表继续:

第 1 项,第 2 项,第 3 项,第 4 项。

用户按以下顺序选择:

第 2 项,第 4 项,第 1 项。

然后我们需要显示选项被选中的顺序。

目前,我创建了一段代码,部分满足了这个要求,但是输出非常奇怪,难以解释......

如果用户第一次选择一个项目,输出会准确出现,但是当用户开始取消选择项目然后重新选择它们时,问题就开始了。当用户取消选择该项目时,它会将其从输出列表中删除,但是当用户重新选择该项目时,它根本不会出现在输出列表中。再次用文字或图像解释非常令人困惑,所以我将在这里发布代码供你们任何人复制和执行,以便能够理解荒谬的输出。

我问了我的一个朋友,我怎样才能让它工作,他们建议我使用队列,但是考虑到某些输入(例如当总共选择 4 个项目时取消选择第二个项目),我没有想到任何想法队列会完全崩溃的地方。

(注意:此代码仅适用于 Java 1.8 及其之前的版本,因为它需要使用自 1.9 及更高版本以来已弃用的 appletviewer,请记住这一点)

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("\n\n");
        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);
        

    

【讨论】:

以上是关于编写一个程序,使用 Java AWT 组件按选择顺序在列表中显示所选项目的主要内容,如果未能解决你的问题,请参考以下文章

java_AWT常用组件

Java学习——用户电话输入显示

Java中awt和swing的关系和区别

Java图形用户界面编程

java 的Swing

AWT编程