Ничто из того, что мне не удалось найти в любом месте, работает, и код, похоже, отличается от того, как вы это сделаете в апплете, к которому я привык. Я новичок в качелях. Как я могу добавить 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) {
}
}`
Не используйте статические методы и статические переменные.. Это ужасный дизайн. Похоже, что большая часть вашего кода исходит из примеров учебников Swing, поэтому, что не следует полностью примерам, тогда у вас не было бы этой проблемы. В примерах создается панель для добавления в фрейм, а затем весь код, который содержится в классе панели. – camickr
'frame.pack()' и 'frame.setVisible()' следует вызывать после добавления компонентов. – nachokk
Вы правы, это один из моих первых случаев использования Swing. Я всегда делал апплеты и LWJGL раньше. Где я называю 'createAndShowGUI()' тогда? Единственное место, где он работает, - это метод 'main' ... – IHazABone