确定。我不确定我的问题的标题以及我是否使用了正确的词语。 因为我是一个自学成才的全业余爱好者,我发现很难问我的问题,因为我不知道正确的条款,所以我会在代码中写一些东西然后问我的问题。我写的没有import语句,设置布局和滚动条以及其他一些东西只是为了让它更简单。
public class Foo{
JTextArea text;
public static void main(String[] args){
Foo foo = new Foo;
foo.go();
}
public void go(){
JFrame frame = new JFrame();
JButton button = new JButton("One");
JButton button2 = new JButton("Two");
JPanel panel = new JPanel();
frame.setVisible(true);
frame.setSize(600, 300);
frame.getContentPane().add(BorderLayout.EAST, panel);
panel.setLayout(new BoxLayout(panel, BoxLayout.Y_AXIS));
panel.add(button);
panel.add(button2);
text = new JTextArea(10, 20);
panel.add(text);
button.addActionListener(new ButtLis());
button2.addActionListener(new ButtLis());
}
class ButtLis implements ActionListener{
@override
// this is where I have the problem
text.append();
}
}
我想要的是一个if语句进入我的内部类(ButtLis),它将决定按下哪个按钮,然后根据它将某些文本附加到JTextArea。但我不知道该怎么做才能找出按下哪个按钮。
答案 0 :(得分:2)
你有几个选择。在当前情况下,JButton
对象在构造函数中是本地作用域的,您需要检查actionCommmand
,因为无法从ActionListener
访问对象及其当前作用域。所以你可以这样做
class ButtLis implements ActionListener{
@Override
public void actionPerformed(ActionEvent e) {
String command = e.getActionCommand();
if ("One".equals(command)) {
// do something
}
}
}
如果你想比较对象来源,你需要给你的按钮一个全局范围
public class Foo {
JButton button = new JButton("One");
JButton button2 = new JButton("Two");
class ButtLis implements ActionListener{
@Override
public void actionPerformed(ActionEvent e) {
if (e.getSource() == button) {
}
}
}
}
第三种选择是单独注册按钮
public void go() {
...
button.addActionListener(new ActionListener(){
@Override
public void actionPerformed(ActionEvent e) {
// do something
}
});
}
答案 1 :(得分:1)
我认为这就是你要找的东西,虽然我很难推荐它:
class ButtLis implements ActionListener {
private JTextArea text;
public ButtLis(JTextArea text) {
this.text = text;
}
@Override
public void actionPerformed(ActionEvent e) {
JButton button = (JButton)e.getSource(); // Warning! This is not good coding practice, because you don't know that the source will be a button
text.append(button.getText());
}
}
相反,我建议:
JButton button1 = new JButton("One");
button1.addActionListener(new ActionListener() {
@Override
public void actionPerformed(ActionEvent e) {
text.append("one");
}
});
使用“匿名内部类”来定义动作侦听器。对于Button2,你会说类似的事情。这里的好处是动作监听器就在它工作的按钮旁边,它会阻止你有一个ActionListener,它必须检查每个事件的来源(使用e.getSource()
)。
答案 2 :(得分:0)
在你的ButtLis中,添加这个
class ButtLis implements ActionListener {
public void actionPerformed(ActionEvent e) {
e.getSource();
//Your implementation
}
}
答案 3 :(得分:0)
这里是实现ActionListener的类:
class ButtLis implements ActionListener {
JTextArea text;
public ButtLis(JTextArea text) {
this.text = text;
}
@Override
public void actionPerformed(ActionEvent ae) {
if (ae.getSource() instanceof JButton) {
JButton button = (JButton) ae.getSource();
if(text != null){
text.append(" " + button.getText());
}
}
}
}
这里是如何向按钮添加动作侦听器:
button.addActionListener(new ButtLis(text));
button2.addActionListener(new ButtLis(text));
对于一般的ActionListsner,我建议像这样的其他客户ActionListener:
abstract class ButtLis implements ActionListener {
protected String sourceEvent; //or you can use a reference for the source object
public ButtLis(String sourceEvent) {
this.sourceEvent = sourceEvent;
}
public String getSourceEvent() {
return sourceEvent;
}
@Override
public void actionPerformed(ActionEvent ae) {
customer_actionPerformed(ae);
}
public abstract void customer_actionPerformed(ActionEvent ae);
}
为任何组件添加动作侦听器与普通的ActionListener相同:
//for exemple button
button.addActionListener(new ButtLis(button.getText()) {
@Override
public void customer_actionPerformed(ActionEvent ae) {
text.append(getSourceEvent());
}
});