2013-09-19 1 views
3

Ничто из того, что мне не удалось найти в любом месте, работает, и код, похоже, отличается от того, как вы это сделаете в апплете, к которому я привык. Я новичок в качелях. Как я могу добавить ActionListener (это то, что он? Или я ищу что-то еще?) Для моих JButtons? (Я не уверен, что является причиной code блока идти все шатким, как это, я не могу это исправить.)Как добавить ActionListener в JButton в статическом экземпляре?

`

import java.awt.*; 
import java.awt.event.*; 

import javax.swing.*; 

public class Main implements ActionListener{ 

static String answerOne = ""; 
static String answerTwo = ""; 
static boolean answerable = false; 
static int labelX = 240, labelY = 48; 
static int questionWrite = 0; 
static String text = "Welcome! I will ask simple, two-answer questions, and you will answer them. Simple as that. "; 
static int charIndex = 0; 

private static void createAndShowGUI() { 
    JFrame frame = new JFrame("FrameDemo"); 
    frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); 

    JLabel emptyLabel = new JLabel(""); 
    emptyLabel.setPreferredSize(new Dimension(300, 225)); 
    frame.getContentPane().add(emptyLabel, BorderLayout.CENTER); 

    frame.pack(); 
    frame.setVisible(true); 

    frame.setLayout(null); 
    frame.setResizable(false); 

    JPanel buttons = new JPanel(new FlowLayout()); 
    final JButton buttonOne = new JButton(answerOne); 
    final JButton buttonTwo = new JButton(answerTwo); 
    final JButton buttonThree = new JButton("Continue"); 
    buttonThree.setActionCommand("continue"); 

    if (answerable == true) { 
    buttons.add(buttonOne); 
    buttons.add(buttonTwo); 
    } else { 
     buttons.add(buttonThree); 
    } 

    frame.add(buttons); 

    final JLabel centerText = new JLabel("<html>"); 
    frame.add(centerText); 

    buttons.reshape(50, 185, 200, 40); 
    centerText.reshape(10, 10, 280, 160); 

    Timer timer = new Timer(50, new ActionListener() { 
    @Override 
    public void actionPerformed(ActionEvent e) { 
     String labelText = centerText.getText(); 
     labelText += text.charAt(charIndex); 
     centerText.setText(labelText); 
     charIndex++; 
     if (charIndex >= text.length()) { 
      ((Timer)e.getSource()).stop(); 
     } 

     Object buttonClicked = e.getSource(); 
     if(buttonClicked == buttonOne) { 
      System.out.println("One."); 
     } 
     else if(buttonClicked == buttonTwo) { 
      System.out.println("Two."); 
     } 
     else if(buttonClicked == buttonThree) { 
      System.out.println("Continuing."); 
     } 

     //writeNext(Text to write, button one text, button two text, yes/no or "continue"); 
     switch(questionWrite) { 
     case 0: 
      writeNext("Welcome! I will ask simple, two-answer questions, and you will answer them. Simple as that. ", null, null, false); 
      break; 
     case 1: 
      writeNext("Is Canada the largest country?", "Yes", "No,", true); 
      break; 
     case 2: 
      writeNext("Have humans been to Mars?", "Yes", "No", true); 
      break; 
     } 
    } 

}); 

    timer.start(); 
} 

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



} 
public static void writeNext(String textM, String answerOneM, String answerTwoM, boolean answerableM) { 
     text = textM; 
     answerOne = answerOneM; 
     answerTwo = answerTwoM; 
     answerable = answerableM; 
    } 

@Override 
public void actionPerformed(ActionEvent arg0) { 

} 

}`

+1

Не используйте статические методы и статические переменные.. Это ужасный дизайн. Похоже, что большая часть вашего кода исходит из примеров учебников Swing, поэтому, что не следует полностью примерам, тогда у вас не было бы этой проблемы. В примерах создается панель для добавления в фрейм, а затем весь код, который содержится в классе панели. – camickr

+1

'frame.pack()' и 'frame.setVisible()' следует вызывать после добавления компонентов. – nachokk

+0

Вы правы, это один из моих первых случаев использования Swing. Я всегда делал апплеты и LWJGL раньше. Где я называю 'createAndShowGUI()' тогда? Единственное место, где он работает, - это метод 'main' ... – IHazABone

ответ

4
button.addActionListener(new ActionListener() 
{ 
    public void actionPerformed(ActionEvent e) 
    { 
     //action listener here 
    } 
}); 

С вами должны пройти в объекте до addActionListener, вы не можете сделать это из своего статического контекста. Таким образом, вы делаете экземпляр анонимного класса и передаете его с помощью обработчика событий.

В качестве альтернативы вы можете написать метод actionPerformed в своем классе. Вероятно, лучше всего дать ему конструктор, чтобы идентифицировать его.

private int button; 
public Main(int button) 
{ 
    this.button = button; 
} 

Затем добавить слушателя действия:

button.addActionListener(new Main(1)); //or pass it 2, 3, 4 ... just some unique integer 

Внутри вашего actionPerformed вы можете прочитать целое вы передаёте в

if(this.button==1) 
{ 
    //do button 1 stuff 
} 
+0

И я бы выполнил вышеуказанный код для каждой кнопки? – IHazABone

+0

@IHazABone да, тогда у вас есть другой исполнитель действия для каждой кнопки. – Cruncher

+0

Итак, для альтернативы, в методе actionPerformed, что я делаю, чтобы определить, какая кнопка нажата и что с ней делать? – IHazABone

Смежные вопросы