JRadiobuttons结合JButtons实现。错误方法不是抽象的,不会覆盖抽象方法

时间:2014-08-04 11:05:28

标签: java swing jbutton jradiobutton

尝试使用3个JRadiobutton和2个ItemListener选择的一组JButton来实现一组3 ActionListener s { 。

按下“确定”JButton后,应检测当前的JRadioButton选项。

我尝试通过将ActionEventItemEvent合并到一个方法中来实现这一点,其中if语句可用于验证按下“确定”时选择了哪个JRadioButton

产生的错误消息是method is not abstract and does not override abstract method actionPerformed(ActionEvent) in actionListener

当main方法变为抽象时,它将不会实例化。

我尝试在@Override方法之前放置public void actionPerformed并使用alt + ins插入覆盖,但这不起作用。

代码如下:

import javax.swing.*;
import java.awt.*;
import java.awt.event.*;
import static javax.swing.JFrame.EXIT_ON_CLOSE;

class MainMenu extends JFrame implements ActionListener, ItemListener {

  JPanel pnl = new JPanel();
  JPanel grid = new JPanel(new GridLayout(3, 1));
  JRadioButton input1 = new JRadioButton("Enter New Information", true);
  JRadioButton input2 = new JRadioButton("Load from a CSV file");
  JRadioButton input3 = new JRadioButton("Save to a CSV file");
  ButtonGroup inputs = new ButtonGroup();
  JButton b1 = new JButton("OK");
  JButton b2 = new JButton("Cancel");
  JTextArea txtArea = new JTextArea(5, 25);

  public void actionPerformed(ActionEvent event2, ItemEvent event1) {

    txtArea.setText(event2.getActionCommand() + " Clicked");

    if (event2.getSource() == b1 && event1.getItemSelectable() == input1) {
        System.exit(0);
    }
    if (event2.getSource() == b1 && event1.getItemSelectable() == input2) {

        final JFileChooser fc = new JFileChooser();
        int returnVal = fc.showOpenDialog(null);
        System.exit(0);
    }
    if (event2.getSource() == b1 && event1.getItemSelectable() == input3) {
        System.exit(0);
    }
    if (event2.getSource() == b2) {
        System.exit(0);
    }
  }

  public MainMenu() {

    super("Main Menu");
    setSize(300, 200);
    Container contentPane = getContentPane();
    ButtonGroup buttonGroup = new javax.swing.ButtonGroup();
    inputs.add(input1);
    inputs.add(input2);
    inputs.add(input3);

    setDefaultCloseOperation(EXIT_ON_CLOSE);
    add(grid);
    add(pnl);
    grid.add(input1);
    grid.add(input2);
    grid.add(input3);
    grid.setBorder(BorderFactory.createLineBorder(Color.BLACK));
    pnl.add(b1);
    pnl.add(b2);
    pnl.add(txtArea);

    b1.addActionListener(this);
    b2.addActionListener(this);
    input1.addItemListener(this);
    input2.addItemListener(this);
    input3.addItemListener(this);
    contentPane.add("North", grid);
    contentPane.add("South", pnl);
    setVisible(true);
  }
}

1 个答案:

答案 0 :(得分:1)

基本上,您违反了ActionListenerJRadioButton的合同要求(因为他们希望您传递对实现ItemListener接口的类的引用)...

你不能简单地#34;化妆"以这种方式回调,您必须满足您实现的接口的要求。

事实上,JRadioButton更改后你并不在乎,只有在按下OkCancel按钮时才关心它们,所以你可以得到它们完全取消ItemListener要求,只需检查您感兴趣的selected的{​​{1}}状态,例如......

JRadioButton

作为一个可运行的例子......

@Override
public void actionPerformed(ActionEvent event2) {

    txtArea.setText(event2.getActionCommand() + " Clicked");
    Object source = event2.getSource();

    if (source == b1 && input1.isSelected()) {
        System.exit(0);
    }
    if (source == b1 && input2.isSelected()) {

        final JFileChooser fc = new JFileChooser();
        int returnVal = fc.showOpenDialog(null);
        System.exit(0);
    }
    if (event2.getSource() == b1 && input3.isSelected()) {
        System.exit(0);
    }
    if (event2.getSource() == b2) {
        System.exit(0);
    }
}

您可能需要仔细查看the Interfaces trailHow to Use Buttons, Check Boxes, and Radio Buttons