2015-04-22 8 views
2

Так что я работаю над системой проката DVD на Java и столкнулся с проблемами с просмотром. Вот мой код:custom setValueAt метод в расширенном AbstractTableModel

import javax.swing.*; 
import javax.swing.table.AbstractTableModel; 
import javax.swing.table.TableModel; 
import java.awt.*; 
import java.awt.event.*; 
public class RentalSystem extends JFrame { 

JMenuBar menuBar; 
JMenuItem insertMember; 
JMenuItem deleteMember; 
JMenuItem editMember; 
JMenuItem retrieveMember; 
JMenuItem insertRelease; 
JMenuItem deleteRelease; 
JMenuItem editRelease; 
JMenuItem retrieveRelease; 
JMenu menu; 
JMenu menu2; 
JComboBox searchMember; 
JComboBox searchRelease; 
JButton adminButton; 
JButton userButton; 
JButton existingUser; 
JButton newUser; 
JTable memberTable; 
JTable releaseTable; 
int existingUserCheck = 1; //0 = existing user, 1 = new user 
int adminCheck = 1; //0 = admin, 1 = customer 


public RentalSystem() 
{ 
    super("Tape/DVD/Game Rental System"); 
    setBounds(0,0,1000,500); 
    //while(adminCheck == 0) 
    { 
     display2(); 
     while(existingUserCheck == 0) { 

     } 
    } 

} 
private class MenuActionListener implements ActionListener { 

     public void actionPerformed(ActionEvent e) { 

     if(e.getSource() == "insertMember"); 
     { 
      String name = JOptionPane.showInputDialog("Enter Last Name:"); 
      String name2 = JOptionPane.showInputDialog("Enter First Name:"); 
      String ss = JOptionPane.showInputDialog("Enter Social Security Number:"); 
      int a = Integer.parseInt(ss); 
      String email = JOptionPane.showInputDialog("Enter Email Address:"); 
      String phoneNumber = JOptionPane.showInputDialog("Enter Phone Number:"); 
      int b = Integer.parseInt(phoneNumber); 
      String address = JOptionPane.showInputDialog("Enter Address:"); 

      Member member = new Member(name, name2, a, email, b, address); 
      //add member to table 

     } 
     if(e.getSource() == "deleteMember"); 
     { 

     } 
     if(e.getSource() == "editMember"); 
     { 

     } 
     if(e.getSource() == "retrieveMember"); 
     { 

     } 
     if(e.getSource() == "insertRelease"); 
     { 
      String title = JOptionPane.showInputDialog(this ,"Enter Title:"); 
      String type = JOptionPane.showInputDialog(this ,"Enter Type(Tape/DVD/Game):"); 
      String releaseYear = JOptionPane.showInputDialog(this ,"Enter Year of Release:"); 
      int a = Integer.parseInt(releaseYear); 
      String price = JOptionPane.showInputDialog(this ,"Enter Price:"); 
      int b = Integer.parseInt(price); 


      Item item = new Item(title, type, a, b); 
      //add item to table 

     } 
     if(e.getSource() == "deleteRelease"); 
     { 

     } 
     if(e.getSource() == "editRelease"); 
     { 

     } 
     if(e.getSource() == "retrieveRelease"); 
     { 

     } 
     } 
    } 

private class ComboBoxActionListener implements ActionListener { 


    public void actionPerformed(ActionEvent e) { 

     String s = (String) searchMember.getSelectedItem(); 
     String f = (String) searchRelease.getSelectedItem(); 


      if(s.equals("Last Name")){ 

      } 
      else if(s.equals("First Name")){ 
      } 
      else if(s.equals("Phone Number")){ 
      } 
      else if(s.equals("Member ID")){ 
      } 

      if(f.equals("Title")){ 

      } 
      else if(f.equals("Category")){ 
      } 
      else if(f.equals("Type")){ 
      } 
      else if(f.equals("Rental ID")){ 

      } 


      if(e.getSource() == "Existing User") 
      { 

      } 


    } 

} 

private class ButtonListener implements ActionListener { 

    @Override 
    public void actionPerformed(ActionEvent e) { 

     if(e.getSource() == adminButton) 
     { 
      menuBar = new JMenuBar(); 
      menu = new JMenu("Members"); 
      menuBar.add(menu); 
      menu2 = new JMenu("Releases"); 
      menuBar.add(menu2); 

      insertMember = new JMenuItem("Insert New Member"); 
      deleteMember = new JMenuItem("Delete Member"); 
      editMember = new JMenuItem("Edit Member"); 
      retrieveMember = new JMenuItem("Retrieve Member"); 
      menu.add(insertMember); 
      menu.add(deleteMember); 
      menu.add(editMember); 
      menu.add(retrieveMember); 
      insertRelease = new JMenuItem("Insert New Release"); 
      deleteRelease = new JMenuItem("Delete Release"); 
      editRelease = new JMenuItem("Edit Release"); 
      retrieveRelease = new JMenuItem("Retrieve Release"); 
      menu2.add(insertRelease); 
      menu2.add(deleteRelease); 
      menu2.add(editRelease); 
      menu2.add(retrieveRelease); 

      JScrollPane c = new JScrollPane(); 
      JScrollPane b = new JScrollPane(); 


      TableModel memberModel = new MemberTableModel(); 
      TableModel itemModel = new ItemTableModel(); 
      memberTable = new JTable(memberModel); 
      releaseTable = new JTable(itemModel); 

      c.add(memberTable); 
      c.add(releaseTable); 

      String[] searchMemberChoices = {"Search Members By:", "Last Name", "First Name","Phone Number", "Member ID"}; 
      String[] searchReleaseChoices = {"Search Releases By:", "Title" , "Category", "Type", "Release ID" }; 
      searchMember = new JComboBox(searchMemberChoices); 
      searchRelease = new JComboBox(searchReleaseChoices); 


      //add(c, BorderLayout.CENTER); 
      //add(b, BorderLayout.SOUTH); 
      add(searchMember, BorderLayout.WEST); 
      add(searchRelease, BorderLayout.EAST); 
      add(menuBar, BorderLayout.NORTH); 

      setVisible(true); 
      setResizable(true); 
      setDefaultCloseOperation(EXIT_ON_CLOSE); 

      insertMember.addActionListener(new MenuActionListener()); 
      deleteMember.addActionListener(new MenuActionListener()); 
      editMember.addActionListener(new MenuActionListener()); 
      retrieveMember.addActionListener(new MenuActionListener()); 
      insertRelease.addActionListener(new MenuActionListener()); 
      deleteRelease.addActionListener(new MenuActionListener()); 
      editRelease.addActionListener(new MenuActionListener()); 
      retrieveRelease.addActionListener(new MenuActionListener()); 
      searchMember.addActionListener(new ComboBoxActionListener()); 
      searchRelease.addActionListener(new ComboBoxActionListener()); 
     } 
     if(e.getSource() == userButton) 
     { 
      adminCheck = 1; 

      menuBar = new JMenuBar(); 
      menu = new JMenu("Members"); 
      menuBar.add(menu); 
      menu2 = new JMenu("Releases"); 
      menuBar.add(menu2); 


      retrieveMember = new JMenuItem("Retrieve Member"); 
      menu.add(retrieveMember); 
      retrieveRelease = new JMenuItem("Retrieve Release"); 
      menu2.add(retrieveRelease); 

      JScrollPane c = new JScrollPane(); 
      JScrollPane b = new JScrollPane(); 


      TableModel memberModel = new MemberTableModel(); 
      TableModel itemModel = new ItemTableModel(); 
      memberTable = new JTable(memberModel); 
      releaseTable = new JTable(itemModel); 



      c.add(memberTable); 
      c.add(releaseTable); 


      String[] searchMemberChoices = {"Search Members By:", "Last Name", "First Name","Phone Number", "Member ID"}; 
      String[] searchReleaseChoices = {"Search Releases By:", "Title" , "Category", "Type", "Release ID" }; 
      searchMember = new JComboBox(searchMemberChoices); 
      searchRelease = new JComboBox(searchReleaseChoices); 


      //add(c, BorderLayout.CENTER); 
      //add(b, BorderLayout.SOUTH); 
      add(searchMember, BorderLayout.WEST); 
      add(searchRelease, BorderLayout.EAST); 
      add(menuBar, BorderLayout.NORTH); 


      setVisible(true); 
      setResizable(true); 
      setDefaultCloseOperation(EXIT_ON_CLOSE); 


      insertMember.addActionListener(new MenuActionListener()); 
      deleteMember.addActionListener(new MenuActionListener()); 
      editMember.addActionListener(new MenuActionListener()); 
      retrieveMember.addActionListener(new MenuActionListener()); 
      insertRelease.addActionListener(new MenuActionListener()); 
      deleteRelease.addActionListener(new MenuActionListener()); 
      editRelease.addActionListener(new MenuActionListener()); 
      retrieveRelease.addActionListener(new MenuActionListener()); 
      searchMember.addActionListener(new ComboBoxActionListener()); 
      searchRelease.addActionListener(new ComboBoxActionListener()); 

     } 



     if(e.getSource() == existingUser); 
     { 

     } 
     if(e.getSource() == newUser) 
      { 
       existingUserCheck = 1; 
       JTextField field1 = new JTextField(""); 
       JTextField field2 = new JTextField(""); 
       JTextField field3 = new JTextField(""); 
       JTextField field4 = new JTextField(""); 
       JTextField field5 = new JTextField(""); 
       JTextField field6 = new JTextField(""); 

       JPanel panel = new JPanel(new GridLayout(0, 1)); 
       panel.add(new JLabel("Last Name:")); 
       panel.add(field1); 
       panel.add(new JLabel("First Name:")); 
       panel.add(field2); 
       panel.add(new JLabel("Social Security #:")); 
       panel.add(field3); 
       panel.add(new JLabel("Email:")); 
       panel.add(field4); 
       panel.add(new JLabel("Phone Number:")); 
       panel.add(field5); 
       panel.add(new JLabel("Address")); 
       panel.add(field6); 
       add(panel); 
       int result = JOptionPane.showConfirmDialog(null, panel, "Registration", 
        JOptionPane.OK_CANCEL_OPTION, JOptionPane.PLAIN_MESSAGE); 
       if (result == JOptionPane.OK_OPTION) { 

        int ss = Integer.parseInt(field3.getText()); 
        int phoneNumber = Integer.parseInt(field5.getText()); 

         //memberTable.addMember(field1.getText(),field2.getText(), ss, field4.getText(), phoneNumber, field6.getText()); 

       } 
      } 
    } 
} 
class MemberTableModel extends AbstractTableModel { 

    private String[] headers = {"Last Name", "First Name", "SS#", "Email", "Phone Number", "Address"}; 


    @Override 
    public int getColumnCount() { 

     return headers.length; 
    } 

    @Override 
    public int getRowCount() { 
     // TODO Auto-generated method stub 
     return 0; 
    } 

    @Override 
    public Object getValueAt(int arg0, int arg1) { 
     // TODO Auto-generated method stub 
     return null; 
    } 
    public void setValueAt(Member a, int rowIndex, int colIndex) 
    { 

    } 

} 
class ItemTableModel extends AbstractTableModel { 

    @Override 
    public int getColumnCount() { 
     // TODO Auto-generated method stub 
     return 0; 
    } 

    @Override 
    public int getRowCount() { 
     // TODO Auto-generated method stub 
     return 0; 
    } 

    @Override 
    public Object getValueAt(int arg0, int arg1) { 
     // TODO Auto-generated method stub 
     return null; 
    } 
    public void setValueAt() 
    { 

    } 

} 
public void display()//displays first screen:admin/user log-in 
{ 
    userButton = new JButton("User"); 
    adminButton = new JButton("Admin"); 

    JPanel panel = new JPanel(new GridLayout(0, 1)); 
    panel.add(userButton); 
    panel.add(adminButton); 
    add(panel); 

    userButton.addActionListener(new ButtonListener()); 
    adminButton.addActionListener(new ButtonListener()); 


    setVisible(true); 
    setResizable(true); 
    setDefaultCloseOperation(EXIT_ON_CLOSE); 

} 

public void display2()//displays second screen:user log-in/register 
{ 
    existingUser = new JButton("Existing User"); 
    newUser = new JButton("New User"); 

    JPanel panel = new JPanel(new GridLayout(0, 1)); 
    panel.add(newUser); 
    panel.add(existingUser); 
    add(panel); 

    existingUser.addActionListener(new ButtonListener()); 
    newUser.addActionListener(new ButtonListener()); 


    setVisible(true); 
    setResizable(true); 
    setDefaultCloseOperation(EXIT_ON_CLOSE); 

} 
public void display3() //displays user screen/functionality 
{ 

} 
public static void main(String[] args) { 

    JFrame frame = new RentalSystem(); 

} 
} 

Теперь, член и пункт только классов объектов, которые я сделал для представления пользователей (членов) и фильмы/игры (Items).

public class Member { 
int status; 
String firstName; 
String lastName; 
int ss; 
String email; 
int phoneNumber; 
String address; 
int memberID; 

public Member() 
{ 

} 
public Member(String firstName, String lastName, int ss, String email, int phoneNumber, String address) 
{ 
    this.firstName = firstName; 
    this.lastName = lastName; 
    this.ss = ss; 
    this.email = email; 
    this.phoneNumber = phoneNumber; 
    this.address = address; 
} 

public void setName(String firstName, String lastName) 
{ 
    this.firstName = firstName; 
    this.lastName = lastName; 
} 
public String getName() 
{ 
    return firstName + " " + lastName; 
} 
public void setSS(int ss) 
{ 
    this.ss = ss; 
} 
public int getSS() 
{ 
    return ss; 
} 
public void setEmail(String email) 
{ 
    this.email = email; 
} 
public String getEmail() 
{ 
    return email; 
} 
public void setPhoneNumber(int phoneNumber) 
{ 
    this.phoneNumber = phoneNumber; 
} 
public int getPhoneNumber() 
{ 
    return phoneNumber; 
} 
public void setAddress(String address) 
{ 
    this.address = address; 
} 
public String getAddress() 
{ 
    return address; 
} 
public void setMemberID(int memberID) 
{ 
    this.memberID = memberID; 
} 
public int getMemberID() 
{ 
    return memberID; 
} 
public void setStatus(int status) 
{ 
    this.status = status; 
} 
public int getStatus() 
{ 
    return status; 
} 
} 

и

public class Item { 

String title; 
String type; 
int releaseYear; 
int rentalID; 
int price; 
boolean inStock; 

public Item() 
{ 

} 
public Item(String title, String type, int releaseYear, int price) 
{ 
    this.title = title; 
    this.type = type; 
    this.releaseYear = releaseYear; 
    this.price = price; 

} 
public void setTitle(String title) 
{ 
    this.title = title; 
} 
public String getTitle() 
{ 
    return title; 
} 
public void setReleaseYear(int releaseYear) 
{ 
    this.releaseYear = releaseYear; 
} 
public int getReleaseYear() 
{ 
    return releaseYear; 
} 
public void setRentalID(int rentalID) 
{ 
    this.rentalID = rentalID; 
} 
public int getRentalID() 
{ 
    return rentalID; 
} 
public void setPrice(int price) 
{ 
    this.price = price; 
} 
public int getPrice() 
{ 
    return price; 
} 

} 

Моя проблема заключается в том, что я запутался о том, как создать, переопределены «SetValueAt) (» метод обычай для заполнения JTable: с информацией от членов/Items. Другой проблемой являются все пустые операторы if в классах Listener. Я не уверен, как это сделать. Если бы кто-нибудь мог дать некоторые рекомендации по любым из этих вопросов или что-то еще, что я мог упустить, я был бы очень признателен за любые отзывы.

+0

* e.getSource() == "deleteRelease" *, и т.д ... всегда будет оценивать ложь, во-первых, потому что getSource() в этом контексте будет r eturn Компонент, на котором было инициировано событие, а во-вторых, даже если он возвратил String, всегда следует сравнивать строки с использованием метода equals – copeg

+0

Существуют две проблемы с «if (e.getSource() ==« insertMember »); , первый '==' не должен использоваться для сравнения качества двух значений String, вы должны использовать String.equals; во-вторых, конечный «;» является коротким, замыкающим их, что означает, что код сразу после его выполнения выполняется независимо от оценки оператора if .... – MadProgrammer

+0

«public void setValueAt (Member a, int rowIndex, int colIndex)» должен быть «public void setValueAt (Object a, int rowIndex, int colIndex) "в противном случае он никогда не будет называться – MadProgrammer

ответ

1

Давайте игнорировать все «интересные» вопросы с кодом и сосредоточиться на TableModel

таблица представляет собой двухмерную матрицу данных, распространяется на ряд строк и столбцов

TableModel обеспечивает договор, по которому JTable (вид) может взаимодействовать с данными, представленными TableModel ...

public interface TableModel 
{ 
    public int getRowCount(); 
    public int getColumnCount(); 
    public String getColumnName(int columnIndex); 
    public Class<?> getColumnClass(int columnIndex); 
    public boolean isCellEditable(int rowIndex, int columnIndex); 
    public Object getValueAt(int rowIndex, int columnIndex); 
    public void setValueAt(Object aValue, int rowIndex, int columnIndex); 
    public void addTableModelListener(TableModelListener l); 
    public void removeTableModelListener(TableModelListener l); 
} 

Это важно, так как ваши данные нужно Conf orm к этому контракту.

У вас есть класс Member, который имеет ряд определенных свойств, каждое свойство представляет собой возможное значение столбца, что делает каждый экземпляр Member «строкой» данных.

Первое, что вам нужно решить, - это то, как вы собираетесь управлять всеми Member. Поскольку вы заявили, что вам нужна «динамическая» (или изменяемая) модель, одной из лучших структур данных для использования может быть ArrayList, так как она может расти в соответствии с вашими потребностями и имеет быстрый не последовательный доступ (вы можете захватывать значения из это в случайных точках быстро).

public class MemberTableModel extends AbstractTableModel { 

    private String[] headers = {"Last Name", "First Name", "SS#", "Email", "Phone Number", "Address"}; 
    private List<Member> members; 

    public MemberTableModel() { 
     members = new ArrayList<>(25); 
    } 

    public MemberTableModel(List<Member> members) { 
     this(); 
     this.members.addAll(members); 
    } 

    public MemberTableModel(Member... members) { 
     this(Arrays.asList(members)); 
    } 

    @Override 
    public int getRowCount() { 
     return members.size(); 
    } 

    @Override 
    public int getColumnCount() { 
     return headers.length; 
    } 

    @Override 
    public String getColumnName(int column) { 
     return headers[column]; 
    } 

Хорошо, теперь нам нужны мы, чтобы получить колонку для конкретной строки ...

protected Member getMemberAt(int row) { 
     return members.get(row); 
    } 

    @Override 
    public Object getValueAt(int row, int col) { 
     Object value = null; 
     Member member = getMemberAt(row); 
     switch (col) { 
      case 0: 
       // Need getter for last name 
       break; 
      case 1: 
       // Need getter for first name 
       break; 
      case 2: 
       value = member.getSS(); 
       break; 
      case 3: 
       value = member.getEmail(); 
      case 4: 
       value = member.getPhoneNumber(); 
      case 5: 
       value = member.getAddress(); 
     } 
     return value; 
    } 

Установка значения в значительной степени тот же самый процесс ...

@Override 
    public void setValueAt(Object value, int rowIndex, int colIndex) { 
     Member member = getMemberAt(rowIndex); 
     switch (colIndex) { 
      case 0: 
       member.setName(value.toString(), member.getLastName()); 
       break; 
      case 1: 
       member.setName(member.getFirstName(), value.toString()); 
       break; 
      case 2: 
       if (value instanceof Integer) { 
        member.setSS((Integer) value); 
       } 
       break; 
      case 3: 
       member.setEmail(value.toString()); 
       break; 
      case 4: 
       if (value instanceof Integer) { 
        member.setPhoneNumber((Integer)value); 
       } 
       break; 
      case 5: 
       member.setAddress(value.toString()); 
       break; 
     } 
     fireTableRowsUpdated(rowIndex, colIndex); 
    } 
} 

Обратите внимание, что в этом методе нет подтверждения, вы должны проверить, соответствуют ли значения вашим основным требованиям к данным ...

Но, чтобы сделать таблицу для редактирования, необходимо переопределить метод isCellEdtiable модели ...

@Override 
public boolean isCellEditable(int rowIndex, int columnIndex) { 
    return true; 
} 

Возьмите добавить или удалить элементы из модели, вы должны предоставить функциональные возможности в модели, например, ...

public void add(Member member) { 
    int size = members.size(); 
    members.add(member); 
    fireTableRowsInserted(size, size); 
} 

public void remove(Member member) { 
    int index = members.indexOf(member); 
    if (index > -1) { 
     members.remove(member); 
     fireTableRowsDeleted(index, index); 
    } 
} 

Присмотритесь на How to Use Tables и Collections Trail для получения более подробной информации

+0

Спасибо @MadProgrammer, это очень помогло –

3

На самом деле вам нужно реализовать намного больше, чем метод setValueAt(). Вам нужно решить, как хранить все данные. Вам необходимо реализовать метод getValueAt (...), чтобы данные могли отображаться в таблице.

Взгляните на код TableDemo.java из учебника Swing по адресу Creating a Table Model, посвященный основам создания пользовательской TableModel. Он покажет вам один из способов реализации различных методов.

Однако, TableModel не очень хорошая модель общего назначения, поскольку данные в основном жестко закодированы, и у вас нет возможности добавлять новые строки данных.

Для лучшего, но более сложного решения взгляните на Row Table Model. Это более общий TableModel с гораздо большей гибкостью. Однако вам все равно придется реализовать несколько методов для ваших пользовательских объектов, которые вы хотите добавить в таблицу. Ознакомьтесь с кодом JButtonTableModel.java, найденным в блоге, для примера необходимых изменений.

 Смежные вопросы

  • Нет связанных вопросов^_^