2012-03-22 16 views
2

私はJFrameに5つのボタンを含むJPanelを持っています。別のJPanelには、「削除ボタン」というボタンがあります。このボタンをクリックして、他の5つのボタンのうちの1つをクリックして削除するかどうかを選択します。誰でも助けてくれますか?特定のボタンを削除する

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_ AFTER YOU CLICK THE BUTTON ON LEFT PANEL IT WILL BE DELETED AS SHOWN HERE:何でしたあなたはすでに試してみる?短いが関連性のあるコード例 – Thomas

+0

クリックされた次のボタンが "削除"されることを示すブール変数を使用します。変数がtrueに設定されている場合、他のボタンがクリックされると、ボタンの表示をfalseに設定します。ブール変数を再びfalseに初期化します。 – Marcelo

+2

コードを送信するときは、コードが実行されていることを確認してください。これにより、他人の時間が節約され、質問された質問に集中することができます。メインメソッドの追加、要素のパック、デフォルトのクローズ操作の設定、インクルードステートメントの追加、コンポーネントのJFrameへの追加はそれほど頼り過ぎません。 –

答えて

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

これは私が多かれ少なかれ持っているものですが、表示されているものはボタン自体を削除します。実際には、別のボタンを削除するボタンを持つことです。 –

+0

ボタン* A *を削除する 'AbstractAction'を設定しますボタン* B *のアクション。 – aioobe

+0

私は自分自身を明確にしていません、Aボタンは "DELETE"のようなものは、時間と時間が異なる可能性がある別のボタンを削除します。ボタンCを一度削除してからボタンEを削除したい場合があります。 –

5

ボタンリスナーで一連の責任を使います。 「削除する」ボタンと「削除」ボタンをリッスンする1つのボタンリスナー。通常の操作では、このボタンリスナーは、「削除する」ボタンイベントを既存のボタンイベントに送信するだけですが、「削除」ボタンイベントを聞くと、既存のボタンリスナに送信せずに「次の」ボタンイベントをキャプチャしますボタンを削除するように動作します。

あなたはいくつかのコードを提供しました。ここでは、責任の連鎖を使用するソリューションです。基本的に、1つのActionListenerがイベントを処理できない場合は、それを次の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

コードのご提案はありますか?私は申し訳ありませんが、私は初心者であり、私はあなたが守っていることをかなり確信していません... –

+0

初心者はどれくらいですか? 5つ(またはそれ以上)のボタンでウィンドウを描画できますか?可能であれば、コードを投稿してください。責任の連鎖がわからない場合、Googleはすぐに実証できるよりも多くの(そしてより良い)例を提供することができます。 –

+0

ええ、私はそれ以上のことをすることもできます。私は責任の連鎖が何であるか把握しようとします...とにかくありがとうございました –

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 BUTTON

+0

+1しかしあなたのボタンは_shouting_です! :-) – trashgod

関連する問題