编写一个程序,使用 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 组件按选择顺序在列表中显示所选项目的主要内容,如果未能解决你的问题,请参考以下文章