#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);
}
}
}