Advertisement
Guest User

Untitled

a guest
Feb 2nd, 2021
208
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
Java 14.20 KB | None | 0 0
  1.     import java.awt.*;
  2.     import java.awt.event.*;
  3.    
  4.     import javax.swing.*;
  5.     import javax.swing.border.EmptyBorder;
  6.     import javax.swing.event.*;
  7.     import javax.swing.text.*;
  8.    
  9.     import java.text.*;
  10.    
  11.     import java.util.List;
  12.     import java.util.ArrayList;
  13.     import java.util.Arrays;
  14.    
  15.    
  16.     @SuppressWarnings("unused")
  17.     public class BuildGridGUI
  18.     {
  19.        
  20.         static final int WIDTH_MIN = 100;
  21.         static final int WIDTH_MAX = 2000;
  22.         static final int WIDTH_INIT = 520;
  23.        
  24.         static final int HEIGHT_MIN = 100;
  25.         static final int HEIGHT_MAX = 2000;
  26.         static final int HEIGHT_INIT = 300;
  27.        
  28.         static final int NUMCOLS_INIT = 3;
  29.         static final int NUMCOLS_MIN = 1;
  30.         static final int NUMCOLS_MAX = 8;
  31.        
  32.         int widthOfFrames = WIDTH_INIT;
  33.         int heightOfFrames = HEIGHT_INIT;
  34.         int numCols = NUMCOLS_INIT;
  35.         int numFrames;
  36.        
  37.         List<String> listOfIDs;
  38.        
  39.         /*
  40.         final static boolean shouldFill = true;
  41.         final static boolean shouldWeightX = true;
  42.         final static boolean RIGHT_TO_LEFT = false;
  43.         */
  44.        
  45.        
  46.        
  47.         private final JComponent makeUI()
  48.         {
  49.             JPanel p = new JPanel();
  50.            
  51.            
  52.             p.setLayout(new BorderLayout());
  53.            
  54.             Grid g = new Grid();
  55.             JComponent j = makeSideMenu(g);
  56.            
  57.             g.setBorder(BorderFactory.createCompoundBorder(
  58.                   BorderFactory.createLineBorder(Color.red),
  59.                   g.getBorder()));
  60.            
  61.            
  62.             j.setBorder(BorderFactory.createCompoundBorder(
  63.                       BorderFactory.createLineBorder(Color.red),
  64.                       j.getBorder()));
  65.            
  66.            
  67.             p.add(j, BorderLayout.EAST);
  68.             p.add(g, BorderLayout.WEST);
  69.            
  70.            
  71.             return p;
  72.         }
  73.        
  74.         private final JComponent makeSideMenu(Grid grid)
  75.         {
  76.             JPanel p = new JPanel();
  77.            
  78.             JSpinner numColsSelectorField = new JSpinner();
  79.             JSpinner widthSpinner = new JSpinner();
  80.             JSlider widthSlider = new JSlider(WIDTH_MIN, WIDTH_MAX, WIDTH_INIT);
  81.             JSlider heightSlider = new JSlider(BuildGridGUI.HEIGHT_MIN, BuildGridGUI.HEIGHT_MAX, BuildGridGUI.HEIGHT_INIT);
  82.             JButton confirmButton = new JButton("Confirm");
  83.             //JLabel widthSlider_Thumb = new JLabel();
  84.             JLabel numColsSelectorLabel = new JLabel("Frames Per Column");
  85.             JLabel widthLabel = new JLabel("Width per Frame (Pixels)");
  86.             JLabel heightLabel = new JLabel("Height per Frame (Pixels)");
  87.             JSpinner heightSpinner = new JSpinner();
  88.            
  89.            
  90.            
  91.             numColsSelectorField.setModel(new SpinnerNumberModel(NUMCOLS_INIT, NUMCOLS_MIN, NUMCOLS_MAX, 1));
  92.             numColsSelectorField.setEditor(new JSpinner.NumberEditor(numColsSelectorField));
  93.             numColsSelectorField.setMaximumSize(numColsSelectorField.getPreferredSize());
  94.             numColsSelectorField.addChangeListener(new ChangeListener() {
  95.                 @Override public void stateChanged(ChangeEvent e)
  96.                 {
  97.                     JSpinner spinner = (JSpinner)e.getSource();
  98.                     try {
  99.                         spinner.commitEdit();
  100.                     } catch (ParseException e1) {
  101.                         e1.printStackTrace();
  102.                     }
  103.                     setNumCols((Integer)spinner.getValue());
  104.                     grid.refresh();
  105.                 }
  106.             });
  107.            
  108.            
  109.             widthSlider.setMajorTickSpacing(300);
  110.             widthSlider.setMinorTickSpacing(20);
  111.             widthSlider.setPaintTicks(true);
  112.             widthSlider.setPaintLabels(true);
  113.             widthSlider.addChangeListener(new ChangeListener()
  114.             {
  115.                 @Override public void stateChanged(ChangeEvent e)
  116.                 {
  117.                     JSlider slider = (JSlider)e.getSource();
  118.                     if (!slider.getValueIsAdjusting())
  119.                     {
  120.                         setWidthOfFrames((Integer)slider.getValue());
  121.                         GatedChangeListener.setEnabled(false);
  122.                         widthSpinner.setValue((Integer)slider.getValue());
  123.                         GatedChangeListener.setEnabled(true);
  124.                         grid.refresh();
  125.                     }
  126.                 }
  127.             });
  128.            
  129.             widthSpinner.setModel(new SpinnerNumberModel(WIDTH_INIT, WIDTH_MIN, WIDTH_MAX, 1));
  130.             widthSpinner.setEditor(new JSpinner.NumberEditor(widthSpinner));
  131.             widthSpinner.setPreferredSize(new Dimension(70, 30));
  132.             widthSpinner.setMaximumSize(widthSpinner.getPreferredSize());
  133.             widthSpinner.addChangeListener(new GatedChangeListener() {
  134.                 @Override public void onChangedState(ChangeEvent e)
  135.                 {
  136.                     JSpinner spinner = (JSpinner)e.getSource();
  137.                     try {
  138.                         spinner.commitEdit();
  139.                     } catch (ParseException e1) {
  140.                         e1.printStackTrace();
  141.                     }
  142.                     setWidthOfFrames(((Integer)spinner.getValue()));
  143.                     widthSlider.setValue((Integer)spinner.getValue());
  144.                     grid.refresh();
  145.                 }
  146.             });
  147.            
  148.            
  149.            
  150.            
  151.             heightSlider.setMajorTickSpacing(300);
  152.             heightSlider.setMinorTickSpacing(20);
  153.             heightSlider.setPaintTicks(true);
  154.             heightSlider.setPaintLabels(true);
  155.             heightSlider.addChangeListener(new ChangeListener()
  156.             {
  157.                 @Override public void stateChanged(ChangeEvent e)
  158.                 {
  159.                     JSlider slider = (JSlider)e.getSource();
  160.                     if (!slider.getValueIsAdjusting())
  161.                     {
  162.                         setHeightOfFrames((Integer)slider.getValue());
  163.                         heightSpinner.setValue((Integer)slider.getValue());
  164.                         grid.refresh();
  165.                     }
  166.                 }
  167.             });
  168.            
  169.            
  170.             heightSpinner.setModel(new SpinnerNumberModel(HEIGHT_INIT, HEIGHT_MIN, HEIGHT_MAX, 1));
  171.             heightSpinner.setEditor(new JSpinner.NumberEditor(heightSpinner));
  172.             heightSpinner.setPreferredSize(new Dimension(70, 30));
  173.             heightSpinner.setMaximumSize(heightSpinner.getPreferredSize());
  174.             heightSpinner.addChangeListener(new GatedChangeListener() {
  175.                 @Override public void onChangedState(ChangeEvent e)
  176.                 {
  177.                     JSpinner spinner = (JSpinner)e.getSource();
  178.                     try {
  179.                         spinner.commitEdit();
  180.                     } catch (ParseException e1) {
  181.                         e1.printStackTrace();
  182.                     }
  183.                     setWidthOfFrames(((Integer)spinner.getValue()));
  184.                     heightSlider.setValue((Integer)spinner.getValue());
  185.                     grid.refresh();
  186.                 }
  187.             });
  188.            
  189.            
  190.             confirmButton.addActionListener(new ActionListener() {
  191.                 @Override public void actionPerformed(ActionEvent e)
  192.                 {
  193.                     JButton confirmButton = (JButton)e.getSource();
  194.                     // TODO
  195.                     System.out.println("Num Cols: "
  196.                     + numCols
  197.                     + "\nWidth: "
  198.                     + widthOfFrames
  199.                     + "\nHeight: "
  200.                     + heightOfFrames);
  201.                 }
  202.             });
  203.            
  204.     //      numColsSelectorLabel.setBorder(BorderFactory.createCompoundBorder(
  205.     //                BorderFactory.createLineBorder(Color.red),
  206.     //                numColsSelectorLabel.getBorder()));
  207.            
  208.            
  209.             //TODO make a UI that looks nice and isn't bare-bones functional, but this does work on its own.
  210.             // I don't understand the GridBagLayout.  It keeps having weird bugs with sizing and rows and columns not being static and taking up multiple spaces and ugh.
  211.            
  212.            
  213.             p.setLayout(new BoxLayout(p, BoxLayout.Y_AXIS));
  214.             p.setPreferredSize(new Dimension(300, 480));
  215.             p.setSize(new Dimension(300, 480));
  216.            
  217.             numColsSelectorLabel.setAlignmentX(Component.CENTER_ALIGNMENT);
  218.             numColsSelectorField.setAlignmentX(Component.CENTER_ALIGNMENT);
  219.             widthSlider.setAlignmentX(Component.CENTER_ALIGNMENT);
  220.             heightSlider.setAlignmentX(Component.CENTER_ALIGNMENT);
  221.             confirmButton.setAlignmentX(Component.CENTER_ALIGNMENT);
  222.             widthLabel.setAlignmentX(Component.CENTER_ALIGNMENT);
  223.             heightLabel.setAlignmentX(Component.CENTER_ALIGNMENT);
  224.             widthSpinner.setAlignmentX(Component.CENTER_ALIGNMENT);
  225.             heightSpinner.setAlignmentX(Component.CENTER_ALIGNMENT);
  226.            
  227.            
  228.             p.add(Box.createRigidArea(new Dimension(300, 30)));
  229.             p.add(numColsSelectorLabel);
  230.             p.add(Box.createRigidArea(new Dimension(300, 5)));
  231.             p.add(numColsSelectorField);
  232.             p.add(Box.createRigidArea(new Dimension(300, 25)));
  233.             p.add(widthLabel);
  234.             p.add(Box.createRigidArea(new Dimension(300, 3)));
  235.             p.add(widthSpinner);
  236.             p.add(widthSlider);
  237.             p.add(Box.createRigidArea(new Dimension(300, 25)));
  238.             p.add(heightLabel);
  239.             p.add(Box.createRigidArea(new Dimension(300, 3)));
  240.             p.add(heightSpinner);
  241.             p.add(heightSlider);
  242.             p.add(Box.createRigidArea(new Dimension(300, 45)));
  243.             p.add(confirmButton);
  244.            
  245.            
  246.             return p;
  247.         }
  248.        
  249.         private static void makeKeysWindow(BuildGridGUI b)
  250.         {
  251.             JFrame inputKeysWindow = new JFrame("Input Keys");
  252.             inputKeysWindow.setDefaultCloseOperation(JFrame.DISPOSE_ON_CLOSE);
  253.             inputKeysWindow.setSize(300, 400);
  254.             inputKeysWindow.setResizable(false);
  255.             inputKeysWindow.getContentPane().add(b.keysPanel(inputKeysWindow));    
  256.             inputKeysWindow.setVisible(true);
  257.         }
  258.        
  259.         // enter a bunch of strings; they'll be the data put into the grid.
  260.         // currently just takes count of number of strings and uses that to infer the rows
  261.         private final JComponent keysPanel(JFrame frame)
  262.         {
  263.             JPanel p = new JPanel();
  264.            
  265.             JTextArea textField = new JTextArea();
  266.             JButton confirmButton = new JButton("Confirm");
  267.            
  268.             textField.setEditable(true);
  269.             textField.setPreferredSize(new Dimension(280, 380));
  270.             textField.setLineWrap(false);
  271.            
  272.             confirmButton.addActionListener(new ActionListener()
  273.             {
  274.                 @Override public void actionPerformed(ActionEvent e) {
  275.                     if (textField.getText().length() != 0) {
  276.                         BuildGridGUI.this.listOfIDs = Arrays.asList(textField.getText().split("\n"));
  277.                         BuildGridGUI.this.numFrames = textField.getLineCount();
  278.                        
  279.                         SwingUtilities.invokeLater(new Runnable() {
  280.                             @Override public void run() {
  281.                                 createMainWindow(BuildGridGUI.this);
  282.                                 frame.setVisible(false);
  283.                                 frame.dispose();
  284.                             }
  285.                         });
  286.                     }
  287.                 }
  288.             });
  289.            
  290.             p.setLayout(new BoxLayout(p, BoxLayout.Y_AXIS));
  291.            
  292.             textField.setAlignmentX(Container.CENTER_ALIGNMENT);
  293.             confirmButton.setAlignmentX(Container.CENTER_ALIGNMENT);
  294.            
  295.             p.add(textField);
  296.             p.add(confirmButton);
  297.            
  298.             return p;
  299.         }
  300.        
  301.        
  302.        
  303.        
  304.        
  305.         void setWidthOfFrames(int x)
  306.         {
  307.             this.widthOfFrames = x;
  308.         }
  309.        
  310.         void setHeightOfFrames(int y)
  311.         {
  312.             this.heightOfFrames = y;
  313.         }
  314.        
  315.         void setNumCols(int x)
  316.         {
  317.             this.numCols = x;
  318.         }
  319.        
  320.         void setNumFrames(int x)
  321.         {
  322.             this.numFrames = x;
  323.         }
  324.        
  325.        
  326.         public static void createAndShowGUI()
  327.         {
  328.             try {
  329.                 for (UIManager.LookAndFeelInfo lookAndFeel : UIManager.getInstalledLookAndFeels())
  330.                     if ("Nimbus".equals(lookAndFeel.getName()))
  331.                         UIManager.setLookAndFeel(lookAndFeel.getClassName());
  332.                
  333.             } catch (Exception e) {
  334.                 e.printStackTrace();
  335.             }
  336.            
  337.             BuildGridGUI b = new BuildGridGUI();
  338.            
  339.             makeKeysWindow(b);
  340.            
  341.         }
  342.        
  343.        
  344.        
  345.        
  346.         private static void createMainWindow(BuildGridGUI b) {
  347.             JFrame mainFrame = new JFrame("Grid Builder");
  348.             //mainFrame.getContentPane().setLayout(new BoxLayout(mainFrame.getContentPane(), BoxLayout.PAGE_AXIS));
  349.             mainFrame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
  350.             mainFrame.setSize(940, 480);
  351.             mainFrame.getContentPane().add(b.makeUI());
  352.             mainFrame.setResizable(false);
  353.             mainFrame.setVisible(true);
  354.         }
  355.    
  356.    
  357.         public static void main(String... args)
  358.         {
  359.             SwingUtilities.invokeLater(new Runnable() {
  360.                 @Override public void run() {
  361.                     createAndShowGUI();
  362.                 }
  363.             });
  364.         }
  365.        
  366.        
  367.         @SuppressWarnings("serial")
  368.         class Grid extends JComponent
  369.         {
  370.             static final int CANVAS_WIDTH = 640;
  371.             static final int CANVAS_HEIGHT = 480;
  372.            
  373.             private final double conversionRatio = 4.0/9.0; // 1080p scaled down to 480p preview
  374.            
  375.             private int squareHeight, squareWidth, numColumns, numRows;
  376.            
  377.            
  378.             public Grid()
  379.             {
  380.                 setOpaque(true);
  381.                 setSize(CANVAS_WIDTH, CANVAS_HEIGHT); // trying to get the size to work properly.
  382.                 setPreferredSize(new Dimension(CANVAS_WIDTH, CANVAS_HEIGHT));
  383.             }
  384.            
  385.             @Override
  386.             public Dimension getPreferredSize()
  387.             {
  388.                 return new Dimension(CANVAS_WIDTH, CANVAS_HEIGHT);
  389.             }
  390.            
  391.             @Override
  392.             public void paintComponent(Graphics g)
  393.             {
  394.                
  395.                 super.paintComponent(g);
  396.                
  397.                 updateVars();
  398.                
  399.                 int k;
  400.                
  401.                 for (k = 0; k < numColumns; k++)
  402.                 {
  403.                     // @param: (x1, y1), (x2, y2)
  404.                     g.drawLine(k * squareWidth, 0, k * squareWidth, CANVAS_HEIGHT);
  405.                 }
  406.                
  407.                 for (k = 0; k < numRows; k++)
  408.                 {
  409.                     g.drawLine(0, k * squareHeight, CANVAS_WIDTH, k * squareHeight);
  410.                 }
  411.             }
  412.            
  413.             public void refresh()
  414.             {
  415.                 // Attempting to set the repaint area to only the grid region
  416.                 // because CTRL+F is free and parameters are not
  417.                 repaint(0, 0, CANVAS_WIDTH, CANVAS_HEIGHT);
  418.             }
  419.            
  420.             public void updateVars()
  421.             {
  422.                 this.squareWidth = (int)(
  423.                         (double)BuildGridGUI.this.widthOfFrames
  424.                         *
  425.                         conversionRatio);
  426.                
  427.                 this.squareHeight = (int)(
  428.                         (double)BuildGridGUI.this.heightOfFrames
  429.                         *
  430.                         conversionRatio);
  431.                
  432.                 this.numColumns = BuildGridGUI.this.numCols;
  433.                
  434.                 this.numRows = (int)(
  435.                         (
  436.                                 (double)BuildGridGUI.this.numFrames
  437.                                 /
  438.                                 numColumns
  439.                         )
  440.                         + 0.5);
  441.             }
  442.            
  443.         }
  444.        
  445.     }
  446.    
  447.    
  448.    
  449.     abstract class GatedChangeListener implements ChangeListener
  450.     {
  451.         private static boolean enabled = true;
  452.        
  453.         public static void setEnabled(boolean enabled)
  454.         {
  455.             GatedChangeListener.enabled = enabled;
  456.         }
  457.        
  458.         protected abstract void onChangedState(ChangeEvent e);
  459.        
  460.         @Override
  461.         public final void stateChanged(ChangeEvent e)
  462.         {
  463.             if(enabled)
  464.                 onChangedState(e);
  465.         }
  466.     }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement