开始Java:通过事件侦听器传递给构造函数



因此,我想要完成的是将GUI数据发送到构造函数以设置一些新实例。但我真的不太确定如何做到这一点。老实说,我甚至不知道我所做的是否被允许,但伙计,如果只是这样,那就很容易了。

正如你所看到的,我已经设置了一个GUI。然后,当用户点击显示器时,我希望程序收集数据。然后将其发送给构造函数。

现在,这是一个学校项目,所以我真的不能要求完整的答案(代码),但希望有人能帮助我更好地理解我做错了什么。我得到的编译器错误是-返回类型无效-但我知道返回类型匹配。。。o-o;

我会提供你需要的任何其他信息。如果我能稍微修改一下这段代码,让它在编译器上更容易,就好像我做错了整个构造函数一样,让我知道。无论如何,我希望在编码时有更好的习惯。

import javax.swing.*;
import java.awt.*;
import java.awt.event.*;
public class Project2 extends JFrame {
//Instance Variables
private String sid;
private double length;
private boolean widths;
private String service;

//Declaring GUI Components
private JTextField jtfSSID;
private JTextField jtfLength;
private JTextArea jtaToString;
private JLabel jlblTitle;
private JLabel jlblSSID;
private JLabel jlblLength;
private JLabel jlblToString;
private JButton jbtDisplay;
private JButton jbtClear;
private JRadioButton jrbServiceStand;
private JRadioButton jrbServiceSuper;
private JRadioButton jrbServiceDelux;
private ButtonGroup bgService;
private JCheckBox jcbWStand;
private JCheckBox jcbWExtra;
private JPanel tpanel;
private JPanel ipanel;
private JPanel wpanel;
private JPanel spanel;
private JPanel opanel;
private final int WIDTH = 500;
private final int HEIGHT = 200;
//main method for inst and cust frame
public static void main(String[] args){
    Project2 frame = new Project2();
}
//Constructors + GUI constructs
public Project2(){
    setTitle("Project 2 : Bahia Mar Marina");
    setSize(WIDTH, HEIGHT);
    setLocation(300, 200);
    setDefaultCloseOperation(EXIT_ON_CLOSE);
    setLayout(new BorderLayout());
    buildTitle();
    buildIdentity();
    buildWidth();
    buildService();
    buildOutput();
    add( tpanel, BorderLayout.NORTH );
    add( ipanel, BorderLayout.WEST);
    add( wpanel, BorderLayout.CENTER );
    add( spanel, BorderLayout.EAST);
    add( opanel, BorderLayout.SOUTH );
    setVisible(true);
}
public Project2(String newSid, double newLength, boolean newWidths, String newService){
    setSid(newSid);
    setLength(newLength);
    isWidths(newWidths);
    setService(newService);
    }
    //-----------------------------setters
    public void setSid(String newSid){
        sid = newSid;
    }
    public void setLength(double newLength){
        if (length <= 20 && length >= 60 || length == 0) {
            length = newLength;
        }
        else {
            JOptionPane.showMessageDialog(null, "Invalid Length! Between 20 - 60 please! Or 0 as a placeholder.");
        }
    }
    public void isWidths(boolean newWidths){
        widths = newWidths;
    }
    public void setService(String newService){
            service = newService;
    }
    //-----------------------------------getters
    public String getSid(){
        return sid;
    }
    public double getLength(){
        return length;
    }
    public boolean getWidths(){
        return widths;
    }
    public String getService(){
        return service;
    }
    //---------------------------------------to string
    public String toString( ){
        String output = "Slip ID: " + sid + " length of " + length + "ft. Wide: " + widths + ".n-----Service Type: " + service;
        return output;
    }
//build top title
private void buildTitle(){
    tpanel = new JPanel();
    jlblTitle = new JLabel("Bahia Mar Marina");    
    tpanel.add(jlblTitle);

}
//build left ID
private void buildIdentity(){
    ipanel = new JPanel();
    ipanel.setLayout(new GridLayout (2,1));
    jlblSSID = new JLabel("SSID: ");
    jlblLength = new JLabel("Length: ");
    jtfSSID = new JTextField(4);
    jtfLength = new JTextField(4);
    ipanel.setBorder(BorderFactory.createTitledBorder("Identity:"));
    ipanel.add(jlblSSID);
    ipanel.add(jtfSSID);
    ipanel.add(jlblLength);
    ipanel.add(jtfLength);

}
//build center width
private void buildWidth(){
    wpanel = new JPanel();
    wpanel.setLayout(new GridLayout (1,2));
    jcbWStand = new JCheckBox("Standard");
    jcbWExtra = new JCheckBox("Extra-wide");
    wpanel.setBorder(BorderFactory.createTitledBorder("Width:"));
    wpanel.add(jcbWStand);
    wpanel.add(jcbWExtra);
}
//build left service
private void buildService(){
    spanel = new JPanel();
    spanel.setLayout(new GridLayout (3,1));
    jrbServiceStand = new JRadioButton("Standard");
    jrbServiceSuper = new JRadioButton("Superior");
    jrbServiceDelux = new JRadioButton("Deluxe");
    bgService = new ButtonGroup();
    bgService.add(jrbServiceStand);
    bgService.add(jrbServiceSuper);
    bgService.add(jrbServiceDelux);
    spanel.setBorder(BorderFactory.createTitledBorder("Service:"));
    spanel.add(jrbServiceStand);
    spanel.add(jrbServiceSuper);
    spanel.add(jrbServiceDelux);
}
//build bottom output and buttons
private void buildOutput(){
    opanel = new JPanel();
    opanel.setLayout(new GridLayout (2,1));
    jlblToString = new JLabel("Data Output:");
    jtaToString = new JTextArea(2,16);
    jbtDisplay = new JButton("Display!");
    jbtDisplay.addActionListener(new DisplayButtonListener()); 
    jbtClear = new JButton("-Clear-");
    jbtClear.addActionListener(new ClearButtonListener()); 
    opanel.add(jbtDisplay);
    opanel.add(jbtClear);
    opanel.add(jlblToString);
    opanel.add(jtaToString);

}
//Display Listener
private class DisplayButtonListener implements ActionListener{
    public void actionPerformed(ActionEvent e){ 
        sid = jtfSSID.getText();
        length = Double.parseDouble(jtfLength.getText());
        //service
        if(jrbServiceStand.isSelected()){
            service = "Standard";}
        else if(jrbServiceSuper.isSelected()){
            service = "Superior";}
        else if(jrbServiceDelux.isSelected()){
            service = "Deluxe";}
        //widths
        if(jcbWStand.isSelected()){
            widths = false;
        }
        if(jcbWExtra.isSelected()){
            widths = true;
        }
        Project2(sid, length, widths, service); 
    }
}
//Clear Listener
private class ClearButtonListener implements ActionListener{
    public void actionPerformed(ActionEvent e){
        jtfSSID.setText(" ");
        bgService.clearSelection();
        jtfLength.setText(" ");
        jcbWStand.setSelected(false);
        jcbWExtra.setSelected(false);

    }
}}

所以,只是为了具体并确保。。。这是错误代码:

//Display Listener
private class DisplayButtonListener implements ActionListener{
    public void actionPerformed(ActionEvent e){ 
        sid = jtfSSID.getText();
        length = Double.parseDouble(jtfLength.getText());
        //service
        if(jrbServiceStand.isSelected()){
        service = "Standard";}
        else if(jrbServiceSuper.isSelected()){
        service = "Superior";}
        else if(jrbServiceDelux.isSelected()){
        service = "Deluxe";}
        //widths
        if(jcbWStand.isSelected()){
        widths = false;
        }
        if(jcbWExtra.isSelected()){
        widths = true;
    }
    Project2(sid, length, widths, service); //THIS LINE HAS THE ERROR
}

我想把它传给:

public Project2(String newSid, double newLength, boolean newWidths, String newService){
    setSid(newSid);
    setLength(newLength);
    isWidths(newWidths);
    setService(newService);
    }

这一行毫无意义:

Project2(sid, length, widths, service);

如果你想通过构造函数将信息传递给一个新的类,那么当然可以,但要调用构造函数,你需要用new关键字处理类名,你不想调用同一个类,而是想调用不同的类,对吧?类似于:

MydisplayDialog displayDialog = new MydisplayDialog(this, sid, length, 
    widths, service);
displayDialog.setVisible(true); 

其中MydisplayDialog是一个新类,可能是一个JDialog,它显示您刚刚收集的信息。

我认为你不想使用构造函数。。。你想在Project2内部调用一个方法,对吧?你没有创建新的Project2,对吗?

我不会为监听器创建一个全新的类。我会做一些类似的事情:

public void newMethod(String newSid, double newLength, boolean newWidths, String newService){
    setSid(newSid);
    setLength(newLength);
    isWidths(newWidths);
    setService(newService);
}

然后,对于您的侦听器,我将创建一个匿名侦听器:

jbtDisplay.addActionListener(
        new ActionListener() {
            public void actionPerformed(ActionEvent event) {
                // do your stuff
                newMethod(sid, length, widths, service);
            }
        }

编辑:

根据你对另一个答案的评论,你确实想要第二个对象。因此,问题更为根本。您正在尝试将GUI与对象相结合。您需要有单独的类来处理JFrame和应用程序逻辑。

最新更新