多个按钮做某事

时间:2017-06-20 04:33:28

标签: java jframe jpanel

我还在学习如何在java中编码,我现在可以使用一些帮助。

这是我写的当前代码。如您所见,它是一个带有一堆按钮和滑块的简单面板。每当我按下不同的按钮时,我想制作一个不同的控制台输出。所以,如果我点击Back,它应该在控制台中写回。如果我在滑块上滚动一下,它应该在控制台中写入新值。类似的东西。我知道必须使用actionListener和actionPerformed完成,但经过一些实验后我无法使其工作。

import javax.swing.*;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;

public class Gui implements ActionListener {

// Adding all the goods
JFrame frame;
JPanel panel;
JButton endButton;
JButton backButton;
JButton calcButton;
JSlider maxIterations;
JLabel view;

Gui() {

// General
this.frame = new JFrame("Trying my best, I swear");
this.frame.setSize(500, 500);
this.frame.setVisible(true);
this.panel = new JPanel();

// Buttons
this.backButton = new JButton("Back");
this.calcButton = new JButton("Calc");
this.endButton = new JButton("End");
this.panel.add(this.endButton);
this.panel.add(this.calcButton);
this.panel.add(this.backButton);
this.frame.add(this.panel);

// Label
JLabel label1 = new JLabel();
label1.setText("Space Holer");
panel.add(label1);

// Slider
JSlider slider = new JSlider(JSlider.HORIZONTAL, 0, 30, 15);
panel.add(slider);
slider.setMinorTickSpacing(2);
slider.setMajorTickSpacing(5);
slider.setPaintTicks(true);
slider.setPaintLabels(true);

// Make the buttons do something
this.endButton.addActionListener(this);
}

public void actionPerformed(ActionEvent ae) {
System.out.println("End");
}


 public static void main(String[] args) {
  @SuppressWarnings("unused")
  Gui m = new Gui();
  }
 }

3 个答案:

答案 0 :(得分:1)

你可以......

利用按钮的actionCommand属性,该属性在创建时设置为ActionEvent。如果您自己没有为按钮提供actionCommand,则会默认为text值,因此您可以执行类似

的操作
public class ButtonActionHandler implements ActionListener {

    @Override
    public void actionPerformed(ActionEvent e) {
        switch (e.getActionCommand()) {
            case "Back": 
                System.out.println("Back");
                break;
            case "Calc": 
                System.out.println("Calc");
                break;
            case "End": 
                System.out.println("End");
                break;
        }
    }

}

如果ActionListener位于定义按钮的类的外部,这是很好的,因为您无法访问按钮引用。它也很好,因为你可以有很多按钮(包括工具栏按钮和菜单项)做同样的事情

你可以......

利用ActionListener source属性

public class ButtonActionHandler implements ActionListener {

    @Override
    public void actionPerformed(ActionEvent e) {
        if (e.getSource() == backButton) {
            System.out.println("Back");
        } else if (e.getSource() == calcButton) {
            System.out.println("Calc");
        } else if (e.getSource() == endButton) {
            System.out.println("End");
        }
    }

}

如果将ActionListener定义为定义按钮的父类的内部类,这很有用

你可以......

使用直接针对按钮注册的匿名类...

endButton.addActionListener(new ActionListener() {
    @Override
    public void actionPerformed(ActionEvent e) {
        System.out.println("End");
    }
});

按钮执行单个独立任务

的情况很好

你可以......

使用Action API,它允许您定义一个独立的工作单元,按钮可以使用它来完全配置它。这在您可以从UI的不同位置执行的重复操作时非常有用,例如"打开文件"菜单栏,工具栏和一些向导中包含的操作。您甚至可以将它与密钥绑定API一起用于扩展功能

有关详细信息,请参阅How to use actions

答案 1 :(得分:0)

需要将ActionListener添加到所有按钮

calcButton.addActionListener(new ActionListener() {
            @Override
            public void actionPerformed(ActionEvent e) {
                System.out.println("calcButton");
            // calculation for slider.
            }
        });

        backButton.addActionListener(new ActionListener() {

            @Override
            public void actionPerformed(ActionEvent e) {
                System.out.println("backButton");
            }
        }); 

然后你得到不同的控制台输出。

答案 2 :(得分:0)

将所有组件放入jframe后,在jframe上调用setVisible

将ActionListener添加到每个按钮。将ChangeListener添加到滑块,因为它没有ActionListener。

查看完整代码:

import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;

import javax.swing.JButton;
import javax.swing.JFrame;
import javax.swing.JLabel;
import javax.swing.JPanel;
import javax.swing.JSlider;

public class Gui implements ActionListener {

    // Adding all the goods
    JFrame frame;
    JPanel panel;
    JButton endButton;
    JButton backButton;
    JButton calcButton;
    JSlider maxIterations;
    JLabel view;

    Gui() {

        // General
        this.frame = new JFrame("Trying my best, I swear");
        this.frame.setSize(500, 500);
        this.panel = new JPanel();

        // Buttons
        this.backButton = new JButton("Back");
        this.calcButton = new JButton("Calc");
        this.endButton = new JButton("End");
        this.panel.add(this.endButton);
        this.panel.add(this.calcButton);
        this.panel.add(this.backButton);
        this.frame.add(this.panel);

        // Label
        JLabel label1 = new JLabel();
        label1.setText("Space Holer");
        panel.add(label1);

        // Slider
        JSlider slider = new JSlider(JSlider.HORIZONTAL, 0, 30, 15);
        panel.add(slider);
        slider.setMinorTickSpacing(2);
        slider.setMajorTickSpacing(5);
        slider.setPaintTicks(true);
        slider.setPaintLabels(true);

        // Make the buttons do something
        this.endButton.addActionListener(this);
        this.backButton.addActionListener(this);
        this.calcButton.addActionListener(this);
        slider.addChangeListener(e -> {
            Object source = e.getSource();
            if (source instanceof JSlider) {
                int value = ((JSlider) source).getValue();
                System.out.println(value);
            }
        });
        frame.pack();
        this.frame.setVisible(true);
    }

    public void actionPerformed(ActionEvent ae) {
        Object source = ae.getSource();
        if (source instanceof JButton) {
            String text = ((JButton) source).getText();
            System.out.println(text);
        }
    }

    public static void main(String[] args) {
        @SuppressWarnings("unused")
        Gui m = new Gui();
    }
}