簡體   English   中英

有沒有更好的方法在 for 循環中為 JButtons 創建一個 actionListener?

[英]Is there a better way to create an actionListener to JButtons in a for-loop?

我想創建一些代表特定時間間隔的JButton 所有JButton基本上共享相同的actionListener :它們將特定的間隔標記為“免費”(“Frei”)或“不免費”(“Belegt”)。 為此,他們不僅需要更改文本,而且還必須調用另一個 class 的方法,該方法使用他們的區間作為@parameter 我創建JButton並命名JLabel ,如下所示:

for (int i = 1; i <= numberOfIntervalls; i++) {
            String toolTextString;
            if(controller.getCalendar(calendarName).isFree(i, controller.getDayString(year, month, day))) {
                buttonText = "Frei";
                toolTextString = "Belegt";
            }else {
                buttonText = "Belegt";
                toolTextString = "Frei";
            }
            
            if(i%5 == 0) {
                gridx = 1;
                buttonGridy += 2;
                textGridy += 2;
            }else if(i < 5){
                gridx = (i%5);
            }else {
                gridx = (i%5) + 1;
            }
            intervallButtons[i-1] = new JButton(buttonText);
            intervallButtons[i-1].addActionListener((ActionListener) this);
            intervallLabels[i-1] = new JLabel(intervallLabelBuilder(i));
            intervallButtons[i-1].setToolTipText(String.format("als %s markieren", toolTextString));
            
            GridBagConstraints gbc_btnNewButton = new GridBagConstraints();
            gbc_btnNewButton.insets = new Insets(0, 0, 0, 5);
            gbc_btnNewButton.gridx = gridx;
            gbc_btnNewButton.gridy = buttonGridy;       
            contentPane.add(intervallButtons[i-1], gbc_btnNewButton);
            
            GridBagConstraints gbc_labels = new GridBagConstraints();
            //gbc_lblNewLabel.insets = new Insets(0, 0, 5, 5);
            gbc_labels.gridx = gridx;
            gbc_labels.gridy = textGridy;
            contentPane.add(intervallLabels[i-1], gbc_labels); 
            
        }
    }

我的actionListener方法是這樣的,因為我知道numberOfIntervalls = 12 ,對於快速調整, numberOfIntervalls應該是一個變量,但它s static and final`:

public void actionPerformed (ActionEvent e){
         System.out.println("-----------");
            if(e.getSource() == intervallButtons[0]){
                if(!controller.getCalendar(calendarName).isLoaded(controller.getDayString(year, month, day)))
                        controller.getCalendar(calendarName).summonDay(controller.getDayString(year, month, day));
                if(controller.getCalendar(calendarName).isFree(1, controller.getDayString(year, month, day))) {
                    controller.getCalendar(calendarName).setFree(1, false, controller.getDayString(year, month, day));
                    buttonText = "Belegt";
                    intervallButtons[0].setToolTipText("Als Frei markieren");
                    
                }else {
                    controller.getCalendar(calendarName).setFree(1, true, controller.getDayString(year, month, day));
                    buttonText = "Frei";
                    intervallButtons[0].setToolTipText("Als Belegt markieren");
                }
                intervallButtons[0].setText(buttonText);
                intervallButtons[0].setEnabled(false);
                intervallButtons[0].setEnabled(true);

            }else if(e.getSource() == intervallButtons[1]){
                if(!controller.getCalendar(calendarName).isLoaded(controller.getDayString(year, month, day)))
                        controller.getCalendar(calendarName).summonDay(controller.getDayString(year, month, day));
                
                if(controller.getCalendar(calendarName).isFree(2, controller.getDayString(year, month, day))) {
                    controller.getCalendar(calendarName).setFree(2, false, controller.getDayString(year, month, day));
                    buttonText = "Belegt";
                    intervallButtons[1].setToolTipText("Als Frei markieren");
                }else {
                    controller.getCalendar(calendarName).setFree(2, true, controller.getDayString(year, month, day));
                    buttonText = "Frei";
                    intervallButtons[1].setToolTipText("Als Belegt markieren");
                }
                intervallButtons[1].setText(buttonText);
                intervallButtons[1].setEnabled(false);
                intervallButtons[1].setEnabled(true);
            }
            else if (e.getSource() == intervallButtons[2]){
                if(!controller.getCalendar(calendarName).isLoaded(controller.getDayString(year, month, day)))
                    controller.getCalendar(calendarName).summonDay(controller.getDayString(year, month, day));
                if(controller.getCalendar(calendarName).isFree(3, controller.getDayString(year, month, day))) {
                    controller.getCalendar(calendarName).setFree(3, false, controller.getDayString(year, month, day));
                    buttonText = "Belegt";
                    intervallButtons[2].setToolTipText("Als Frei markieren");
                }else {
                    controller.getCalendar(calendarName).setFree(3, true, controller.getDayString(year, month, day));
                    buttonText = "Frei";
                    intervallButtons[2].setToolTipText("Als Belegt markieren");
                }
                intervallButtons[2].setText(buttonText);
                intervallButtons[2].setEnabled(false);
                intervallButtons[2].setEnabled(true);
                
            }else if (e.getSource() == intervallButtons[3]){
                if(!controller.getCalendar(calendarName).isLoaded(controller.getDayString(year, month, day)))
                    controller.getCalendar(calendarName).summonDay(controller.getDayString(year, month, day));
                if(controller.getCalendar(calendarName).isFree(4, controller.getDayString(year, month, day))) {
                    controller.getCalendar(calendarName).setFree(4, false, controller.getDayString(year, month, day));
                    buttonText = "Belegt";
                    intervallButtons[3].setToolTipText("Als Frei markieren");
                }else {
                    controller.getCalendar(calendarName).setFree(4, true, controller.getDayString(year, month, day));
                    buttonText = "Frei";
                    intervallButtons[3].setToolTipText("Als Belegt markieren");
                }
                intervallButtons[3].setText(buttonText);
                intervallButtons[3].setEnabled(false);
                intervallButtons[3].setEnabled(true);
                
            }else if (e.getSource() == intervallButtons[4]){
                if(!controller.getCalendar(calendarName).isLoaded(controller.getDayString(year, month, day)))
                    controller.getCalendar(calendarName).summonDay(controller.getDayString(year, month, day));
                if(controller.getCalendar(calendarName).isFree(5, controller.getDayString(year, month, day))) {
                    controller.getCalendar(calendarName).setFree(5, false, controller.getDayString(year, month, day));
                    buttonText = "Belegt";
                    intervallButtons[4].setToolTipText("Als Frei markieren");
                }else {
                    controller.getCalendar(calendarName).setFree(5, true, controller.getDayString(year, month, day));
                    buttonText = "Frei";
                    intervallButtons[4].setToolTipText("Als Belegt markieren");
                }
                intervallButtons[4].setText(buttonText);
                intervallButtons[4].setEnabled(false);
                intervallButtons[4].setEnabled(true);
                
            }else if (e.getSource() == intervallButtons[5]){
                if(!controller.getCalendar(calendarName).isLoaded(controller.getDayString(year, month, day)))
                    controller.getCalendar(calendarName).summonDay(controller.getDayString(year, month, day));
                if(controller.getCalendar(calendarName).isFree(6, controller.getDayString(year, month, day))) {
                    controller.getCalendar(calendarName).setFree(6, false, controller.getDayString(year, month, day));
                    buttonText = "Belegt";
                    intervallButtons[5].setToolTipText("Als Frei markieren");
                }else {
                    controller.getCalendar(calendarName).setFree(6, true, controller.getDayString(year, month, day));
                    buttonText = "Frei";
                    intervallButtons[5].setToolTipText("Als Belegt markieren");
                }
                intervallButtons[5].setText(buttonText);
                intervallButtons[5].setEnabled(false);
                intervallButtons[5].setEnabled(true);
                
            }else if (e.getSource() == intervallButtons[6]){
                if(!controller.getCalendar(calendarName).isLoaded(controller.getDayString(year, month, day)))
                    controller.getCalendar(calendarName).summonDay(controller.getDayString(year, month, day));
                if(controller.getCalendar(calendarName).isFree(7, controller.getDayString(year, month, day))) {
                    controller.getCalendar(calendarName).setFree(7, false, controller.getDayString(year, month, day));
                    buttonText = "Belegt";
                    intervallButtons[6].setToolTipText("Als Frei markieren");
                }else {
                    controller.getCalendar(calendarName).setFree(7, true, controller.getDayString(year, month, day));
                    buttonText = "Frei";
                    intervallButtons[6].setToolTipText("Als Belegt markieren");
                }
                intervallButtons[6].setText(buttonText);
                intervallButtons[5].setEnabled(false);
                intervallButtons[5].setEnabled(true);
                
            }else if (e.getSource() == intervallButtons[7]){
                if(!controller.getCalendar(calendarName).isLoaded(controller.getDayString(year, month, day)))
                    controller.getCalendar(calendarName).summonDay(controller.getDayString(year, month, day));
                if(controller.getCalendar(calendarName).isFree(8, controller.getDayString(year, month, day))) {
                    controller.getCalendar(calendarName).setFree(8, false, controller.getDayString(year, month, day));
                    buttonText = "Belegt";
                    intervallButtons[7].setToolTipText("Als Frei markieren");
                }else {
                    controller.getCalendar(calendarName).setFree(8, true, controller.getDayString(year, month, day));
                    buttonText = "Frei";
                    intervallButtons[7].setToolTipText("Als Belegt markieren");
                }
                intervallButtons[7].setText(buttonText);
                intervallButtons[7].setEnabled(false);
                intervallButtons[7].setEnabled(true);
                
            }else if (e.getSource() == intervallButtons[8]){
                if(!controller.getCalendar(calendarName).isLoaded(controller.getDayString(year, month, day)))
                    controller.getCalendar(calendarName).summonDay(controller.getDayString(year, month, day));
                if(controller.getCalendar(calendarName).isFree(9, controller.getDayString(year, month, day))) {
                    controller.getCalendar(calendarName).setFree(9, false, controller.getDayString(year, month, day));
                    buttonText = "Belegt";
                    intervallButtons[8].setToolTipText("Als Frei markieren");
                }else {
                    controller.getCalendar(calendarName).setFree(9, true, controller.getDayString(year, month, day));
                    buttonText = "Frei";
                    intervallButtons[8].setToolTipText("Als Belegt markieren");
                }
                intervallButtons[8].setText(buttonText);
                intervallButtons[8].setEnabled(false);
                intervallButtons[8].setEnabled(true);
                
            }else if (e.getSource() == intervallButtons[9]){
                if(!controller.getCalendar(calendarName).isLoaded(controller.getDayString(year, month, day)))
                        controller.getCalendar(calendarName).summonDay(controller.getDayString(year, month, day));
                if(controller.getCalendar(calendarName).isFree(10, controller.getDayString(year, month, day))) {
                    controller.getCalendar(calendarName).setFree(10, false, controller.getDayString(year, month, day));
                    buttonText = "Belegt";
                    intervallButtons[9].setToolTipText("Als Frei markieren");
                }else {
                    controller.getCalendar(calendarName).setFree(10, true, controller.getDayString(year, month, day));
                    buttonText = "Frei";
                    intervallButtons[9].setToolTipText("Als Belegt markieren");
                }
                intervallButtons[9].setText(buttonText);
                intervallButtons[9].setEnabled(false);
                intervallButtons[9].setEnabled(true);
                
            }else  if (e.getSource() == intervallButtons[10]){
                if(!controller.getCalendar(calendarName).isLoaded(controller.getDayString(year, month, day)))
                    controller.getCalendar(calendarName).summonDay(controller.getDayString(year, month, day));
                if(controller.getCalendar(calendarName).isFree(11, controller.getDayString(year, month, day))) {
                    controller.getCalendar(calendarName).setFree(11, false, controller.getDayString(year, month, day));
                    buttonText = "Belegt";
                    intervallButtons[10].setToolTipText("Als Frei markieren");
                }else {
                    controller.getCalendar(calendarName).setFree(11, true, controller.getDayString(year, month, day));
                    buttonText = "Frei";
                    intervallButtons[10].setToolTipText("Als Belegt markieren");
                }
                intervallButtons[10].setText(buttonText);
                intervallButtons[10].setEnabled(false);
                intervallButtons[10].setEnabled(true);
                
            }else if (e.getSource() == intervallButtons[11]){
                if(!controller.getCalendar(calendarName).isLoaded(controller.getDayString(year, month, day)))
                    controller.getCalendar(calendarName).summonDay(controller.getDayString(year, month, day));
                if(controller.getCalendar(calendarName).isFree(12, controller.getDayString(year, month, day))) {
                    controller.getCalendar(calendarName).setFree(12, false, controller.getDayString(year, month, day));
                    buttonText = "Belegt";
                    intervallButtons[11].setToolTipText("Als Frei markieren");
                }else {
                    controller.getCalendar(calendarName).setFree(12, true, controller.getDayString(year, month, day));
                    buttonText = "Frei";
                    intervallButtons[11].setToolTipText("Als Belegt markieren");
                }
                intervallButtons[11].setText(buttonText);
                intervallButtons[11].setEnabled(false);
                intervallButtons[11].setEnabled(true);
                
            }
        }

它非常長,而且只有一個變量幾乎不能調整,所以我想要的只是遵循創建for循環中的代碼:

 if(!controller.getCalendar(calendarName).isLoaded(controller.getDayString(year, month, day)))
                        controller.getCalendar(calendarName).summonDay(controller.getDayString(year, month, day));
                if(controller.getCalendar(calendarName).isFree(1, controller.getDayString(year, month, day))) {
                    controller.getCalendar(calendarName).setFree(i, false, controller.getDayString(year, month, day));
                    buttonText = "Belegt";
                    intervallButtons[i-1].setToolTipText("Als Frei markieren");
                    
                }else {
                    controller.getCalendar(calendarName).setFree(i, true, controller.getDayString(year, month, day));
                    buttonText = "Frei";
                    intervallButtons[i-1].setToolTipText("Als Belegt markieren");
                }
                intervallButtons[i-1].setText(buttonText);
                intervallButtons[i-1].setEnabled(false);
                intervallButtons[i-1].setEnabled(true);

但它不起作用,因為actionListener只能處理非局部變量......你有什么想法嗎?

並且 int i 對於每個 JButton 都是不同的,因為它需要是來自該 for 循環的 int i。

一種方法是為按鈕設置“動作命令”。

當您創建您使用的按鈕時:

JButton button = new JButton(...);
button.setActionCommand("" + i);

然后在您使用的 ActionListener 中:

int index = Integer.parseInt( event.getActionCommand() );

暫無
暫無

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

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