2015-06-05 2 views
0

Я пытаюсь сделать Калькулятор подоходного налога, и у меня есть MainWindow с панелью меню, чтобы открыть файл. После того, как я открою JFileChooser и проанализирую файл, я поместил результаты в класс Taxpayer. Проблема в том, что читается файл, но я не могу заставить результаты появляться на MainWindow. Мне как-то нужно вернуться к MainWindow и обновить результаты после открытия файла. Итак, в основном мне нужно обновить уже открытый MainWindow (который имеет пустой JFormattedTextFields) с соответствующей информацией на JFormattedTextField.Java GUI обновляет результаты после открытия файла

Вот код MainWindow:

package gui; 

import java.awt.EventQueue; 

import javax.swing.JFrame; 

import javax.swing.JMenuBar; 
import javax.swing.JMenuItem; 
import javax.swing.JMenu; 

import javax.swing.JLabel; 

import java.awt.Font; 

import javax.swing.JList; 
import javax.swing.JButton; 
import javax.swing.JSeparator; 
import javax.swing.JComboBox; 
import javax.swing.JTextPane; 
import javax.swing.JFormattedTextField; 

import java.awt.event.ActionListener; 
import java.awt.event.ActionEvent; 
import java.util.ArrayList; 

import javax.swing.JCheckBox; 
import javax.swing.text.NumberFormatter; 

import datamodel.Taxpayer; 

public class MainWindow extends JFrame{ 

    private JFrame frame; 
    private Taxpayer taxpayer; 


    /** 
    * Launch the application. 
    */ 
    public static void main(String[] args) { 
     EventQueue.invokeLater(new Runnable() { 
      public void run() { 
       try { 
        MainWindow window = new MainWindow(); 
        window.frame.setVisible(true);     
       } catch (Exception e) { 
        e.printStackTrace(); 
       } 
      } 
     }); 
    } 

    /** 
    * Create the application. 
    */ 
    public MainWindow() { 
     initialize(); 
    } 

    /** 
    * Initialize the contents of the frame. 
    */ 
    private void initialize() { 
     frame = new JFrame(); 
     frame.setBounds(100, 100, 590, 524); 
     frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); 
     frame.setTitle("Income Tax Calculator"); 

     JMenuBar menuBar = new JMenuBar(); 
     frame.setJMenuBar(menuBar); 

     JMenu menuFile = new JMenu("File"); 
     menuBar.add(menuFile); 

     JMenuItem menuOpenFile = new JMenuItem("Open File"); 
     menuOpenFile.addActionListener(new ActionListener() { 
      public void actionPerformed(ActionEvent arg0) { 
       FileChooser chooser = new FileChooser(); 
       chooser.setVisible(true);  

      } 
     }); 
     menuFile.add(menuOpenFile); 

     JMenuItem menuExit = new JMenuItem("Exit"); 
     menuExit.addActionListener(new ActionListener() { 
      public void actionPerformed(ActionEvent arg0) { 
       frame.dispose(); 
      } 
     }); 
     menuFile.add(menuExit); 

     JMenu menuOptions = new JMenu("Options"); 
     menuBar.add(menuOptions); 

     JMenu menuTaxpayer = new JMenu("Taxpayer"); 
     menuOptions.add(menuTaxpayer); 

     JMenuItem menuItemDeleteTaxpayer = new JMenuItem("Delete"); 
     menuItemDeleteTaxpayer.addActionListener(new ActionListener() { 
      public void actionPerformed(ActionEvent arg0) { 
       TaxpayerDeletion deletedTaxpayer = new TaxpayerDeletion(); 
       deletedTaxpayer.setVisible(true); 
      } 
     }); 
     menuTaxpayer.add(menuItemDeleteTaxpayer); 

     JMenu menuReceipt = new JMenu("Receipt"); 
     menuOptions.add(menuReceipt); 

     JMenuItem menuItemAdd = new JMenuItem("Add"); 
     menuItemAdd.addActionListener(new ActionListener() { 
      public void actionPerformed(ActionEvent arg0) { 
       ReceiptAdding receipt = new ReceiptAdding(); 
       receipt.setVisible(true); 
      } 
     }); 
     menuReceipt.add(menuItemAdd); 

     JMenuItem menuItemDeleteReceipt = new JMenuItem("Delete"); 
     menuItemDeleteReceipt.addActionListener(new ActionListener() { 
      public void actionPerformed(ActionEvent arg0) { 
       ReceiptDeletion deletedReceipt = new ReceiptDeletion(); 
       deletedReceipt.setVisible(true); 
      } 
     }); 
     menuReceipt.add(menuItemDeleteReceipt); 

     JMenu menuHelp = new JMenu("Help"); 
     menuBar.add(menuHelp); 

     JMenuItem menuItemHelp = new JMenuItem("Help"); 
     menuHelp.add(menuItemHelp); 

     JMenuItem menuItemAbout = new JMenuItem("About"); 
     menuHelp.add(menuItemAbout); 
     frame.getContentPane().setLayout(null); 

     JLabel labelSelectTaxpayer = new JLabel("Please select a taxpayer from the list:"); 
     labelSelectTaxpayer.setFont(new Font("Tahoma", Font.PLAIN, 12)); 
     labelSelectTaxpayer.setBounds(25, 21, 211, 23); 
     frame.getContentPane().add(labelSelectTaxpayer); 

     JLabel labelPersonalDetails = new JLabel("Personal Details"); 
     labelPersonalDetails.setFont(new Font("Tahoma", Font.BOLD, 14)); 
     labelPersonalDetails.setBounds(238, 69, 211, 14); 
     frame.getContentPane().add(labelPersonalDetails); 

     JLabel labelName = new JLabel("Name:"); 
     labelName.setFont(new Font("Tahoma", Font.PLAIN, 12)); 
     labelName.setBounds(56, 105, 46, 14); 
     frame.getContentPane().add(labelName); 

     JLabel labelAfm = new JLabel("AFM:"); 
     labelAfm.setFont(new Font("Tahoma", Font.PLAIN, 12)); 
     labelAfm.setBounds(56, 130, 46, 14); 
     frame.getContentPane().add(labelAfm); 

     JLabel labelStatus = new JLabel("Status:"); 
     labelStatus.setFont(new Font("Tahoma", Font.PLAIN, 12)); 
     labelStatus.setBounds(56, 155, 46, 14); 
     frame.getContentPane().add(labelStatus); 

     JLabel labelIncome = new JLabel("Income:"); 
     labelIncome.setFont(new Font("Tahoma", Font.PLAIN, 12)); 
     labelIncome.setBounds(56, 180, 59, 14); 
     frame.getContentPane().add(labelIncome); 

     JLabel labelReceipts = new JLabel("Receipts:"); 
     labelReceipts.setFont(new Font("Tahoma", Font.PLAIN, 12)); 
     labelReceipts.setBounds(56, 205, 59, 23); 
     frame.getContentPane().add(labelReceipts); 

     JButton buttonCalculate = new JButton("Calculate"); 
     buttonCalculate.addActionListener(new ActionListener() { 
      public void actionPerformed(ActionEvent arg0) { 
       Report report = new Report(); 
       report.setVisible(true); 
      } 
     }); 
     buttonCalculate.setFont(new Font("Tahoma", Font.BOLD, 14)); 
     buttonCalculate.setBounds(429, 425, 135, 31); 
     frame.getContentPane().add(buttonCalculate); 

     JSeparator separatorLeftDetails = new JSeparator(); 
     separatorLeftDetails.setBounds(10, 81, 218, 2); 
     frame.getContentPane().add(separatorLeftDetails); 

     JSeparator separatorRightDetails = new JSeparator(); 
     separatorRightDetails.setBounds(346, 81, 219, 2); 
     frame.getContentPane().add(separatorRightDetails); 

     JComboBox comboBoxTaxpayerList = new JComboBox(); 
     comboBoxTaxpayerList.setBounds(246, 23, 319, 20); 
     frame.getContentPane().add(comboBoxTaxpayerList); 

     JComboBox comboBoxReceiptsList = new JComboBox(); 
     comboBoxReceiptsList.setBounds(143, 207, 357, 20); 
     frame.getContentPane().add(comboBoxReceiptsList); 


     JFormattedTextField formattedTextFieldAfm = new JFormattedTextField(); 
     formattedTextFieldAfm.setEditable(false); 
     formattedTextFieldAfm.setEnabled(true); 
     if(taxpayer != null){ 
      System.out.println("TAXPAYER NOT NULL"); 
      formattedTextFieldAfm.setText(String.valueOf(taxpayer.getTaxRegistrationNumber())); 
      formattedTextFieldAfm.setVisible(true); 
     } 

     formattedTextFieldAfm.setBounds(143, 128, 357, 20); 
     frame.getContentPane().add(formattedTextFieldAfm); 

     JFormattedTextField formattedTextFieldStatus = new JFormattedTextField(); 
     formattedTextFieldStatus.setEditable(false); 
     formattedTextFieldStatus.setEnabled(true); 
     if(taxpayer != null){ 
      formattedTextFieldStatus.setText(taxpayer.getStatus()); 
     } 

     formattedTextFieldStatus.setBounds(143, 153, 357, 20); 
     frame.getContentPane().add(formattedTextFieldStatus); 

     JFormattedTextField formattedTextFieldIncome = new JFormattedTextField(); 
     formattedTextFieldIncome.setEditable(false); 
     formattedTextFieldIncome.setEnabled(true); 
     //formattedTextFieldIncome.setText(String.valueOf(taxpayer.getIncome())); 
     formattedTextFieldIncome.setBounds(143, 178, 357, 20); 
     frame.getContentPane().add(formattedTextFieldIncome); 

     JFormattedTextField formattedTextFieldName = new JFormattedTextField(); 
     formattedTextFieldName.setEditable(false); 
     formattedTextFieldName.setEnabled(true); 
     //formattedTextFieldName.setText(taxpayer.getName()); 
     formattedTextFieldName.setBounds(143, 103, 357, 20); 
     frame.getContentPane().add(formattedTextFieldName); 

     JSeparator separatorLeftCalculation = new JSeparator(); 
     separatorLeftCalculation.setBounds(10, 253, 218, 2); 
     frame.getContentPane().add(separatorLeftCalculation); 

     JLabel lblTaxCalculation = new JLabel("Tax Calculation"); 
     lblTaxCalculation.setFont(new Font("Tahoma", Font.BOLD, 14)); 
     lblTaxCalculation.setBounds(233, 227, 200, 50); 
     frame.getContentPane().add(lblTaxCalculation); 

     JSeparator separatorReightCalculation = new JSeparator(); 
     separatorReightCalculation.setBounds(340, 253, 225, 2); 
     frame.getContentPane().add(separatorReightCalculation); 

     JLabel lblPleaseSelectOne = new JLabel("Please select one or more options for tax calculation"); 
     lblPleaseSelectOne.setFont(new Font("Tahoma", Font.PLAIN, 12)); 
     lblPleaseSelectOne.setBounds(155, 266, 505, 23); 
     frame.getContentPane().add(lblPleaseSelectOne); 

     JCheckBox checkBoxTotalTax = new JCheckBox("Total Tax"); 
     checkBoxTotalTax.setBounds(93, 306, 150, 23); 
     frame.getContentPane().add(checkBoxTotalTax); 

     JCheckBox chechBoxTaxAnalysis = new JCheckBox("Tax analysis(Basic tax, tax increase or decrease based on receipts)"); 
     chechBoxTaxAnalysis.setBounds(92, 332, 357, 23); 
     frame.getContentPane().add(chechBoxTaxAnalysis); 

     JCheckBox checkBoxReceiptsTotalValue = new JCheckBox("Total value of the gathered receipts"); 
     checkBoxReceiptsTotalValue.setBounds(93, 358, 271, 23); 
     frame.getContentPane().add(checkBoxReceiptsTotalValue); 

     JCheckBox checkBoxAmountDifferentCategories = new JCheckBox("Analysis of the amounts spent for different categories of expenditure"); 
     checkBoxAmountDifferentCategories.setBounds(93, 384, 421, 23); 
     frame.getContentPane().add(checkBoxAmountDifferentCategories); 


    } 

    public void setTaxpayerInfo(Taxpayer taxpayer){ 
     this.taxpayer = taxpayer; 
     System.out.println("Test message :Inside"); 
    } 
} 

И это код FileChooser:

package gui; 


import input.TxtParser; 

import java.awt.EventQueue; 

import javax.swing.JFrame; 
import javax.swing.JPanel; 
import javax.swing.border.EmptyBorder; 








import datamodel.Taxpayer; 

import java.awt.event.ActionListener; 
import java.awt.event.ActionEvent; 
import java.io.File; 
import java.io.FileNotFoundException; 

public class FileChooser extends JFrame { 

    /** 
    * 
    */ 
    private static final long serialVersionUID = 1L; 
    private JPanel contentPane; 
    private Taxpayer taxpayer; 

    /** 
    * Launch the application. 
    */ 
    public static void main(String[] args) { 
     EventQueue.invokeLater(new Runnable() { 
      public void run() { 
       try { 
        FileChooser frame = new FileChooser(); 
        frame.setVisible(true); 
       } catch (Exception e) { 
        e.printStackTrace(); 
       } 
      } 
     }); 
    } 

    /** 
    * Create the frame. 
    */ 
    public FileChooser() { 
     setDefaultCloseOperation(JFrame.DISPOSE_ON_CLOSE); 
     setBounds(100, 100, 593, 436); 
     contentPane = new JPanel(); 
     contentPane.setBorder(new EmptyBorder(5, 5, 5, 5)); 
     setContentPane(contentPane); 
     contentPane.setLayout(null); 

     javax.swing.JFileChooser fileChooser = new javax.swing.JFileChooser(); 
     fileChooser.addActionListener(new ActionListener() { 
      public void actionPerformed(ActionEvent e) { 
       if(e.getActionCommand()!= null){ 
        File file = fileChooser.getSelectedFile(); 
        TxtParser txtParser = new TxtParser(); 

         try { 
          taxpayer = txtParser.parse(file); 
          if(taxpayer == null){ 
           System.out.println("NULL TAXPAYER"); 
          } 
          System.out.println(taxpayer); 
         } catch (FileNotFoundException e1) { 
          // TODO Auto-generated catch block 
          e1.printStackTrace(); 
         } 

        MainWindow mainWindow = new MainWindow(); 
        mainWindow.setTaxpayerInfo(taxpayer); 
        mainWindow.setEnabled(true); 
        mainWindow.setVisible(true); 

        close(); 
       } 
      } 
     }); 
     fileChooser.setBounds(0, 0, 582, 397); 
     contentPane.add(fileChooser); 
     this.setTitle("Income Tax Calculator"); 
    } 



    private void close(){ 
     this.dispose(); 
    } 
} 
+0

Это много кода, который можно пройти, не могли бы вы сократить его до a [Минимальный полный проверяемый пример] (http://stackoverflow.com/mcve)? –

+0

Ваше расширение от 'JFrame', но создавая новый экземпляр' JFrame', который не зависит от экземпляра 'MainWindow', неудивительно, что вы запутались. Класс 'FileChoooser', откровенно unnessacery, он может быть просто достигнут в' ActionListener' и с использованием класса 'JFileChooser' (у которого есть собственный диалог). – MadProgrammer

+0

Изолируйте области ответственности, чтобы упростить ограничение и контроль логики, которую вы пытаются применить – MadProgrammer

ответ

2

У вас есть несколько вопросов ...

Во-первых, ваш MainWindow класс простирается от JFrame, но и создать еще один экземпляр JFrame

public class MainWindow extends JFrame{ 

    private JFrame frame; 

Какой кадр, на самом деле тот, который содержит контент или отображается на экране? Я бы начать с удалением extends JFrame

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

JMenuItem menuOpenFile = new JMenuItem("Open File"); 
menuOpenFile.addActionListener(new ActionListener() { 
    public void actionPerformed(ActionEvent arg0) { 
     JFileChooser chooser = new JFileChooser(); 
     switch (chooser.showOpenDialog(frame)) { 
     case JFileChooser.APPROVE_OPTION: 
      File file = fileChooser.getSelectedFile(); 
      TxtParser txtParser = new TxtParser(); 

      try { 
      taxpayer = txtParser.parse(file); 
      if (taxpayer == null) { 
       System.out.println("NULL TAXPAYER"); 
      } 
      System.out.println(taxpayer); 
      setTextpayerInfo(taxPayer); 
      } catch (FileNotFoundException e1) { 
      // TODO Auto-generated catch block 
      e1.printStackTrace(); 
      } 
      break; 
     } 
    } 
}); 

В существующем классе FileChooser вы создаете еще один экземпляр MainWindow и звоните setTextpayerInfo, но setTextpayerInfo ничего не делает ?!

Ваш метод setTextpayerInfo должен заполнить поля или элементы управления, которыми вы хотите, чтобы пользователь мог манипулировать.

Отделите функциональность на отдельные классы, так что у вас есть, например, TaxPayerPane, который содержит поля и элементы управления, которые непосредственно связаны с управлением классом TaxPayer.

Затем объедините необходимые функции (меню) и TaxPayerPane на один экземпляр JFrame. Используйте сеттеры/геттеры для передачи информации между отдельными частями приложения по мере необходимости.

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

Кроме того, избегайте макетов null, они больше болят, чем они стоят. Использование соответствующих менеджеров компоновки, объединяя их для создания не только богатых пользовательских интерфейсов, но и гибких пользовательских интерфейсов, которые могут адаптироваться к различиям между платформами и внешним видом.

1

То, что вы пытаетесь сделать, это awnsered в очень удобной форме кодирования: Модель -View-Controler Design Patern. Взгляните на вики: http://en.wikipedia.org/wiki/Model%E2%80%93view%E2%80%93controller

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

Надеюсь, это поможет вам.

+2

Ваше ограничение на привлечение голосов за то, что вы предлагаете такие вещи, как «глобальные переменные», которые только заставят OP больше беспокоиться и заставят нас сделать больше работы, чтобы распутать его. – MadProgrammer

+0

Да, я просто хотел облегчить его, если ему нужно «быстрое решение». Ясно, что это не так, как вы хотите это сделать. но если у него нет времени на изучение MVC .... – JajaDrinker

+2

IMHO SO - это форум, на котором профессионалы могут получить профессиональные советы по проблемам, которые у них возникают. Предоставление «коротких сокращений» не помогает ОП и никому другому, у кого может быть аналогичная проблема, сейчас самое подходящее время (и большая возможность) научить ОП о хороших практиках, конечно, это может занять немного больше теперь, но сэкономит огромное количество времени в будущем. Совершенная практика делает совершенным (и да, мне трудно иногда поддерживать этот уровень) – MadProgrammer

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