2015-03-07 5 views
0

Im работает с событиями JButton. У меня есть класс JPanel, давайте позвоним Panel1, содержащий публичный JButton, назовем его Button1. При щелчке по этой кнопке:JButton Action Listener из другого класса

//Inside Panel1 
Button1.addActionListener(new ActionListener() { 
    public void actionPerformed(ActionEvent e) 
    { 
     System.out.println("1") 
    } 
}); 

С другой JPanel класса, давайте назовем его panel2, который содержит Panel1, я должен обрабатывать событие «Button1 прессованные».

//Inside Panel2 
Panel1.Button1.addActionListener(new ActionListener() { 
    public void actionPerformed(ActionEvent e) 
    { 
     System.out.println("2") 
    } 
}); 

Полученный результат:

2 
1 

Но я заинтересован иметь:

1 
2 

Любое предложение?

+0

Добавить слушателей действий в обратном порядке: сначала добавить действие слушателя другой панели, а затем действие слушателя на панели. – RealSkeptic

+0

@RealSkeptic: нет, что не гарантируется. В этой ситуации нет гарантии заказа. Для оригинального плаката похоже, что вы используете статические поля, и я советую вам не делать этого. Вероятно, вам придется изменить логику вашей программы, если вы хотите гарантировать заказ. Не уверен в отношении других, но мне нужно больше информации о вашей общей проблеме, чтобы помочь. –

ответ

1

Если вы добавите ActionListeners в JButton, вы не можете гарантировать заказ, с которым они будут стрелять, и знать, что порядок добавления не является гарантией для помощи. Один из способов - использовать ActionListener для изменения состояния объекта, а затем прослушать его. Это гарантирует, что ActionListener срабатывает первым.

Например, используя PropertyChangeListener в качестве 2-го слушателя:

import java.awt.event.ActionEvent; 
import java.awt.event.ActionListener; 
import java.beans.PropertyChangeEvent; 
import java.beans.PropertyChangeListener; 

import javax.swing.*; 

public class ActionOrder extends JPanel { 
    ButtonPanel buttonPanel = new ButtonPanel(); 
    OtherPanel otherPanel = new OtherPanel(); 

    public ActionOrder() { 
     add(buttonPanel); 
     add(otherPanel); 

     buttonPanel.addPropertyChangeListener(ButtonPanel.PRESSED, new PropertyChangeListener() { 

     @Override 
     public void propertyChange(PropertyChangeEvent evt) { 
      otherPanel.appendText("Button 1 Pressed"); 
     } 
     }); 
    } 

    private static void createAndShowGui() { 
     ActionOrder mainPanel = new ActionOrder(); 

     JFrame frame = new JFrame("ActionOrder"); 
     frame.setDefaultCloseOperation(JFrame.DISPOSE_ON_CLOSE); 
     frame.getContentPane().add(mainPanel); 
     frame.pack(); 
     frame.setLocationByPlatform(true); 
     frame.setVisible(true); 
    } 

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


class ButtonPanel extends JPanel { 
    public static final String PRESSED = "pressed"; 
    private JButton button1 = new JButton("Button 1"); 

    public ButtonPanel() { 
     add(button1); 
     button1.addActionListener(new ActionListener() { 

     @Override 
     public void actionPerformed(ActionEvent e) { 
      System.out.println("1"); 
      firePropertyChange(PRESSED, null, PRESSED); 
     } 
     }); 

     setBorder(BorderFactory.createTitledBorder("Button Panel")); 
    } 
} 

class OtherPanel extends JPanel { 
    private JTextArea textArea = new JTextArea(10, 20); 

    public OtherPanel() { 
     add(new JScrollPane(textArea)); 
     setBorder(BorderFactory.createTitledBorder("Other Panel")); 
    } 

    public void appendText(String text) { 
     textArea.append(text + "\n"); 
     System.out.println("2"); 
     System.out.println(); 
    } 
} 
Смежные вопросы