麻烦挂钩一个ActionListener一个单选按钮

user10871827:

我试图创建一个个性测验。这个想法是,一个JPanel将显示的第一个问题,然后一旦单选按钮的用户选择一个,与所述的第二个问题的第二的JPanel将显示出来。因为我每次5题3个答案选择我认为这将是更快,更有效地创建一个用于创建单选按钮并增加了一个方法ActionListener,但我遇到了麻烦听者工作。眼下,看看它的工作原理我只是想被选中时,它改变按钮上的文字。

我尝试添加听者在按钮createButton的方法,但我没有运气。我本来它作为方法的参数,但让我尝试没有听众作为参数来创建它没有获得预期的结果。插入监听器作为一个参数没有改变的文本。

import java.awt.Container;
import java.awt.Dimension;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import javax.swing.BoxLayout;
import javax.swing.JFrame;
import javax.swing.JLabel;
import javax.swing.JPanel;
import javax.swing.JRadioButton;
import javax.swing.WindowConstants;

public class UserInterface extends ClickListener implements Runnable
{
    private ActionListener listeners;
    private JFrame frame;

    public UserInterface(){
    }
@Override
public void run() {
    frame = new JFrame("title");
    frame.setPreferredSize(new Dimension(1000, 1000));

    frame.setDefaultCloseOperation(WindowConstants.EXIT_ON_CLOSE);
    createComponents(frame.getContentPane());

    frame.pack();
    frame.setVisible(true);
}
public JFrame getFrame(){
    return frame;
}
private void createComponents(Container container){

    BoxLayout layout = new BoxLayout(container, BoxLayout.Y_AXIS);
    container.setLayout(layout); 

    container.add(QuizIntro());
    container.add(QuestionOne());
    container.add(QuestionOneGroup());
}
    public JLabel QuizIntro(){
    JLabel text = new JLabel("Intro text");
    return text;
} 
public JLabel QuestionOne(){
    JLabel text = new JLabel("1. this is the first question");

    return text;
}
    public JPanel QuestionOneGroup(){
        JRadioButton int1 = createButton("This button was created with my createButton method");
        JRadioButton e1 = new JRadioButton("This button was created without that method");
        JPanel panel = new JPanel();
        panel.add(int1);
        panel.add(e1);
        return panel;
    }
    public JRadioButton createButton(String text){
        JRadioButton b = new JRadioButton(text);
        b.addActionListener(listeners);
        return b;
    }


}

这里是我的动作侦听器

public class ClickListener implements ActionListener {
    private UserInterface ui; 
    private JRadioButton b; 
    @Override
    public void actionPerformed(ActionEvent ae) {
        if (b.isSelected()){
            b.setText("this works");
        }
    }
}

实际的结果是,该按钮被选择,但文本不会更改。我无法搞清楚,如果我跑了错误的测试,看看我的监听工作,或者如果我的听众是行不通的。

Frakcool:

你的主要问题是在这里:

private ActionListener listeners;

您创建一个ActionListener,但你永远不会调用它。

你也继承ClickListener,但从来没有使用它。

public class UserInterface extends ClickListener implements Runnable

在你的代码调用:

b.addActionListener(listeners); //Listeners is null!

所以,你告诉你JRadioButton有一个听众是null

所以,在这里,你有两种方式:

  1. 删除private ActionListener listeners;从你的程序和变化的顶部:

    b.addActionListener(listeners);
    

    至:

    b.addActionListener(this);
    
  2. 删除extends ClickListener从您的类定义并保持:

    b.addActionListener(listeners);
    

    但添加

    listeners = new ClickListener();
    

    之前

    createComponents(frame.getContentPane());
    

IMO我会采取第二个方法。

BTW你ActionListener真正改变你不需要的文本private变量,而是获得源代码,并投它。例如:

public void actionPerformed(ActionEvent ae) {
    JRadioButton b = (JRadioButton) ae.getSource();
    b.setText("this works");
}

忘了提,请遵循Java的命名约定,这样你的程序的可读性和大家谁读它可以理解的。

  • firstWordLowerCaseVariable
  • firstWordLowerCaseMethod()
  • FirstWordUpperCaseClass
  • ALL_WORDS_UPPER_CASE_CONSTANT

和缩进你的代码正确以及:)

本文收集自互联网,转载请注明来源。

如有侵权,请联系 [email protected] 删除。

编辑于
0

我来说两句

0 条评论
登录 后参与评论

相关文章