簡體   English   中英

ActionListener 沒有用 JButton 單擊替換所需的面板

[英]ActionListener not replacing desired panel with JButton click

我正在創建待辦事項列表,並嘗試在 FooterPanel 中創建一個名為“添加任務”的按鈕,該按鈕將消失並替換為提示用戶輸入有關他們想要的任務的信息添加到列表中。

我只是在使用 ActionListener 時遇到了麻煩,因為它似乎什么也沒做。 我不確定我做錯了什么。

以下是相關代碼,如有任何幫助,我們將不勝感激。 主要方法將包含主要問題,但我已經提供了我的代碼的 rest 作為上下文。

import java.lang.reflect.Array;
import java.util.*;
import java.lang.*;
import java.awt.event.*;
import java.awt.*;
import javax.swing.*;


public class ToDo{

    ArrayList<Item> TodoList = new ArrayList<>();
    static int size=0;

    public void addItem(String item, String category, int priority)
    {
        TodoList.add(new Item(item,category,priority));
        size++;
    }

    //remove item at specified index spot
    private void removeItem(String item )
    {
        TodoList.remove(getIndex(item));
        size--;

    }

    public void getList()
    {
        for (Item item : TodoList)
        {
            System.out.println(item.toString());
        }
    }

    // Return the index of the searched item, accounts for differences in white spaces and cases
    public int getIndex(String item)
    {
        //return -1 if not found  ,  \\s+ => more than one white space
        int index = -1;
        String itemString = item.replaceAll("\\s+", "").toLowerCase();
        for (int i = 0; i < TodoList.size(); i++) {
            String listItem = TodoList.get(i).getItem().replaceAll("\\s+", "").toLowerCase();
            if (listItem.contains(itemString)) {
                index = i;
                break;
            }
        }
        return index;
    }

    public String getItemString(int i)
    {
        return TodoList.get(i).toString();
    }

    public void sortItems()
    {
        TodoList.sort(Item.priorityComparator);
    }


    public void print() {
        System.out.println("To-do List: ");
        System.out.println("-----------");
        getList();
        if (TodoList == null) {
            System.out.println("You're all done for today!");
        }
    }



    public static void main(String[] args) {

        ToDo todo = new ToDo();

        todo.addItem("Get pickles", "Shopping", 2);
        todo.addItem("Read book", "School", 3);
        todo.addItem("Send letter", "Other", 1);
        todo.addItem("Buy planner", "School", 4);
        todo.addItem("Get potatoes", "Shopping", 3);

        //initialize data array to hold items
        String[] data = new String[100];

        for (int i = 0; i < size; i++) {
            //sort items and populate data array with items converted to string
            todo.sortItems();
            data[i] = todo.getItemString(i);
        }

        ///declare components of panels
        JCheckBox[] checkBox;
        JButton resetButton = new JButton("Reset List");
        ;
        JButton addButton = new JButton("Add Task");

        JFrame frame = new JFrame();
        frame.setDefaultCloseOperation(JFrame.DISPOSE_ON_CLOSE);

        JPanel headerPanel = new JPanel();
        JPanel contentPane = new JPanel();
        JPanel footerPanel = new JPanel();

        JLabel title = new JLabel("TO-DO");
        headerPanel.add(title);


        contentPane.setBorder(BorderFactory.createEmptyBorder(5, 5, 5, 5));
        contentPane.setLayout(new BorderLayout(5, 5));

        checkBox = new JCheckBox[size];
        JPanel centerPanel = new JPanel();
        centerPanel.setLayout(new GridLayout(0, 1, 5, 5));

        for (int i = 0; i < size; i++) {
            checkBox[i] = new JCheckBox(data[i]);
            centerPanel.add(checkBox[i]);
        }

        contentPane.add(headerPanel, BorderLayout.NORTH);
        contentPane.add(centerPanel, BorderLayout.CENTER);


        footerPanel.add(resetButton);
        footerPanel.add(addButton);

        contentPane.add(footerPanel, BorderLayout.SOUTH);



        JButton okButton = new JButton("OK");
        okButton.addActionListener(new ActionListener() {
           public void actionPerformed(ActionEvent e) {
               footerPanel.add(new JTextField("What category is the task?"));
           }
       });


        frame.setContentPane(contentPane);
        frame.setSize(400,500);
        frame.setResizable(false);
        frame.setLocationByPlatform(true);
        frame.setVisible(true);




        todo.print();

        System.out.println("-----------------\n");

        todo.removeItem("Get pickles");

        todo.sortItems();

        
        todo.print();




    }
}

以下是代碼中引用的Item class:

import java.util.Comparator;

public class Item{

    private String item;
    private String category;
    private int priority;



    //default constructor to initialize
    public Item(String item, String category, int priority){
        this.item = item;
        this.category = category;
        this.priority = priority;
    }



    public String getItem() {
        return item;
    }

    public void setItem(String item) {
        this.item = item;
    }

    public String getCategory() {
        return category;
    }

    public void setCategory(String category) {
        this.category = category;
    }

    public void setPriority(int priority) {
        this.priority = priority;
    }

    public int getPriority() {
        return priority;
    }


    public String translatePriority()
    {
        if (priority == 1)
            return "low";
        else if (priority == 2)
            return "medium";
        else if (priority == 3)
            return "high";
        else if (priority == 4)
            return "urgent";
        else
            return "invalid priority";

    }


    @Override
    public String toString() {
        return "PRIORITY: " +
                translatePriority() + " || " + category + ", " + item + " ";
    }

    // override Compare method of Comparator in order to reorder based on priority
    public static Comparator<Item> priorityComparator = new Comparator<Item>() {

        public int compare(Item i1, Item i2) {

            int priority1 = i1.getPriority();
            int priority2 = i2.getPriority();

            /*For ascending order*/
            return priority2-priority1;

        }};



}

首先:

  1. 變量名稱不應以大寫字符開頭
  2. 無需使用 static 變量。

提示用戶輸入有關他們想要添加到列表中的任務的信息。

使用JOptionPane提示用戶輸入信息。

請參閱: 如何制作對話框以獲取更多信息和示例。

footerPanel.add(new JTextField("What category is the task?"));

文本字段未顯示,因為您需要在添加組件后revalidate()面板,以便可以為文本字段指定大小和位置。

但是,即使這樣做也無濟於事,因為您創建了一個沒有引用的組件,因此您將無法輕松獲取用戶鍵入的文本。 此外,您將如何從面板中刪除組件(無需參考即可輕松完成)?

JOptionPane 是更簡單的解決方案。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM