繁体   English   中英

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

[英]Beginning Java : passing to a constructor thru event listener

所以,我想要完成的是将GUI数据发送到构造函数以设置一些新实例。 但我对如何实现这一目标并不十分确定。 老实说,我甚至不知道我在做什么是不允许的,但是如果它只是按照这种方式工作就很容易。

我有一个GUI设置,你可以看到。 然后当用户点击显示时,我希望程序收集数据。 然后将其发送给构造函数。

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

我会提供您需要的任何其他信息。 如果我可以修改这些代码以使编译器更容易,就好像我在做整个构造函数的事情错了,lemme知道。 无论如何,我希望在编码时有更好的习惯。

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和您的应用程序逻辑。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM