2015-02-07 3 views
0

나는 학교 프로젝트를위한 재고 관리 시스템 프로그램을 쓰고있다. 이것이 내가해야 할 마지막 일이지만, 상대방 자바 멍청한 놈으로 보아서, 나는 너의 도움을 친절히 요청한다.actionPerformed에서 호출 된 메서드에 객체 인수를 전달하는 방법은 무엇입니까?

나는 Search 클래스의 "search"JTextField에서 String 입력을 가져 와서 링크 된 Object (Product p)를 찾고 displayRecord 메소드에 전달하여 생성되는 DisplayRecord 클래스를가집니다. 이 부분은 완벽하게 작동합니다.

나는 해당 제품 p를 가져 와서 EditProduct 클래스 나 DeleteRecord 클래스 (JButton이 눌려진 것에 따라 다름)에 전달하여 사용자가 동일한 제품의 이름, 수량 또는 비용을 편집 할 수있게하려고합니다. 다음은 DisplayRecord, EditProduct 및 DeleteRecord 클래스입니다. 나는 무엇을해야할지 모른다. DeleteRecord 클래스 Aaand

import java.awt.BorderLayout; 
import java.awt.Dimension; 
import java.awt.GridLayout; 
import java.awt.event.ActionEvent; 
import java.awt.event.ActionListener; 
import java.awt.event.FocusEvent; 
import java.awt.event.FocusListener; 
import java.util.ArrayList; 
import javax.swing.BorderFactory; 
import javax.swing.Box; 
import javax.swing.BoxLayout; 
import javax.swing.JButton; 
import javax.swing.JFrame; 
import javax.swing.JLabel; 
import javax.swing.JOptionPane; 
import javax.swing.JPanel; 
import javax.swing.JTextField; 

public class EditProduct extends JFrame implements FocusListener, ActionListener { 

    final private StockList stocks; 
    final private ArrayList<Product> list; 
    JPanel top, bot; 
    JLabel nameLabel, costLabel, quantityLabel = new JLabel(); 
    JTextField nameField, costField, quantityField = new JTextField(); 
    JButton save, quit = new JButton(); 
    private GridLayout topLayout; 

    public EditProduct() { 
     stocks = new StockList(); 
     list = stocks.getList(); 
    } 

    public void editProduct(Product p) { 
     this.setTitle("Editing a Product"); 
     this.setDefaultCloseOperation(JFrame.DISPOSE_ON_CLOSE); 
     this.setPreferredSize(new Dimension(500, 250)); 

     top = new JPanel(); 
     topLayout = new GridLayout(3, 2, 5, 5); 
     top.setBorder(BorderFactory.createEmptyBorder(5, 20, 5, 5)); 
     top.setLayout(topLayout); 

     bot = new JPanel(); 
     bot.setLayout(new BoxLayout(bot, BoxLayout.LINE_AXIS)); 
     bot.add(Box.createHorizontalGlue()); 
     bot.setBorder(BorderFactory.createEmptyBorder(20, 5, 5, 5)); 

     nameLabel.setText("Name: "); 
     costLabel.setText("Cost: "); 
     quantityLabel.setText("Quantity: "); 
     top.add(nameLabel); 
     top.add(costLabel); 
     top.add(quantityLabel); 

     nameField = new JTextField(p.getName()); 
     costField = new JTextField(String.valueOf(p.getCost())); 
     quantityField = new JTextField(p.getQuantity()); 

     nameField.addFocusListener(this); 
     costField.addFocusListener(this); 
     quantityField.addFocusListener(this); 

     save.setText("Save"); 
     save.addActionListener(this); 
     quit.setText("Quit"); 
     quit.addActionListener(this); 

     bot.add(save); 
     bot.add(Box.createRigidArea(new Dimension(10, 0))); 
     bot.add(quit); 

     this.add(top); 
     this.add(bot, BorderLayout.SOUTH); 
     this.pack(); 
     this.setLocationRelativeTo(null); 
     this.setVisible(true); 
    } 

    @Override 
    public void focusGained(FocusEvent e) { 
     if (e.getSource() == nameField) { 
      nameField.setText(""); 
     } else if (e.getSource() == costField) { 
      costField.setText(""); 
     } else if (e.getSource() == quantityField) { 
      quantityField.setText(""); 
     } 
    } 

    @Override 
    public void focusLost(FocusEvent fe) { 
     //do nothing 
    } 

    @Override 
    public void actionPerformed(ActionEvent e) { 
     if (e.getSource() == save) { 
      String newName = nameField.getText(); 
      double newCost = Double.parseDouble(costField.getText()); 
      int newQty = Integer.parseInt(quantityField.getText()); 
      stocks.editProduct(newName, newCost, newQty); 
      this.dispose(); 
      JOptionPane.showMessageDialog(null, "Changes have been saved!", "Saved!", JOptionPane.PLAIN_MESSAGE); 
     } else if (e.getSource() == quit) { 

     } 
    } 
} 

:

import java.util.ArrayList; 
import javax.swing.JOptionPane; 

public class DeleteRecord { 

    private StockList stocks; 
    private ArrayList<Product> list; 

    public DeleteRecord() { 
     stocks = new StockList(); 
     list = stocks.getList(); 
    } 

    public DeleteRecord(Product p) { 
     String title = "Are you sure you want to delete " + p.getName() + "?"; 
     if (JOptionPane.showConfirmDialog(null, title, "Deleting...", JOptionPane.YES_NO_OPTION) == JOptionPane.YES_OPTION) { 
      stocks.deleteRecord(p); 
     } else { 
      new CreateDisplay(); 
     } 
    } 
} 

나는 대규모 포스트 및 텍스트 벽 죄송하지만 솔직히 아무 생각이 내 문제

import javax.swing.*; 
import java.awt.*; 
import java.awt.event.ActionEvent; 
import java.awt.event.ActionListener; 
import java.io.IOException; 
import java.util.ArrayList; 

public class DisplayRecord extends JFrame implements ActionListener { 

    final private StockList stocks; 
    final private ArrayList<Product> list; 
    JFrame showWindow; 

    private JPanel top, bot; 
    private JPanel barcodePanel1 = new JPanel(); 
    private JPanel barcodePanel2 = new JPanel(); 
    private JPanel namePanel1 = new JPanel(); 
    private JPanel namePanel2 = new JPanel(); 
    private JPanel descPanel1 = new JPanel(); 
    private JPanel descPanel2 = new JPanel(); 
    private JPanel compPanel1 = new JPanel(); 
    private JPanel compPanel2 = new JPanel(); 
    private JPanel ratingPanel1 = new JPanel(); 
    private JPanel ratingPanel2 = new JPanel(); 
    private JPanel costPanel1 = new JPanel(); 
    private JPanel costPanel2 = new JPanel(); 
    private JPanel quantityPanel1 = new JPanel(); 
    private JPanel quantityPanel2 = new JPanel(); 
    private JLabel barcodeLabel = new JLabel(); 
    private JLabel nameLabel = new JLabel(); 
    private JLabel descLabel = new JLabel(); 
    private JLabel compLabel = new JLabel(); 
    private JLabel ratingLabel = new JLabel(); 
    private JLabel costLabel = new JLabel(); 
    private JLabel quantityLabel = new JLabel(); 
    private GridLayout displayLayout; 
    JButton edit = new JButton("Edit"); 
    JButton backToMenu = new JButton("Back to Menu"); 
    JButton delete = new JButton("Delete"); 

    public DisplayRecord() { 
     stocks = new StockList(); 
     list = stocks.getList(); 
     try { 
      stocks.load(); 
     } catch (IOException ex) { 
      System.out.println("Cannot load file"); 
     } 
    } 

    public void displayRecord(Product p) { 
     this.setTitle("Displaying one record"); 
     this.setDefaultCloseOperation(JFrame.DISPOSE_ON_CLOSE); 
     this.setPreferredSize(new Dimension(500, 350)); 

     top = new JPanel(); 
     displayLayout = new GridLayout(7, 2, 2, 2); 
     top.setLayout(displayLayout); 
     top.setBorder(BorderFactory.createEmptyBorder(5, 20, 5, 5)); 

     bot = new JPanel(); 
     bot.setLayout(new BoxLayout(bot, BoxLayout.LINE_AXIS)); 
     bot.add(Box.createHorizontalGlue()); 
     bot.setBorder(BorderFactory.createEmptyBorder(20, 5, 5, 5)); 

     barcodeLabel.setText("Barcode: "); 
     nameLabel.setText("Name: "); 
     descLabel.setText("Description: "); 
     compLabel.setText("Developer: "); 
     ratingLabel.setText("EU Rating: "); 
     costLabel.setText("Cost: "); 
     quantityLabel.setText("Quantity in Stock: "); 

     JLabel barcodeField = new JLabel(Long.toString(p.getBarcode())); 
     JLabel nameField = new JLabel(p.getName()); 
     JLabel descField = new JLabel(p.getDesc()); 
     JLabel compField = new JLabel(p.getCompany()); 
     JLabel ratingField = new JLabel(p.getRating()); 
     JLabel costField = new JLabel(Double.toString(p.getCost())); 
     JLabel quantityField = new JLabel(Integer.toString(p.getQuantity())); 

     barcodePanel1.add(barcodeLabel); 
     barcodePanel1.setBorder(BorderFactory.createLineBorder(Color.black)); 
     barcodePanel2.add(barcodeField);      barcodePanel2.setBorder(BorderFactory.createLineBorder(Color.black)); 

     namePanel1.add(nameLabel); 
     namePanel1.setBorder(BorderFactory.createLineBorder(Color.black)); 
     namePanel2.add(nameField); 
     namePanel2.setBorder(BorderFactory.createLineBorder(Color.black)); 

     descPanel1.add(descLabel); 
     descPanel1.setBorder(BorderFactory.createLineBorder(Color.black)); 
     descPanel2.add(descField); 
     descPanel2.setBorder(BorderFactory.createLineBorder(Color.black)); 

     compPanel1.add(compLabel); 
     compPanel1.setBorder(BorderFactory.createLineBorder(Color.black)); 
     compPanel2.add(compField); 
     compPanel2.setBorder(BorderFactory.createLineBorder(Color.black)); 

     ratingPanel1.add(ratingLabel); 
     ratingPanel1.setBorder(BorderFactory.createLineBorder(Color.black)); 
     ratingPanel2.add(ratingField); 
     ratingPanel2.setBorder(BorderFactory.createLineBorder(Color.black)); 

     costPanel1.add(costLabel); 
     costPanel1.setBorder(BorderFactory.createLineBorder(Color.black)); 
     costPanel2.add(costField); 
     costPanel2.setBorder(BorderFactory.createLineBorder(Color.black)); 
     quantityPanel1.add(quantityLabel); 
     quantityPanel1.setBorder(BorderFactory.createLineBorder(Color.black)); 
     quantityPanel2.add(quantityField); 
     quantityPanel2.setBorder(BorderFactory.createLineBorder(Color.black)); 

     top.add(barcodePanel1); 
     top.add(barcodePanel2); 
     top.add(namePanel1); 
     top.add(namePanel2); 
     top.add(descPanel1); 
     top.add(descPanel2); 
     top.add(compPanel1); 
     top.add(compPanel2); 
     top.add(ratingPanel1); 
     top.add(ratingPanel2); 
     top.add(costPanel1); 
     top.add(costPanel2); 
     top.add(quantityPanel1); 
     top.add(quantityPanel2); 

     edit.addActionListener(this); 
     delete.addActionListener(this); 
     backToMenu.addActionListener(this); 

     bot.add(edit); 
     bot.add(Box.createRigidArea(new Dimension(10, 0))); 
     bot.add(delete); 
     bot.add(Box.createRigidArea(new Dimension(10, 0))); 
     bot.add(backToMenu); 

     this.add(top); 
     this.add(bot, BorderLayout.SOUTH); 
     this.setLocationRelativeTo(null); 
     this.pack(); 
     this.setVisible(true); 
    } 

    @Override 
    public void actionPerformed(ActionEvent e) { // here is where I'd LIKE to pass Product p as parameter but obviously that's not a thing 
     if (e.getSource() == edit) { 
//   EditProduct ed = new EditProduct(); <- hypothetical! 
//   ed.editProduct(p); 
     } else if (e.getSource() == delete) { 
//   DeleteRecord del = new DeleteRecord(); <- hypothetical! 
//   del.deleteRecord(p); 
     } else if (e.getSource() == backToMenu) { 
      new CreateDisplay(); 
      this.dispose(); 
     } 
    } 
} 

내 EditProduct 클래스

또는이 문제를 해결하는 방법입니다 (그리고 StackOverflow를 처음 접했습니다). 누구든지 나를 도울 수 있습니까?

+0

'StackOverflow'에 새로 도입되었습니다. StackOverflow에 오신 것을 환영합니다! ** ☺ ** –

+0

@PaulVargas 감사합니다! 나는 아직도 이해하려고 노력하고 있지만이 사이트를 좋아한다. – jammededed

답변

0

DisplayRecord은 한 번에 Product 하나만 표시 할 수 있습니다. 이것이 사실이라면 필드에 Product을 저장 한 다음 actionPerfomed()에서 액세스 할 수 있습니다.

+0

(고맙다!) 그리고 'DisplayRecord'는 이제 'EditProduc't 클래스에 도달하지만'nameField '에'NullPointerException '을 던지고있다. setText (p.getName); '. 나는 그것이 'Product p'논쟁을 올바르게 받아들이지 않는지 또는 어떤 것이 있는지 모른다. 'nameField'자체는 괜찮습니다 (메소드 호출 대신 스트레이트 문자열을 사용하여 테스트했습니다). 특히 getName 부분은 문제입니다. – jammededed

+0

'JTextField nameField, costField, quantityField = new JTextField();를 선언하면 ** 마지막 필드 만 ** 설정되고 나머지 필드는 'null'로 유지됩니다. – DennisW

+0

나는 그런 바보 야 ... 내 실수를 눈치 채지도 못했다. 나는 그것을 고쳤으며 (다른 곳에서는 같은 실수를했다.) 문제는 여전히 남아있다. 'Product' (거기서 배운 걸 배웠던 것)가 처음에는 전달되지 않았거나'.getName()'이 작동하지 않습니까? – jammededed

관련 문제