Advertisement
Guest User

ReeferGUI

a guest
Oct 21st, 2018
81
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
Java 13.34 KB | None | 0 0
  1. import java.awt.EventQueue;
  2. import java.awt.Font;
  3. import java.awt.event.ActionEvent;
  4. import java.awt.event.ActionListener;
  5. import java.awt.event.KeyEvent;
  6. import java.awt.event.KeyListener;
  7. import java.awt.event.MouseEvent;
  8. import java.awt.event.MouseListener;
  9. import java.text.DecimalFormat;
  10. import java.util.ArrayList;
  11.  
  12. import javax.swing.GroupLayout;
  13. import javax.swing.GroupLayout.Alignment;
  14. import javax.swing.JFrame;
  15. import javax.swing.JLabel;
  16. import javax.swing.JPanel;
  17. import javax.swing.JTextField;
  18. import javax.swing.LayoutStyle.ComponentPlacement;
  19. import javax.swing.Timer;
  20. import javax.swing.border.EmptyBorder;
  21.  
  22. public class ReeferGUI extends JFrame
  23. {
  24.     private static final long serialVersionUID = 1L;
  25.    
  26.     private JPanel contentPane;
  27.  
  28.     private JLabel lblPercent1 = new JLabel("%");;
  29.     private JLabel labelPercent2 = new JLabel("%");;
  30.  
  31.     private JLabel lblWeedAmtG = new JLabel("Weed Amount (g)");
  32.     private JLabel labelDabAmtG = new JLabel("Dab Amount (g)");
  33.     private JLabel lblWeedAmtO = new JLabel("Weed Amount (O)");
  34.     private JLabel lblDabAmtO = new JLabel("Dab Amount (O)");
  35.     private JLabel lblWeedPotency = new JLabel("THC Potency (Weed)");
  36.     private JLabel lblDabPotency = new JLabel("THC Potency (Dabs)");
  37.    
  38.     private JTextField weedAmtG,      // 0
  39.                              dabAmtG,        // 1
  40.                              weedAmtO,       // 2       These are the index's of each of the TextFields in
  41.                              dabAmtO,       // 3       textFieldList in the TimerListener class.
  42.                              weedPotency,   // 4
  43.                              dabPotency;    // 5
  44.  
  45.     public ReeferGUI()
  46.     {
  47.         setTitle("Reefer");
  48.         setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
  49.         setBounds(100, 100, 219, 272);
  50.         contentPane = new JPanel();
  51.         contentPane.setBorder(new EmptyBorder(5, 5, 5, 5));
  52.         setContentPane(contentPane);
  53.        
  54.         weedAmtG = new JTextField();
  55.         weedAmtG.setColumns(10);
  56.         TextFieldListener weedAmtGListener = new TextFieldListener(weedAmtG, true);
  57.         weedAmtG.addKeyListener(weedAmtGListener);
  58.         weedAmtG.addMouseListener(weedAmtGListener);
  59.        
  60.         dabAmtG = new JTextField();
  61.         dabAmtG.setColumns(10);
  62.         TextFieldListener dabAmtGListener = new TextFieldListener(dabAmtG, true);
  63.         dabAmtG.addKeyListener(dabAmtGListener);
  64.         dabAmtG.addMouseListener(dabAmtGListener);
  65.    
  66.         weedAmtO = new JTextField();
  67.         weedAmtO.setColumns(10);
  68.         TextFieldListener weedAmtOListener = new TextFieldListener(weedAmtO, true);
  69.         weedAmtO.addKeyListener(weedAmtOListener);
  70.         weedAmtO.addMouseListener(weedAmtOListener);
  71.        
  72.         dabAmtO = new JTextField();
  73.         dabAmtO.setColumns(10);
  74.         TextFieldListener dabAmtOListener = new TextFieldListener(dabAmtO, true);
  75.         dabAmtO.addKeyListener(dabAmtOListener);
  76.         dabAmtO.addMouseListener(dabAmtOListener);
  77.        
  78.         weedPotency = new JTextField();
  79.         weedPotency.setColumns(10);
  80.         TextFieldListener weedPotencyListener = new TextFieldListener(weedPotency, false);
  81.         weedPotency.addKeyListener(weedPotencyListener);
  82.         weedPotency.addMouseListener(weedPotencyListener);
  83.         weedPotency.setHorizontalAlignment(JTextField.RIGHT);
  84.         weedPotency.setText("17");
  85.  
  86.         dabPotency = new JTextField();
  87.         dabPotency.setColumns(10);
  88.         TextFieldListener dabPotencyListener = new TextFieldListener(dabPotency, false);
  89.         dabPotency.addKeyListener(dabPotencyListener);
  90.         dabPotency.addMouseListener(dabPotencyListener);
  91.         dabPotency.setHorizontalAlignment(JTextField.RIGHT);
  92.         dabPotency.setText("85");
  93.  
  94.         lblPercent1.setFont(new Font("Tahoma", Font.PLAIN, 12));
  95.         labelPercent2.setFont(new Font("Tahoma", Font.PLAIN, 12));
  96.        
  97.         initializeComponentLayout();
  98.     }
  99.  
  100.     private void initializeComponentLayout()
  101.     {
  102.         GroupLayout gl_contentPane = new GroupLayout(contentPane);
  103.         gl_contentPane.setHorizontalGroup(
  104.             gl_contentPane.createParallelGroup(Alignment.LEADING)
  105.                 .addGroup(gl_contentPane.createSequentialGroup()
  106.                     .addGroup(gl_contentPane.createParallelGroup(Alignment.LEADING)
  107.                         .addGroup(gl_contentPane.createSequentialGroup()
  108.                             .addGroup(gl_contentPane.createParallelGroup(Alignment.TRAILING, false)
  109.                                 .addComponent(lblWeedAmtG)
  110.                                 .addComponent(weedAmtG, Alignment.LEADING)
  111.                                 .addComponent(lblWeedAmtO, Alignment.LEADING, GroupLayout.DEFAULT_SIZE, GroupLayout.DEFAULT_SIZE, Short.MAX_VALUE))
  112.                             .addGap(18)
  113.                             .addGroup(gl_contentPane.createParallelGroup(Alignment.LEADING)
  114.                                 .addComponent(lblDabAmtO, GroupLayout.PREFERRED_SIZE, 87, GroupLayout.PREFERRED_SIZE)
  115.                                 .addGroup(gl_contentPane.createSequentialGroup()
  116.                                     .addGap(1)
  117.                                     .addComponent(labelDabAmtG, GroupLayout.PREFERRED_SIZE, 85, GroupLayout.PREFERRED_SIZE))
  118.                                 .addComponent(dabAmtG, GroupLayout.PREFERRED_SIZE, GroupLayout.DEFAULT_SIZE, GroupLayout.PREFERRED_SIZE)))
  119.                         .addGroup(gl_contentPane.createSequentialGroup()
  120.                             .addComponent(weedAmtO, GroupLayout.PREFERRED_SIZE, 87, GroupLayout.PREFERRED_SIZE)
  121.                             .addGap(18)
  122.                             .addComponent(dabAmtO, GroupLayout.PREFERRED_SIZE, 87, GroupLayout.PREFERRED_SIZE))
  123.                         .addGroup(gl_contentPane.createSequentialGroup()
  124.                             .addGap(68)
  125.                             .addComponent(weedPotency, GroupLayout.PREFERRED_SIZE, 33, GroupLayout.PREFERRED_SIZE)
  126.                             .addPreferredGap(ComponentPlacement.RELATED)
  127.                             .addComponent(lblPercent1))
  128.                         .addGroup(gl_contentPane.createSequentialGroup()
  129.                             .addGap(44)
  130.                             .addGroup(gl_contentPane.createParallelGroup(Alignment.LEADING)
  131.                                 .addComponent(lblDabPotency, GroupLayout.PREFERRED_SIZE, 101, GroupLayout.PREFERRED_SIZE)
  132.                                 .addComponent(lblWeedPotency)))
  133.                         .addGroup(gl_contentPane.createSequentialGroup()
  134.                             .addGap(67)
  135.                             .addComponent(dabPotency, GroupLayout.PREFERRED_SIZE, 33, GroupLayout.PREFERRED_SIZE)
  136.                             .addPreferredGap(ComponentPlacement.RELATED)
  137.                             .addComponent(labelPercent2, GroupLayout.PREFERRED_SIZE, 12, GroupLayout.PREFERRED_SIZE)))
  138.                     .addContainerGap(GroupLayout.DEFAULT_SIZE, Short.MAX_VALUE))
  139.         );
  140.         gl_contentPane.setVerticalGroup(
  141.             gl_contentPane.createParallelGroup(Alignment.LEADING)
  142.                 .addGroup(gl_contentPane.createSequentialGroup()
  143.                     .addGroup(gl_contentPane.createParallelGroup(Alignment.LEADING)
  144.                         .addGroup(gl_contentPane.createSequentialGroup()
  145.                             .addComponent(lblWeedAmtG, GroupLayout.PREFERRED_SIZE, 16, GroupLayout.PREFERRED_SIZE)
  146.                             .addPreferredGap(ComponentPlacement.RELATED)
  147.                             .addComponent(weedAmtG, GroupLayout.PREFERRED_SIZE, GroupLayout.DEFAULT_SIZE, GroupLayout.PREFERRED_SIZE))
  148.                         .addGroup(gl_contentPane.createSequentialGroup()
  149.                             .addComponent(labelDabAmtG, GroupLayout.PREFERRED_SIZE, 16, GroupLayout.PREFERRED_SIZE)
  150.                             .addGap(6)
  151.                             .addComponent(dabAmtG, GroupLayout.PREFERRED_SIZE, GroupLayout.DEFAULT_SIZE, GroupLayout.PREFERRED_SIZE)))
  152.                     .addPreferredGap(ComponentPlacement.RELATED)
  153.                     .addGroup(gl_contentPane.createParallelGroup(Alignment.BASELINE)
  154.                         .addComponent(lblWeedAmtO)
  155.                         .addComponent(lblDabAmtO))
  156.                     .addPreferredGap(ComponentPlacement.RELATED)
  157.                     .addGroup(gl_contentPane.createParallelGroup(Alignment.BASELINE)
  158.                         .addComponent(weedAmtO, GroupLayout.PREFERRED_SIZE, GroupLayout.DEFAULT_SIZE, GroupLayout.PREFERRED_SIZE)
  159.                         .addComponent(dabAmtO, GroupLayout.PREFERRED_SIZE, GroupLayout.DEFAULT_SIZE, GroupLayout.PREFERRED_SIZE))
  160.                     .addGap(25)
  161.                     .addComponent(lblWeedPotency)
  162.                     .addPreferredGap(ComponentPlacement.RELATED)
  163.                     .addGroup(gl_contentPane.createParallelGroup(Alignment.BASELINE)
  164.                         .addComponent(lblPercent1, GroupLayout.PREFERRED_SIZE, 20, GroupLayout.PREFERRED_SIZE)
  165.                         .addComponent(weedPotency, GroupLayout.PREFERRED_SIZE, GroupLayout.DEFAULT_SIZE, GroupLayout.PREFERRED_SIZE))
  166.                     .addPreferredGap(ComponentPlacement.UNRELATED)
  167.                     .addComponent(lblDabPotency)
  168.                     .addPreferredGap(ComponentPlacement.RELATED)
  169.                     .addGroup(gl_contentPane.createParallelGroup(Alignment.BASELINE)
  170.                         .addComponent(dabPotency, GroupLayout.PREFERRED_SIZE, GroupLayout.DEFAULT_SIZE, GroupLayout.PREFERRED_SIZE)
  171.                         .addComponent(labelPercent2, GroupLayout.PREFERRED_SIZE, 20, GroupLayout.PREFERRED_SIZE))
  172.                     .addContainerGap(46, Short.MAX_VALUE))
  173.         );
  174.         contentPane.setLayout(gl_contentPane);
  175.     }
  176.  
  177.     public static void openNewGUI()
  178.     {
  179.         EventQueue.invokeLater(new Runnable()
  180.         {
  181.             public void run()
  182.             {
  183.                 try
  184.                 {
  185.                     ReeferGUI frame = new ReeferGUI();
  186.                     frame.setVisible(true);
  187.                 }
  188.                 catch (Exception e)
  189.                 {
  190.                     e.printStackTrace();
  191.                 }
  192.             }
  193.         });
  194.     }
  195. }
  196. class TextFieldListener implements KeyListener, MouseListener
  197. {
  198.     private static ArrayList<JTextField> connectedFieldList = new ArrayList<>();
  199.     private static ArrayList<JTextField> textFieldList = new ArrayList<>();
  200.  
  201.     private static JTextField currentlyEditingField;
  202.     private static JTextField lastEditedConnectedField;
  203.    
  204.     private JTextField textField;  
  205.    
  206.     static boolean firstRun = true;
  207.    
  208.     private static Timer timer = new Timer(500, new TimerListener());
  209.    
  210.     static
  211.     {
  212.         timer.start();
  213.     }
  214.    
  215.     public TextFieldListener(JTextField field, boolean addToList)
  216.     {
  217.         textField = field;
  218.         textFieldList.add(field);
  219.        
  220.         if (addToList)
  221.         {
  222.             if (firstRun) // Set the top left box (first one added to list) to the currently editing box
  223.             {
  224.                 firstRun = false;
  225.                 currentlyEditingField = textField;
  226.             }
  227.             else  // Set all text boxes to "--" besides the top left one
  228.             {
  229.                 field.setText("--");
  230.  
  231.             }
  232.            
  233.             field.setHorizontalAlignment(JTextField.CENTER);
  234.             connectedFieldList.add(field);
  235.         }
  236.     }
  237.    
  238.     @Override
  239.     public void keyPressed(KeyEvent e) { }
  240.    
  241.     private void clearConnectedTextFields()
  242.     {
  243.         for (JTextField f : connectedFieldList)
  244.         {
  245.             if (f != null && !(f.equals(textField)))
  246.             {
  247.                 f.setText("--");
  248.             }
  249.         }
  250.        
  251.     }
  252.  
  253.     @Override
  254.     public void keyReleased(KeyEvent arg0) { }
  255.  
  256.     @Override
  257.     public void keyTyped(KeyEvent e)
  258.     {
  259.         currentlyEditingField = textField;
  260.        
  261.         if (connectedFieldList.contains(textField))
  262.         {
  263.             lastEditedConnectedField = textField;
  264.             clearConnectedTextFields();
  265.         }
  266.     }
  267.  
  268.     @Override
  269.     public void mouseClicked(MouseEvent e)
  270.     {
  271.         textField.setText("");
  272.         currentlyEditingField = textField;
  273.        
  274.         if (connectedFieldList.contains(textField))
  275.         {
  276.             lastEditedConnectedField = textField;
  277.             clearConnectedTextFields();
  278.         }
  279.     }
  280.    
  281.     @Override
  282.     public void mouseEntered(MouseEvent e) { }
  283.  
  284.     @Override
  285.     public void mouseExited(MouseEvent e) { }
  286.  
  287.     @Override
  288.     public void mousePressed(MouseEvent e)  { }
  289.  
  290.     @Override
  291.     public void mouseReleased(MouseEvent e) { }
  292.    
  293.    
  294.     static class TimerListener implements ActionListener
  295.     {
  296.         @Override
  297.         public void actionPerformed(ActionEvent e)
  298.         {
  299.             ping();
  300.         }
  301.        
  302.         private void ping()
  303.         {  
  304.             if (areAllFieldsValid()) // If all fields are valid numbers, perform calculations
  305.             {
  306.                 int index = 0; // Figure out the index of the last edited text box because the calculations are based off of this index
  307.                 for (int i = 0; i < connectedFieldList.size(); i++)
  308.                 {
  309.                     if (connectedFieldList.get(i).equals(lastEditedConnectedField))
  310.                     {
  311.                         index = i;
  312.                     }
  313.                 }
  314.                
  315.                 JTextField f = connectedFieldList.get(index);
  316.                
  317.                 double weedPotency = Double.parseDouble(textFieldList.get(4).getText());
  318.                 double dabPotency = Double.parseDouble(textFieldList.get(5).getText());
  319.                 double weedToDabRatio = weedPotency / dabPotency;
  320.                 double dabToWeedRatio = dabPotency / weedPotency;
  321.  
  322.                 DecimalFormat df = new DecimalFormat("#.##");
  323.                
  324.                 double weedG = 0, dabG = 0, weedO = 0, dabO = 0;
  325.                
  326.                 switch (index)
  327.                 {
  328.                 case 0: // CONDITION they edited the Weed Amount (g) field, so other values should be based off of this field
  329.                     weedG = Double.parseDouble(f.getText());
  330.                     weedO = weedG / 28.0;
  331.                     dabG = weedToDabRatio * weedG;
  332.                     dabO = weedToDabRatio * weedO;
  333.                     break;
  334.                 case 1: // CONDITION they edited the Dab Amount (g) field, so other values should be based off of this field
  335.                     dabG = Double.parseDouble(f.getText());
  336.                     dabO = dabG / 28.0;
  337.                     weedG = dabToWeedRatio * dabG;
  338.                     weedO = weedG / 28.0;
  339.                     break;
  340.                 case 2: // CONDITION they edited the Weed Amount (O) field, so other values should be based off of this field
  341.                     weedO = Double.parseDouble(f.getText());
  342.                     weedG = weedO * 28.0;
  343.                     dabG = weedToDabRatio * weedG;
  344.                     dabO = weedToDabRatio * weedO;
  345.                     break;
  346.                 case 3: // CONDITION they edited the Dab Amount (O) field, so other values should be based off of this field
  347.                     dabO = Double.parseDouble(f.getText());
  348.                     dabG = dabG * 28.0;
  349.                     weedG = dabToWeedRatio * dabG;
  350.                     weedO = weedG / 28.0;
  351.                     break;
  352.                 }
  353.                
  354.                 connectedFieldList.get(0).setText(df.format(weedG));
  355.                 connectedFieldList.get(1).setText(df.format(dabG));
  356.                 connectedFieldList.get(2).setText(df.format(weedO));
  357.                 connectedFieldList.get(3).setText(df.format(dabO));
  358.             }
  359.            
  360.         }
  361.  
  362.         private boolean areAllFieldsValid()
  363.         {
  364.             boolean valid = true;
  365.             int numBlankFields = 0;
  366.             for (JTextField f : textFieldList)
  367.             {
  368.                 try
  369.                 {
  370.                     Double.parseDouble(f.getText());
  371.                 }
  372.                 catch (Exception e)
  373.                 {
  374.                     if (!(f.getText().equals("--")))
  375.                     {
  376.                         valid = false;
  377.                        
  378.                         if (!(f.equals(currentlyEditingField))) // Don't change the text to #NAN if the user is currently editing it
  379.                         {
  380.                             f.setText("#NAN");
  381.                         }  
  382.                     }
  383.                     else
  384.                     {
  385.                         numBlankFields++;
  386.                     }
  387.                 }
  388.             }
  389.            
  390.             if (numBlankFields > 3) // If all 4 fields are blank it can't be valid
  391.             {
  392.                 valid = false;
  393.             }
  394.             return valid;
  395.         }
  396.        
  397.     }
  398. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement