2012-03-23 4 views
0

그래서, 새로운 인스턴스를 설정하기 위해 생성자에게 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); 
    } 

답변

1

이 줄 의미가 없습니다.

Project2(sid, length, widths, service); 

t 생성자를 통해 새로운 클래스에 정보를 전달하고, 그것을 수행합니다. 그러나 생성자를 호출하려면 new 키워드를 사용하여 클래스 이름을 처리해야하며이 클래스를 호출하지 말고 다른 하나, 맞죠? 같은 뭔가 : MydisplayDialog 방금 수집 한 정보를 표시하는 새로운 클래스, 아마도되는 JDialog를,이다

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

.

+0

와우. 괜찮아. 그건 의미가 있습니다. 그래도 새 창에 표시하는 것이 아니라 텍스트 필드 영역에 toString을 표시하고 싶습니다. : o하지만 나는 네가하는 말을 본다. 그래서, 아마도 ... 'Project2 newBoatSlip = 새 Project2 (sid, 길이, 너비, 서비스); jtaToString.setText (ToString()); ' –

+0

@ 대니얼 : 원하는 것은 JTextArea에 표시하고, 그 다음에 setText (...를 통해 JTextArea에 문자열을 전달하는 것입니다.)'메소드를 사용하거나 JTextArea에 append (...) 메소드를 통해 String을 추가 할 수있다. 새 Project2 개체를 만들거나 해당 생성자를 호출하지 마십시오. 다시 말하지만, 그건 말이 안됩니다. 그런데 원래 질문에서 JTextArea의 내용을 표시하려고한다고 언급해야합니다. 우리가 이런 것들을 추측하게 만드는 데는 아무런 의미가 없습니다. –

+0

내가 그 일을 할 수 있는지 모르겠다. 나는이 프로젝트의 지시 사항을보다 잘 설명해야했다. :/ '보트 슬립 오브젝트를 생성하는 데이 정보를 사용해야합니다. 그런 다음 보트 슬립 클래스에서 toString() 메서드를 호출하고 출력을 JTextArea의 사용자에게 표시해야합니다. 출력물은 JTextArea에 깔끔하게 맞아야하며 단어가 함께 작동하거나 정중선이 깨지지 않으면 쉽게 읽을 수 있어야합니다. 전체 크레디트를 받으려면 클래스에 인스턴스를 만들고 메소드를 호출하여 GUI에 출력을 생성해야합니다. ' –

1

나는 당신이 생성자를 사용하고 싶지 않다 ... 당신은 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과 애플리케이션 로직을 처리해야합니다.

+1

네, 좋은 조언입니다 - 1+! –

+0

오케이. 그래서 저는 다음과 같이 해결했습니다 : 'Project2 newBoatSlip = new Project2 (sid, length, widths, service); \t \t \t jtaToString.setText (""+ newBoatSlip.toString()); –

+0

@ Daniel'Dige'Force : 당신은 달릴 수는 있지만 잘 작성되지는 않았습니다. 그것은 의도 된 방식대로 객체를 사용하지 않습니다. 호버크라프트 : 고마워! – Danation

관련 문제