2015-02-16 3 views
0

Я делаю этот проект расчета заработной платы для школы. Идея состоит в том, чтобы пользователь вводил имя сотрудника, рабочий час, почасовую ставку и выбирал отдел из ComboBox. Появятся 3 кнопки: «Добавить больше», «Результат отображения» и «Выход». Кнопка «Добавить больше» сохранит вход в несколько арреалистов и установит пустое поле для ввода большего количества ввода. «Результат отображения» создаст JTable на нижней панели JPanel, чтобы отобразить имя сотрудника, отдел и еженедельную зарплату.проблема с созданием JTable для отображения данных

Я столкнулся с проблемой, когда ничего не появляется после нажатия кнопки «Результат отображения». Возможно, я неправильно понял цель события кнопки, но сейчас я действительно запутался. Пожалуйста помоги!

Здесь photobucket directURL PrtSc пользовательского интерфейса, надеюсь, что это поможет.

import java.awt.event.*; 
import java.awt.*; 
import javax.swing.*; 
import java.util.*; 

public class PayrollFrame extends JFrame 
{ 
    private JLabel nameMessageLabel, hourMessageLabel, rateMessageLabel, boxMessageLabel; 
    private JTextField nameTextField, hourTextField, rateTextField; 
    private JPanel inputPanel, buttonPanel, outputPanel, inputPanel1, inputPanel2, inputPanel3, inputPanel4; 
    private JComboBox<String> departmentBox; 
    private JButton addButton, displayButton, exitButton; 
    private JTable resultTable; 
    private String[] columnNames = {"Employee name", "Department", "Weekly Salary"}; 
    private Object[][] data; 
    private int WINDOW_WIDTH = 400; 
    private int WINDOW_HEIGHT = 500; 

    ArrayList<String> name = new ArrayList<String>(); 
    ArrayList<String> hour = new ArrayList<String>(); 
    ArrayList<String> rate = new ArrayList<String>(); 
    ArrayList<String> department = new ArrayList<String>(); 
    ArrayList<String> salary = new ArrayList<String>(); 

    private String[] departments = {"IT", "Marketing", "Human Resource", "Sales", "Customer Service", "Financial"}; 

    /*default constructor*/ 
    public PayrollFrame() 
    { 
     super("Payroll"); 
     setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); 
     setSize(WINDOW_WIDTH, WINDOW_HEIGHT); 
     setLayout(new GridLayout(3,1)); 
     buildInputPanel(); 
     buildButtonPanel(); 
     buildOutputPanel(); 

     add(inputPanel); 
     add(buttonPanel); 
     add(outputPanel); 

     setVisible(true); 
    } 

    private void buildInputPanel() 
    { 
     nameMessageLabel = new JLabel("Employee Name: "); 
     hourMessageLabel = new JLabel("Work Hour: "); 
     rateMessageLabel = new JLabel("Hourly Rate: "); 
     boxMessageLabel = new JLabel("Department: "); 
     nameTextField = new JTextField(10); 
     hourTextField = new JTextField(10); 
     rateTextField = new JTextField(10); 
     departmentBox = new JComboBox<String>(departments); 

     inputPanel = new JPanel(); 
     inputPanel1 = new JPanel(); 
     inputPanel2 = new JPanel(); 
     inputPanel3 = new JPanel(); 
     inputPanel4 = new JPanel(); 

     inputPanel1.add(nameMessageLabel); 
     inputPanel1.add(nameTextField); 
     inputPanel2.add(hourMessageLabel); 
     inputPanel2.add(hourTextField); 
     inputPanel3.add(rateMessageLabel); 
     inputPanel3.add(rateTextField); 
     inputPanel4.add(boxMessageLabel); 
     inputPanel4.add(departmentBox); 

     inputPanel.add(inputPanel1); 
     inputPanel.add(inputPanel2); 
     inputPanel.add(inputPanel3); 
     inputPanel.add(inputPanel4); 
    } 

    private void buildButtonPanel() 
    { 
     addButton = new JButton("Add More"); 
     addButton.addActionListener(new ButtonAction()); 
     displayButton = new JButton("Display Result"); 
     displayButton.addActionListener(new ButtonAction()); 
     exitButton = new JButton("Exit"); 
     exitButton.addActionListener(new ButtonAction()); 

     buttonPanel = new JPanel(); 

     buttonPanel.add(addButton); 
     buttonPanel.add(displayButton); 
     buttonPanel.add(exitButton); 
    } 

    private void buildOutputPanel() 
    { 
     outputPanel = new JPanel(); 
    } 

    /*Copy ArrayList into 2D array to display in JTable format*/ 
    private void printData() 
    { 
     for(int i=0; i<name.size(); i++) 
     { 
      data[i][0]=name.get(i); 
      data[i][2]=department.get(i); 
      data[i][2]=salary.get(i); 
     } 
     resultTable = new JTable(data, columnNames); 
     outputPanel = new JPanel(); 
     outputPanel.add(resultTable); 
    } 

    /*Function of 3 buttons*/ 
    private class ButtonAction implements ActionListener 
    { 
     @Override 
     public void actionPerformed(ActionEvent e) 
     { 
      if(e.getActionCommand()=="Add More") 
      { 
       name.add(nameTextField.getText()); 
       hour.add(hourTextField.getText()); 
       rate.add(rateTextField.getText()); 
       department.add((String) departmentBox.getSelectedItem()); 
       calculateSalary(hourTextField.getText(), rateTextField.getText()); 
       nameTextField.setText(""); 
       hourTextField.setText(""); 
       rateTextField.setText(""); 
      } 
      else if(e.getActionCommand()=="Display Result") 
      { 

       printData(); 

      } 
      else if(e.getActionCommand()=="Exit") 
      { 
       System.exit(0); 
      } 
     } 

     /*Calculate the weekly salary*/ 
     private void calculateSalary(String hourString, String rateString) 
     { 
      int tempHour = Integer.parseInt(hourString); 
      double tempRate = Double.parseDouble(rateString); 
      if(tempHour<=40) 
      { 
       salary.add(Double.toString(tempHour * tempRate)); 
      } 
      else 
      { 
       salary.add(Double.toString(40 * tempRate + (tempHour - 40) * (tempRate * 1.5))); //all hour after 40 will pay 1.5 
      } 
     } 
    } 
} 
+0

Добро пожаловать в Переполнение стека! Это выглядит больше, чем нужно. Можете ли вы уменьшить код до тех пор, пока код не будет удален, пока проблема не исчезнет? –

+0

Да, извините. В следующий раз я буду более осторожен. –

ответ

1

Давайте начнем с ...

if (e.getActionCommand() == "Add More") { 

не так, как вы сравните String с в Java, вам нужно использовать метод equals вместо этого, что-то вроде ...

if ("Add More".equals(e.getActionCommand())) { 

например

Далее вы ...

add(inputPanel); 
add(buttonPanel); 
add(outputPanel); 

, который, при использовании BorderLayout, добавляет каждый из компонентов в положение по умолчанию в BorderLayout, необходимо обеспечить ограничение позиции для каждого компонента, иначе странные вещи начинают происходить, к примеру ...

add(inputPanel, BorderLayout.NORTH); 
add(buttonPanel, BorderLayout.CENTER); 
add(outputPanel, BorderLayout.SOUTH); 

Я просто понял, что вы используете GridLayout, лично я думаю, что вы получите лучший результат от BorderLayout, но это мне

А затем создать новый экземпляр resultTable и outputPanel, но вы никогда не добавляйте outputPanel ни к чему ...

/*Copy ArrayList into 2D array to display in JTable format*/ 
private void printData() 
{ 
    for(int i=0; i<name.size(); i++) 
    { 
     data[i][0]=name.get(i); 
     data[i][1]=department.get(i); 
     data[i][2]=salary.get(i); 
    } 
    resultTable = new JTable(data, columnNames); 
    outputPanel = new JPanel(); 
    outputPanel.add(resultTable); 
} 

Лучшей идеей было бы создать resultTable, завернуть в a JScrollPane и добавьте его на свой экран.

Когда вы хотите «печатать» данные, создать новый TableModel и применить его к JTable

Например ...

private void buildOutputPanel() { 
    outputPanel = new JPanel(new BorderLayout()); 
    resultTable = new JTable(); 
    outputPanel.add(new JScrollPane(resultTable)); 
} 

/*Copy ArrayList into 2D array to display in JTable format*/ 
private void printData() { 
    for (int i = 0; i < name.size(); i++) { 
     data[i][0] = name.get(i); 
     data[i][2] = department.get(i); 
     data[i][2] = salary.get(i); 
    } 
    DefaultTableModel model = new DefaultTableModel(data, columnNames); 
    resultTable.setModel(model); 
} 

Взгляните на How to Use Tables и How to Use Scroll Panes для более подробной информации

Пример

Data

import java.awt.BorderLayout; 
import java.awt.EventQueue; 
import java.awt.GridLayout; 
import java.awt.event.ActionEvent; 
import java.awt.event.ActionListener; 
import java.util.ArrayList; 
import javax.swing.JButton; 
import javax.swing.JComboBox; 
import javax.swing.JFrame; 
import javax.swing.JLabel; 
import javax.swing.JPanel; 
import javax.swing.JScrollPane; 
import javax.swing.JTable; 
import javax.swing.JTextField; 
import javax.swing.UIManager; 
import javax.swing.UnsupportedLookAndFeelException; 
import javax.swing.table.DefaultTableModel; 
import javax.swing.table.TableModel; 

public class PayrollFrame extends JFrame { 

    public static void main(String[] args) { 
     EventQueue.invokeLater(new Runnable() { 
      @Override 
      public void run() { 
       try { 
        UIManager.setLookAndFeel(UIManager.getSystemLookAndFeelClassName()); 
       } catch (ClassNotFoundException | InstantiationException | IllegalAccessException | UnsupportedLookAndFeelException ex) { 
        ex.printStackTrace(); 
       } 

       PayrollFrame frame = new PayrollFrame(); 
       frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); 
       frame.pack(); 
       frame.setLocationRelativeTo(null); 
       frame.setVisible(true); 
      } 
     }); 
    } 

    private JLabel nameMessageLabel, hourMessageLabel, rateMessageLabel, boxMessageLabel; 
    private JTextField nameTextField, hourTextField, rateTextField; 
    private JPanel inputPanel, buttonPanel, outputPanel, inputPanel1, inputPanel2, inputPanel3, inputPanel4; 
    private JComboBox<String> departmentBox; 
    private JButton addButton, displayButton, exitButton; 
    private JTable resultTable; 
    private String[] columnNames = {"Employee name", "Department", "Weekly Salary"}; 
    private Object[][] data; 
    private int WINDOW_WIDTH = 400; 
    private int WINDOW_HEIGHT = 500; 

    ArrayList<String> name = new ArrayList<String>(); 
    ArrayList<String> hour = new ArrayList<String>(); 
    ArrayList<String> rate = new ArrayList<String>(); 
    ArrayList<String> department = new ArrayList<String>(); 
    ArrayList<String> salary = new ArrayList<String>(); 

    private String[] departments = {"IT", "Marketing", "Human Resource", "Sales", "Customer Service", "Financial"}; 

    /*default constructor*/ 
    public PayrollFrame() { 
     super("Payroll"); 
     setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); 
     setLayout(new BorderLayout()); 
     buildInputPanel(); 
     buildButtonPanel(); 
     buildOutputPanel(); 

     add(inputPanel, BorderLayout.NORTH); 
     add(buttonPanel); 
     add(outputPanel, BorderLayout.SOUTH); 

     setVisible(true); 
    } 

    private void buildInputPanel() { 
     nameMessageLabel = new JLabel("Employee Name: "); 
     hourMessageLabel = new JLabel("Work Hour: "); 
     rateMessageLabel = new JLabel("Hourly Rate: "); 
     boxMessageLabel = new JLabel("Department: "); 
     nameTextField = new JTextField(10); 
     hourTextField = new JTextField(10); 
     rateTextField = new JTextField(10); 
     departmentBox = new JComboBox<String>(departments); 

     inputPanel = new JPanel(); 
     inputPanel1 = new JPanel(); 
     inputPanel2 = new JPanel(); 
     inputPanel3 = new JPanel(); 
     inputPanel4 = new JPanel(); 

     inputPanel1.add(nameMessageLabel); 
     inputPanel1.add(nameTextField); 
     inputPanel2.add(hourMessageLabel); 
     inputPanel2.add(hourTextField); 
     inputPanel3.add(rateMessageLabel); 
     inputPanel3.add(rateTextField); 
     inputPanel4.add(boxMessageLabel); 
     inputPanel4.add(departmentBox); 

     inputPanel.add(inputPanel1); 
     inputPanel.add(inputPanel2); 
     inputPanel.add(inputPanel3); 
     inputPanel.add(inputPanel4); 
    } 

    private void buildButtonPanel() { 
     addButton = new JButton("Add More"); 
     addButton.addActionListener(new ButtonAction()); 
     displayButton = new JButton("Display Result"); 
     displayButton.addActionListener(new ButtonAction()); 
     exitButton = new JButton("Exit"); 
     exitButton.addActionListener(new ButtonAction()); 

     buttonPanel = new JPanel(); 

     buttonPanel.add(addButton); 
     buttonPanel.add(displayButton); 
     buttonPanel.add(exitButton); 
    } 

    private void buildOutputPanel() { 
     outputPanel = new JPanel(new BorderLayout()); 
     resultTable = new JTable(); 
     outputPanel.add(new JScrollPane(resultTable));  
    } 

    /*Copy ArrayList into 2D array to display in JTable format*/ 
    private void printData() { 
     for (int i = 0; i < name.size(); i++) { 
      data[i][0] = name.get(i); 
      data[i][2] = department.get(i); 
      data[i][2] = salary.get(i); 
     } 
     TableModel model = new DefaultTableModel(data, columnNames); 
     resultTable.setModel(model); 
    } 

    /*Function of 3 buttons*/ 
    private class ButtonAction implements ActionListener { 

     @Override 
     public void actionPerformed(ActionEvent e) { 
      if ("Add More".equals(e.getActionCommand())) { 
       name.add(nameTextField.getText()); 
       hour.add(hourTextField.getText()); 
       rate.add(rateTextField.getText()); 
       department.add((String) departmentBox.getSelectedItem()); 
       calculateSalary(hourTextField.getText(), rateTextField.getText()); 
       nameTextField.setText(""); 
       hourTextField.setText(""); 
       rateTextField.setText(""); 
      } else if ("Display Result".equals(e.getActionCommand())) { 

       printData(); 

      } else if ("Exit".equals(e.getActionCommand())) { 
       System.exit(0); 
      } 
     } 

     /*Calculate the weekly salary*/ 
     private void calculateSalary(String hourString, String rateString) { 
      int tempHour = Integer.parseInt(hourString); 
      double tempRate = Double.parseDouble(rateString); 
      if (tempHour <= 40) { 
       salary.add(Double.toString(tempHour * tempRate)); 
      } else { 
       salary.add(Double.toString(40 * tempRate + (tempHour - 40) * (tempRate * 1.5))); //all hour after 40 will pay 1.5 
      } 
     } 
    } 
} 
+0

Ох ~~ Теперь я помню равную часть. Сейчас я начну читать страницу оракула. Спасибо за вашу помощь. :) –

+0

У меня есть один вопрос, правильно ли я определяю кнопку «Результат отображения»? Когда он включен, метод printData будет запускаться для создания JTable, но что дальше? Как узнать, отобразит ли OutputPanel таблицу? –

+0

Вы вроде как не делаете. Вы доверяете, что 'outputPanel' и' resultTable' уже созданы и добавлены в пользовательский интерфейс правильно. Ваш метод 'printData' заботится только об обновлении' TableModel' ... IMHO – MadProgrammer

0

Спасибо за помощь @MadProgrammer «s! Его ответ помогает мне решить многие проблемы, которые у меня есть, и действительно пытался объяснить мне все это. После консультации с моим инструктором, я успешно скомпилировал и запустил свою программу, отредактировав метод printData.

private void printData() 
    { 
     DefaultTableModel model = new DefaultTableModel(columnNames,name.size()); 
     resultTable.setModel(model); 
     for(int i=0; i<name.size(); i++) 
     { 
      resultTable.setValueAt(name.get(i),i,0); 
      resultTable.setValueAt(department.get(i),i,1); 
      resultTable.setValueAt(salary.get(i),i,2); 
     } 
    } 
Смежные вопросы