试图将JCheckBox用作JButton(Java Swing)

时间:2013-11-14 16:45:54

标签: java swing jdialog jcheckbox

当我按下JCheckBox时,我试图让JDialog“弹出”(如果不是这样)。我想用的是按钮。我希望我发布这个权利,我的第一篇文章:)

我收到一条错误消息,说我无法将JCheckBox强制转换为JButton。你能帮我这么做吗?

包装模型;

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

import javax.swing.JButton;
import javax.swing.JCheckBox;
import javax.swing.JDialog;
import javax.swing.JFrame;
import javax.swing.JLabel;
import javax.swing.JTextField;

public class FirstJDialog extends JDialog 
{
    private Controller controller;

    private HotelJDialog hotelJDialog;
    private PartnerJDialog partnerJDialog;

    private JLabel lblName, lblArrival, lblDeparture, lblLekture, lblHotel, lblPartner;
    private JTextField txfName, txfArrival, txfDeparture;
    private JCheckBox ckbLekture, ckbHotel, ckbPartner;

    public FirstJDialog()
    {
        this.setDefaultCloseOperation(JFrame.HIDE_ON_CLOSE);
        this.setTitle("Person informationer");
        this.setLayout(null);
        this.setSize(900, 650);
        this.setLocation(500, 200);
        this.setResizable(false);

        // Labels for TextField ######################################################################
        lblName = new JLabel("Navn:");
        this.add(lblName);
        this.lblName.setSize(100, 40);
        this.lblName.setLocation(25, 25);

        lblArrival = new JLabel("Ankomst:");
        this.add(lblArrival);
        this.lblArrival.setSize(100, 40);
        this.lblArrival.setLocation(25, 70);

        lblDeparture = new JLabel("Afgang:");
        this.add(lblDeparture);
        this.lblDeparture.setSize(100, 40);
        this.lblDeparture.setLocation(25, 115);

        // TextField ######################################################################
        txfName = new JTextField();
        this.add(txfName);
        this.txfName.setSize(200, 40);
        this.txfName.setLocation(180, 25);

        txfArrival = new JTextField();
        this.add(txfArrival);
        this.txfArrival.setSize(200, 40);
        this.txfArrival.setLocation(180, 70);

        txfDeparture = new JTextField();
        this.add(txfDeparture);
        this.txfDeparture.setSize(200, 40);
        this.txfDeparture.setLocation(180, 115);

        // CheckBox ######################################################################
        ckbLekture = new JCheckBox();
        this.add(ckbLekture);
        this.ckbLekture.setSize(25, 25);
        this.ckbLekture.setLocation(25, 200);

        ckbHotel = new JCheckBox();
        this.add(ckbHotel);
        this.ckbHotel.setSize(25, 25);
        this.ckbHotel.setLocation(25, 250);

        ckbPartner = new JCheckBox();
        this.add(ckbPartner);
        this.ckbPartner.setSize(25, 25);
        this.ckbPartner.setLocation(25, 300);

        // Labels for CheckBox ######################################################################
        lblLekture = new JLabel("Foredrag");
        this.add(lblLekture);
        this.lblLekture.setSize(100, 40);
        this.lblLekture.setLocation(125, 190);

        lblHotel = new JLabel("Hotel");
        this.add(lblHotel);
        this.lblHotel.setSize(100, 40);
        this.lblHotel.setLocation(125, 240);

        lblPartner = new JLabel("Ledsager");
        this.add(lblPartner);
        this.lblPartner.setSize(100, 40);
        this.lblPartner.setLocation(125, 290);

        // JDialogs ######################################################################
        hotelJDialog = new HotelJDialog();
        partnerJDialog = new PartnerJDialog();

        controller = new Controller();
        ckbHotel.addActionListener(controller);
    }

    private class Controller implements ActionListener
    {                   

        public void actionPerformed(ActionEvent e) 
        {
            JButton source = (JButton) e.getSource();
            JCheckBox sourxe = (JCheckBox) e.getSource();
            if(sourxe.equals(ckbHotel))
                hotelJDialog.setVisible(true);
        }   
    }

2 个答案:

答案 0 :(得分:2)

该错误是尝试将JCheckBox投射到JButton的结果。此演员表是不必要的,因为您从未使用任何JButton注册此侦听器,仅使用ckbHotel JCheckBox

在给定的示例中,无需强制转换,您只需检查源:

if(ckbHotel.equals(e.getSource()))
    hotelJDialog.setVisible(true);

您还可以为此复选框注册其他操作侦听器。没有必要使用单个动作侦听器来提供容器中的所有控件,例如:

ckbHotel.addActionListener(new ActionListener() {
    @Override
    public void actionPerformed(ActionEvent e) {
        hotelJDialog.setVisible(true);
    }
});

答案 1 :(得分:0)

 JButton source = (JButton) e.getSource(); 

这一行给出了这个错误。删除它并添加此

JCheckBox sourxe = (JCheckBox) e.getSource();
if(sourxe.isSelected())
      hotelJDialog.setVisible(true);

如果选择了源,则仅显示您的对话框。