2014-04-18 2 views
0

jtable에 데이터를 추가하는 중 어려움이 있습니다. 먼저 jtextfield를 사용하여 콜렉션에서 데이터를로드합니다. 새 데이터를 추가합니다. 확실히 콜렉션에 데이터가 추가되었지만 새로 추가 된 날짜는 jtable에 표시 할 수 없습니다. 나는 모든 가능한 방법을 시도했지만 그것을 만들 수 없었다. 아래 코드는 제 작업의 일부입니다.AbstractDataTable fireTableDataChanged()가 jtable을 새로 고치지 않습니다.

감사

이 방법이 잘 구현되지
/* 
* To change this license header, choose License Headers in Project Properties. 
* To change this template file, choose Tools | Templates 
* and open the template in the editor. 
*/ 
package com.example.gui; 

import com.example.service.CustomerService; 
import com.example.service.VehicleService; 
import java.awt.BorderLayout; 
import java.awt.Dimension; 
import java.awt.GridBagLayout; 
import java.awt.GridLayout; 
import java.awt.HeadlessException; 
import java.awt.Toolkit; 
import java.awt.event.ActionEvent; 
import java.awt.event.ActionListener; 
import java.util.ArrayList; 
import javax.swing.DefaultListModel; 
import javax.swing.JButton; 
import javax.swing.JFrame; 
import static javax.swing.JFrame.EXIT_ON_CLOSE; 
import javax.swing.JLabel; 
import javax.swing.JList; 
import javax.swing.JMenu; 
import javax.swing.JMenuBar; 
import javax.swing.JMenuItem; 
import javax.swing.JOptionPane; 
import javax.swing.JPanel; 
import javax.swing.JScrollPane; 
import javax.swing.JTable; 
import javax.swing.JTextField; 
import javax.swing.SwingUtilities; 
import javax.swing.event.TableModelEvent; 
import javax.swing.table.AbstractTableModel; 
import javax.swing.table.DefaultTableModel; 
import javax.swing.table.TableModel; 

/** 
* 
* @author Tugrul 
*/ 

public class VehicleTypes extends JFrame { 

    private JLabel lblVehicleType; 
    private JTextField txtVehicleType; 
    private JButton btnCreateVehicleType; 
    private JButton btnClearField; 
    private JTable jtDataTable; 
    private JPanel formPanel; 
    private JPanel dataPanel; 
    private JPanel buttonPanel; 
    private JMenu jmFile; 
    private JMenu jmCustomer; 
    private JMenu jmServiceDesk; 
    private JMenuBar appMenuBar; 
    private JMenuItem jmiMainMenu; 
    private JMenuItem jmiExit; 
    private JMenuItem jmiPlaceBooking; 
    private JMenuItem jmiRegister; 
    private JMenuItem jmiVehicleTypes; 
    private JMenuItem jmiCustomerType; 
    private JMenuItem jmiVehicles; 
    private JMenuItem jmiCustomers; 
    private JMenuItem jmiManageBookings; 
    private CustomDataTable customDataTable; 

    public VehicleTypes() { 
     drawForm(); 
    } 

    public void drawForm() { 

     customDataTable = new CustomDataTable(); 
     jtDataTable = new JTable(customDataTable); 
     /*Drawing root menu*/ 
     jmFile = new JMenu("File"); 
     jmCustomer = new JMenu("Customer"); 
     jmServiceDesk = new JMenu("Service Desk"); 
     appMenuBar = new JMenuBar(); 

     /*Drawing File Menu*/ 
     jmiMainMenu = new JMenuItem("Main Menu"); 
     jmiExit = new JMenuItem("Exit"); 
     jmFile.add(jmiMainMenu); 
     jmFile.add(jmiExit); 

     /*Drawing Customer Menu*/ 
     jmiPlaceBooking = new JMenuItem("Place Booking"); 
     jmiRegister = new JMenuItem("Register"); 
     jmCustomer.add(jmiPlaceBooking); 
     jmCustomer.add(jmiRegister); 

     /*Drawing Service Desk Menu*/ 
     jmiVehicleTypes = new JMenuItem("Vehicle Types"); 
     jmiCustomerType = new JMenuItem("Customer Types"); 
     jmiVehicles = new JMenuItem("Vehicles"); 
     jmiCustomers = new JMenuItem("Customers"); 
     jmiManageBookings = new JMenuItem("Manage Bookings"); 
     jmServiceDesk.add(jmiVehicleTypes); 
     jmServiceDesk.add(jmiCustomerType); 
     jmServiceDesk.add(jmiVehicles); 
     jmServiceDesk.add(jmiCustomers); 
     jmServiceDesk.add(jmiManageBookings); 

     /*Add menus to menubar*/ 
     appMenuBar.add(jmFile); 
     appMenuBar.add(jmCustomer); 
     appMenuBar.add(jmServiceDesk); 

     /*Adding listeners for each element*/ 
     jmiMainMenu.addActionListener(new ActionListener() { 
      @Override 
      public void actionPerformed(ActionEvent e) { 
       formListener(e); 
      } 
     }); 
     jmiExit.addActionListener(new ActionListener() { 
      @Override 
      public void actionPerformed(ActionEvent e) { 
       formListener(e); 
      } 
     }); 
     jmiPlaceBooking.addActionListener(new ActionListener() { 
      @Override 
      public void actionPerformed(ActionEvent e) { 
       formListener(e); 
      } 
     }); 
     jmiRegister.addActionListener(new ActionListener() { 
      @Override 
      public void actionPerformed(ActionEvent e) { 
       formListener(e); 
      } 
     }); 
     jmiVehicleTypes.addActionListener(new ActionListener() { 
      @Override 
      public void actionPerformed(ActionEvent e) { 
       formListener(e); 
      } 
     }); 
     jmiCustomerType.addActionListener(new ActionListener() { 
      @Override 
      public void actionPerformed(ActionEvent e) { 
       formListener(e); 
      } 
     }); 
     jmiVehicles.addActionListener(new ActionListener() { 
      @Override 
      public void actionPerformed(ActionEvent e) { 
       formListener(e); 
      } 
     }); 
     jmiCustomers.addActionListener(new ActionListener() { 
      @Override 
      public void actionPerformed(ActionEvent e) { 
       formListener(e); 
      } 
     }); 
     jmiManageBookings.addActionListener(new ActionListener() { 
      @Override 
      public void actionPerformed(ActionEvent e) { 
       formListener(e); 
      } 
     }); 

     lblVehicleType = new JLabel("Vehicle Type"); 
     txtVehicleType = new JTextField(); 
     btnCreateVehicleType = new JButton("Create"); 
     btnClearField = new JButton("Clear Fields"); 
     formPanel = new JPanel(); 
     dataPanel = new JPanel(); 
     buttonPanel = new JPanel(); 

     setSize(800, 600); 
     setTitle("Vehicle Types"); 
     setDefaultCloseOperation(EXIT_ON_CLOSE); 

     //Centering the application on screen 
     Toolkit toolkit = getToolkit(); 
     Dimension size = toolkit.getScreenSize(); 
     setLocation(size.width/2 - getWidth()/2, 
       size.height/2 - getHeight()/2); 

     formPanel.add(lblVehicleType); 
     formPanel.add(txtVehicleType); 

     dataPanel.add(new JScrollPane(jtDataTable)); 

     buttonPanel.add(btnCreateVehicleType); 
     buttonPanel.add(btnClearField); 

     /*Setting layouts for panels*/ 
     formPanel.setLayout(new GridLayout(1, 1, 0, 0)); 
     dataPanel.setLayout(new GridLayout(1, 2, 10, 10)); 
     buttonPanel.setLayout(new GridLayout(2, 1, 5, 5)); 

     /*Adding panels to main jframe*/ 
     add(dataPanel, BorderLayout.NORTH); 
     add(formPanel, BorderLayout.CENTER); 
     add(buttonPanel, BorderLayout.SOUTH); 
     setJMenuBar(appMenuBar); 

     //Adding buttons to listeners 
     btnCreateVehicleType.addActionListener(new ActionListener() { 
      @Override 
      public void actionPerformed(ActionEvent e) { 
       formListener(e); 
      } 
     }); 
     btnClearField.addActionListener(new ActionListener() { 
      @Override 
      public void actionPerformed(ActionEvent e) { 
       formListener(e); 
      } 
     }); 

    } 

    private class CustomDataTable extends AbstractTableModel { 

     private VehicleService vehicleService = new VehicleService(); 

     int rowCount = vehicleService.retrieveVehicleTypes().size(); 

     private String[] columnNames = {"Vehicle Type"}; 

     @Override 
     public String getColumnName(int col) { 
      return columnNames[col]; 
     } 

     @Override 
     public int getRowCount() { 
      return rowCount; 
     } 

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

     @Override 
     public Object getValueAt(int rowIndex, int columnIndex) { 

      Object val = (Object) vehicleService.retrieveVehicleTypes().get(rowIndex); 
      return val; 
     } 

     public void insertData(String values) { 
      vehicleService.createVehicleType(values); 

      fireTableDataChanged(); 
      System.out.println("affected data" + vehicleService.retrieveVehicleTypes().toString()); 
     } 

    } 

    public void clearFields() { 
     txtVehicleType.setText(""); 
    } 

    public void formListener(ActionEvent e) { 

     VehicleService vehicleService = new VehicleService(); 

     String clickedItem = e.getActionCommand(); 
     String vehicleType = txtVehicleType.getText().toString(); 

     if (clickedItem.equals("Create")) { 
      if (vehicleService.checkVehicleTypeAvailability(vehicleType)) { 
       JOptionPane.showMessageDialog(null, vehicleType + " Vehicle type already exists in Database", 
         "Vehicle Warning", 
         JOptionPane.WARNING_MESSAGE); 
      } else { 
       customDataTable.insertData(vehicleType); 
       this.invalidate(); 

       this.validate(); 
       this.repaint(); 
       this.revalidate(); 
       jtDataTable.revalidate(); 
       jtDataTable.repaint(); 

      } 
     } 
     if (clickedItem.equals("Clear Fields")) { 
      //clear field code 
      clearFields(); 
     } 

     //Jmenu listener 
     if (clickedItem.equals("Main Menu")) { 
      VehicleTypes customerTypes = new VehicleTypes(); 
      CustomerManagement customerManagement = new CustomerManagement(); 
      customerTypes.setVisible(false); 
      customerManagement.setVisible(true); 
     } 
     if (clickedItem.equals("Exit")) { 
      int dialogButton = JOptionPane.YES_NO_OPTION; 
      int dialogResult = JOptionPane.showConfirmDialog(null, "Are you sure to leave the application", "Confim Process", dialogButton); 
      if (dialogResult == 0) { 
       System.exit(1); 
      } 
     } 
     if (clickedItem.equals("Place Booking")) { 

     } 
     if (clickedItem.equals("Register")) { 

     } 
     if (clickedItem.equals("Vehicle Types")) { 
      //dont do anything 
     } 
     if (clickedItem.equals("Customer Types")) { 
      CustomerTypes customerTypes = new CustomerTypes(); 
      this.setVisible(false); 
      customerTypes.setVisible(true); 
     } 
     if (clickedItem.equals("Vehicles")) { 

     } 
     if (clickedItem.equals("Customers")) { 

     } 
     if (clickedItem.equals("Manage Bookings")) { 

     } 

    }//Action listener end curly brace 

    public static void main(String[] args) { 

     try { 
      for (javax.swing.UIManager.LookAndFeelInfo info : javax.swing.UIManager.getInstalledLookAndFeels()) { 
       if ("Nimbus".equals(info.getName())) { 
        javax.swing.UIManager.setLookAndFeel(info.getClassName()); 
        break; 
       } 
      } 
     } catch (ClassNotFoundException ex) { 
      System.out.println("Exception Caught " + ex); 
     } catch (InstantiationException ex) { 
      System.out.println("Exception Caught " + ex); 
     } catch (IllegalAccessException ex) { 
      System.out.println("Exception Caught " + ex); 
     } catch (javax.swing.UnsupportedLookAndFeelException ex) { 
      System.out.println("Exception Caught " + ex); 
     } 

     SwingUtilities.invokeLater(new Runnable() { 
      public void run() { 
       new VehicleTypes().setVisible(true); 
      } 
     }); 
    } 

} 
+1

설명하는 문제가있는 [* Minimal, Complete, Verifiable Example *] (http://stackoverflow.com/help/mcve)를 포함하여 질문을 편집하십시오. – trashgod

답변

1

: 당신이 당신의 테이블에 하나의 행을 추가하는 것 때문에 fireTableDateChanged()가 매우 과도한와이 시점에서 불필요한 호출

public void insertData(String values) { 
    vehicleService.createVehicleType(values); 
    fireTableDataChanged(); // No, call fireTableRowsInserted(...) instead 
    ... 
} 

. 테이블 모델에 새 행을 추가 한 후 revalidate()repaint() 아무것도 필요가 또한

public void insertData(String values) { 
    vehicleService.createVehicleType(values); 
    int lastIndex = vehicleService.retrieveVehicleTypes().size() - 1; 
    fireTableRowsInserted(lastIndex, lastIndex); // first and last indices are the same 
} 

없습니다 다음과 같이 올바른 구현 fireTableRowsInserted(int firstRow, int lastRow)를 호출해야합니다. 청취자에게 알리기 만하면됩니다. JTable은 자체 모델의 수신기이며 그에 따라 TableModelEvents에 다시 표시됩니다.

관련 문제