2012-03-22 70 views
2

我有一個包含5個按鈕的JFrame的JPanel。在另一個JPanel中有一個叫做「刪除按鈕」的按鈕,我想要做的就是點擊這個按鈕,然後在其中一個按鈕上選擇要刪除的其他按鈕5。誰能幫我?刪除一個特定的按鈕

public class gui extends JFrame implements ActionListener 
    { 
     JPanel p1 = new JPanel(); 
     JPanel p2 = new JPanel(); 
     JPanel p2 = new JPanel(); 

     JButton b1 = new JButton("Delete"); 
     JButton b2 = new JButton("A"); 
     JButton b3 = new JButton("B"); 
     JButton b4 = new JButton("C"); 

     gui() 
     { 
     p1.setLayout(new GridLayout(1,2)); 
     p1.add(p2); 
     p1.add(p3); 

     p2.setLayout(new GridLayout(3,1)); 
     p2.add(b2); 
     p2.add(b3); 
     p2.add(b4); 
     p3.add(b1); 

     b1.addActionListener(this); 
     b2.addActionListener(this); 
     b3.addActionListener(this); 
     b4.addActionListener(this); 

     } 

    public void actionPerformed(ActionEvent e) 
    { 
     if (e.getSource() == b1) 
     // When I click this button I want to be able to delete a button of my choice (one of the other 3) 
    } 
    } 
+2

我們_might_能夠幫助你,如果你把更多的精力投入到你的問題:什麼了你已經試過了嗎?任何簡短但相關的代碼示例? – Thomas 2012-03-22 17:39:52

+0

使用一個布爾變量來指示下一個被點擊的按鈕將被「刪除」。如果變量設置爲true,則點擊其他按鈕,然後將該按鈕的可見性設置爲false。再次初始化布爾變量爲false。 – Marcelo 2012-03-22 17:45:19

+2

當你提交代碼時,確保它運行。這節省了其他人的時間,並讓他們專注於所問的問題。添加主要方法,打包元素,設置默認的關閉操作(包括include語句),以及將組件添加到JFrame中都沒有太多要求。 – 2012-03-22 19:43:10

回答

2

下面是一個代碼段踢你關閉在正確的方向:

import java.awt.event.ActionEvent; 
import javax.swing.*; 

public class FrameTestBase extends JFrame { 

    public static void main(String args[]) { 
     FrameTestBase t = new FrameTestBase(); 

     final JPanel p = new JPanel(); 

     final JButton button = new JButton(); 

     button.setAction(new AbstractAction("Remove me!") { 
      @Override 
      public void actionPerformed(ActionEvent e) { 
       p.remove(button); 
       p.revalidate(); 
       p.repaint(); 
      } 
     }); 

     p.add(button); 
     t.setContentPane(p); 

     t.setDefaultCloseOperation(EXIT_ON_CLOSE); 
     t.setSize(400, 400); 
     t.setVisible(true); 
    } 
} 

點擊之前:

enter image description here

後點擊3210

enter image description here


從評論:

要概括這一點,你可以創建一個AbstractAction,是以要被刪除的按鈕作爲參數。使用此AbstractAction,並根據需要更新它,只要您的刪除策略應該更改。

+0

這就是我有或多或少的,但你已經顯示刪除按鈕本身,我真正想要的是有一個按鈕,刪除另一個... – 2012-03-22 17:52:56

+0

然後只需設置'AbstractAction'刪除按鈕* A *作爲按鈕* B *的動作。 – aioobe 2012-03-22 17:53:48

+0

我沒有說清楚,那些說「DELETE」之類的按鈕將刪除另一個可能與時間不同的按鈕,這意味着我可能想刪除按鈕C一次,然後按下E – 2012-03-22 17:58:16

5

在按鈕偵聽器中使用責任鏈。一個Button偵聽器,用於偵聽「待刪除」按鈕和「刪除」按鈕。在正常操作下,這個按鈕監聽器只是將「要刪除的」按鈕事件發送到現有的按鈕事件,但是當它聽到「刪除」按鈕事件時,它會捕獲「下一個」按鈕事件而不發送給現有的按鈕監聽器,並用於移除按鈕。

好吧,你提供了一些代碼。這是一個使用責任鏈的解決方案。基本上,如果一個ActionListener不能處理該事件,它就會將它發送給下一個,依此類推。

import java.awt.GridLayou; 
import java.awt.event.ActionEvent; 
import java.awt.event.ActionListener; 
import javax.swing.JButton; 
import javax.swing.JFrame; 
import javax.swing.JPanel; 
import javax.swing.WindowConstants; 

public class Gui extends JFrame { 

    public static final long serialVersionUID = 1L; 

    JPanel p1 = new JPanel(); 
    JPanel p2 = new JPanel(); 
    JPanel p3 = new JPanel(); 

    JButton b1 = new JButton("Delete"); 
    JButton b2 = new JButton("A"); 
    JButton b3 = new JButton("B"); 
    JButton b4 = new JButton("C"); 

    public Gui() { 

    setDefaultCloseOperation(WindowConstants.EXIT_ON_CLOSE); 

    p1.setLayout(new GridLayout(1, 2)); 
    p1.add(p2); 
    p2.add(p3); 

    p2.setLayout(new GridLayout(3, 1)); 
    p2.add(b2); 
    p2.add(b3); 
    p2.add(b4); 

    p3.add(b1); 

    DoItListener doIt = new DoItListener(null); 
    DeleteItListener deleteIt = new DeleteItListener(this, doIt); 

    b1.addActionListener(deleteIt); 
    b2.addActionListener(deleteIt); 
    b3.addActionListener(deleteIt); 
    b4.addActionListener(deleteIt); 

    add(p1); 
    pack(); 
    } 

    public void deleteButton(String name) { 
    if (b2 != null && "A".equals(name)) { 
     p2.remove(b2); 
     b2 = null; 
     p2.invalidate(); 
     p2.redraw(); 
    } 
    if (b3 != null && "B".equals(name)) { 
     p2.remove(b3); 
     b3 = null; 
     p2.invalidate(); 
     p2.redraw(); 
    } 
    if (b4 != null && "A".equals(name)) { 
     p2.remove(b4); 
     b4 = null; 
     p2.invalidate(); 
     p2.redraw(); 
    } 
    } 

    public static void main(String[] args) { 
    java.awt.EventQueue.invokeLater(new Runnable() { 
     public void run() { 
     new Gui().setVisible(true); 
     } 
    }); 
    } 
} 

class DoItListener implements ActionListener { 

    private ActionListener delegate; 

    public DoItListener(ActionListener next) { 
    delegate = next; 
    } 

    public void actionPerformed(ActionEvent e) { 
    if (!("Delete".equals(e.getActionCommand()))) { 
     System.out.println("doing " + e.getActionCommand()); 
    } else if (delegate != null) { 
     delegate.actionPerformed(e); 
    } 
    } 
} 

class DeleteItListener implements ActionListener { 

    private Gui gui; 

    private boolean deleteNext; 

    private ActionListener delegate; 

    public DeleteItListener(Gui container, ActionListener next) { 
    gui = container; 
    delegate = next; 
    deleteNext = false; 
    } 

    public void actionPerformed(ActionEvent e) { 
    if ("Delete".equals(e.getActionCommand())) { 
     deleteNext = true; 
    } else if (deleteNext) { 
     gui.deleteButton(e.getActionCommand()); 
     deleteNext = false; 
    } else if (delegate != null) { 
     delegate.actionPerformed(e); 
    } 
    } 
} 
+0

你對代碼有什麼建議嗎?我很抱歉,但我是一名初學者,我不太確定你的評價... – 2012-03-22 17:51:06

+0

你有多少初學者?你能用五個(或更多)按鈕繪製窗口嗎?如果可以,請張貼代碼。如果您不知道責任鏈是什麼,Google可以爲您提供比我可以快速展示的更多(更好)的示例。 – 2012-03-22 17:56:11

+0

是的,我甚至可以做的比這更多,我會試圖找出什麼是一個責任鏈然後......無論如何謝謝 – 2012-03-22 18:01:13

1

看看玻璃板。這tutorial顯示它如何使用。

在高層次上,點擊「刪除」按鈕將把玻璃板聽者進入它的狀態:

  1. 檢測到點擊時,
  2. 確定目標成分,
  3. 確定是否該組件被允許刪除
  4. 如果是這樣,刪除該組件。

作爲設計說明,我會保留允許刪除的控件的Set,從而將問題區分開來。因此,當您添加允許刪除的按鈕時,您也有責任將其添加到刪除候選集中。

2

這裏試試這個代碼了:

import java.awt.*; 
import java.awt.event.*; 
import javax.swing.*; 

public class DeleteButtonExample extends JFrame 
{ 
    private boolean deleteNow = false; 
    private JButton deleteButton; 
    private JPanel leftPanel; 
    private JPanel rightPanel; 
    private JButton[] buttons = new JButton[5]; 

    private ActionListener deleteAction = new ActionListener() 
    { 
     public void actionPerformed(ActionEvent ae) 
     { 
      JButton button = (JButton) ae.getSource(); 
      if (deleteNow) 
      { 
       leftPanel.remove(button); 
       leftPanel.revalidate(); 
       leftPanel.repaint(); 
       deleteNow = false; 
      } 
      else 
      { 
       // Do your normal Event Handling here. 
       System.out.println("My COMMAND IS : " + button.getActionCommand()); 
      } 
     } 
    }; 

    private void createAndDisplayGUI() 
    { 
     setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); 
     setLocationByPlatform(true); 
     setLayout(new GridLayout(0, 2)); 

     leftPanel = new JPanel(); 
     leftPanel.setLayout(new GridLayout(0, 2)); 
     leftPanel.setBackground(Color.WHITE); 
     for (int i = 0; i < 5; i++) 
     { 
      buttons[i] = new JButton("" + i); 
      buttons[i].addActionListener(deleteAction); 
      buttons[i].setActionCommand("" + i); 
      leftPanel.add(buttons[i]); 
     } 

     rightPanel = new JPanel(); 
     rightPanel.setBackground(Color.BLUE); 

     JButton deleteButton = new JButton("DELETE"); 
     deleteButton.addActionListener(new ActionListener() 
     { 
      public void actionPerformed(ActionEvent ae) 
      { 
       JOptionPane.showMessageDialog(null, "Delete any Button from the Left Panel by clicking it." 
                        , "INFO : ", JOptionPane.INFORMATION_MESSAGE); 
       deleteNow = true;                 
      } 
     }); 
     rightPanel.add(deleteButton); 

     add(leftPanel); 
     add(rightPanel); 
     pack(); 
     setVisible(true); 
    } 

    public static void main(String... args) 
    { 
     SwingUtilities.invokeLater(new Runnable() 
     { 
      public void run() 
      { 
       new DeleteButtonExample().createAndDisplayGUI(); 
      } 
     }); 
    } 
} 

OUTPUT:

FIRST WINDOWWHEN YOU CLICKED DELETE BUTTONAFTER YOU CLICK THE BUTTON ON LEFT PANEL IT WILL BE DELETED AS SHOWN HERE

+0

+1,但你的按鈕是_shouting_! :-) – trashgod 2012-03-27 16:50:56