2016-03-10 30 views
1

所以我想我的按鈕被標記爲1-9,但我不想列出每個按鈕的所有動作偵聽器和動作命令。我怎樣才能做到這一點如何把actionlistenerand actioncommand放到多個jbuttons

,也是我無法使用add.ActionListener(本),所以我可以用

JButton[] button = new JButton[9]; 
    panel.setLayout(new GridLayout(3,3)); 
    for (int i = 0; i < button.length; i++) { 
     button[i] = new JButton(); 
     panel.add(button[i]); 
     String bu = Integer.toString(i); 
     button[i].setActionCommand(bu); 
     button[i].addActionListener(new ActionListener()); 

對不起進出口新的的Java Swing所以其升技混淆仍然

+1

也許可以考慮使用'Action'代替,參見[如何使用操作(http://docs.oracle.com/javase /tutorial/uiswing/misc/action.html) – MadProgrammer

+0

@kina'我無法使用add.ActionListener(this)'我會將其解釋爲「您仍然可以使用ActionListener」只是您不想讓容器類實現了一個ActionListener。對? – user3437460

回答

2

我不能使用add.ActionListener(本),所以我可以用

您創建一個實現一個ActionListener類。

最好還是創建一個實現Action的類。 Action與ActionListener相同。好處是可以對鍵綁定使用Action。

這是一個基本的例子:

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

public class CalculatorPanel extends JPanel 
{ 
    private JTextField display; 

    public CalculatorPanel() 
    { 
     Action numberAction = new AbstractAction() 
     { 
      @Override 
      public void actionPerformed(ActionEvent e) 
      { 
//    display.setCaretPosition(display.getDocument().getLength()); 
       display.replaceSelection(e.getActionCommand()); 
      } 
     }; 

     setLayout(new BorderLayout()); 

     display = new JTextField(); 
     display.setEditable(false); 
     display.setHorizontalAlignment(JTextField.RIGHT); 
     add(display, BorderLayout.NORTH); 

     JPanel buttonPanel = new JPanel(); 
     buttonPanel.setLayout(new GridLayout(0, 5)); 
     add(buttonPanel, BorderLayout.CENTER); 

     for (int i = 0; i < 10; i++) 
     { 
      String text = String.valueOf(i); 
      JButton button = new JButton(text); 
      button.addActionListener(numberAction); 
      button.setBorder(new LineBorder(Color.BLACK)); 
      button.setPreferredSize(new Dimension(30, 30)); 
      buttonPanel.add(button); 

      InputMap inputMap = button.getInputMap(JComponent.WHEN_IN_FOCUSED_WINDOW); 
      inputMap.put(KeyStroke.getKeyStroke(text), text); 
      inputMap.put(KeyStroke.getKeyStroke("NUMPAD" + text), text); 
      button.getActionMap().put(text, numberAction); 
     } 
    } 

    private static void createAndShowUI() 
    { 
     JFrame frame = new JFrame("Calculator Panel"); 
     frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); 
     frame.add(new CalculatorPanel()); 
     frame.pack(); 
     frame.setLocationRelativeTo(null); 
     frame.setVisible(true); 
    } 

    public static void main(String[] args) 
    { 
     EventQueue.invokeLater(new Runnable() 
     { 
      public void run() 
      { 
       createAndShowUI(); 
      } 
     }); 
    } 
} 

現在,您可以點擊按鈕或輸入號碼和值會被插入到文本字段中。

0

只需添加上主要行動執行方法。

例子是這樣的:

public void actionPerformed(ActionEvent e){ 
     // your todo code here 
} 

確保導入相應的軟件包。

0

你必須實現ActionListener

公共類對接實現的ActionListener {

public JPanel method() 
{ 

JPanel panel = new JPanel(); 
JButton[] button = new JButton[9]; 
panel.setLayout(new GridLayout(3, 3)); 
for (int i = 0; i < button.length; i++) 
{ 
    button[i] = new JButton(""+i); 
    panel.add(button[i]); 
    String bu = Integer.toString(i); 
    button[i].setActionCommand(bu); 
    button[i].addActionListener(this); 

} 
return panel; 
} 

@Override 
public void actionPerformed(ActionEvent e) 
{ 

} 

public static void main(String[] args) 
{ 

JFrame frame = new JFrame(); 
frame.add(new Butt().method()); 
frame.setVisible(true); 
frame.setSize(500, 500); 
} 

} 看看現在有沒有錯誤。

results

0

,也是我無法使用add.ActionListener(本),所以我可以用什麼

我會解釋你在這裏的意思是「你不能讓容器類實現了ActionListener,但仍允許使用ActionListener「。

如果是這樣的話,你至少有2種選擇:

  • 爲ActionListener的
  • 創建一個匿名類的ActionListener的

創建一個內部類使用GridLayout與內部類Actionlistener的示例:

enter image description here

如何把actionlistenerand actioncommand多個Jbuttons中

下使用內部類來處理按鈕的動作。

class MainPanel extends JPanel //not implementing ActionListener here 
{ 
    private JButton[] btns; 

    public MainPanel(){ 
     setPreferredSize(new Dimension(150, 150)); 
     setLayout(new GridLayout(3, 3)); 
     initComponents(); 
     addComponents(); 
    } 

    private void initComponents(){ 
     btns = new JButton[9]; 
     ButtonHandler bh = new ButtonHandler(); 
     for(int x=0; x<btns.length; x++){ 
      btns[x] = new JButton(Integer.toString(x+1)); 
      btns[x].addActionListener(bh); //NOT using addActionListener(this) 
     }     
    } 

    private void addComponents(){ 
     for(int x=0; x<btns.length; x++) 
      add(btns[x]);      //Add in sequential order into grid layout 
    } 

    private class ButtonHandler implements ActionListener 
    { 
     @Override 
     public void actionPerformed(ActionEvent e){ 
      String s = ((JButton)e.getSource()).getText(); 
      JOptionPane.showMessageDialog(null, "Button " + s + " was clicked."); 
     } 
    } 
} 

最後,在美國東部時間運行代碼:

class TestRunner 
{ 
    public static void main(String[] args) 
    { 
     SwingUtilities.invokeLater(new Runnable(){ 
      @Override 
      public void run(){ 
       JFrame frame = new JFrame("Buttons Pad"); 
       frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); 
       frame.add(new MainPanel()); 
       frame.pack(); 
       frame.setLocationRelativeTo(null); 
       frame.setVisible(true);    
      } 
     }); 
    } 
} 
+0

@kina你可以看看這裏,看看它是否有幫助。 – user3437460