Советы по отображению переменных графических панелей на основе ввода пользователя в предыдущей панели - PullRequest
1 голос
/ 05 марта 2012

Я пишу программу, позволяющую пользователю выбрать файл csv с различным количеством столбцов и заголовков столбцов, выбрать столбцы из файла csv, которые он хочет построить, и, наконец, построить график.Интерфейс для этого представляет собой графический интерфейс, который отображает три шага, код для которых приведен ниже.Моя проблема заключается в том, что панель для «шага 2» может отображаться только после того, как пользователь выбрал файл, поскольку число столбцов в файле CSV может меняться, а флажки для выбора заголовков столбцов соответственно изменяются.

В настоящее время я смотрю на подходы для последовательного отображения панелей.В идеале я хотел бы сохранить графический интерфейс, как он выглядит в настоящее время.Я кратко прочитал об использовании компонентных слушателей, но я не уверен, что они подходят для того, что мне нужно, вот пример, на который я смотрел: ComponentEventDemo

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

Любой совет по подходящему подходу к этой проблеме будет отличным.Спасибо!

package dynamicgui;

import java.awt.event.*;
import static javax.swing.GroupLayout.Alignment.*;
import java.awt.*;
import java.awt.event.ActionListener;
import java.io.File;
import java.util.ArrayList;
import javax.swing.*;

public class Attempt2GUI extends JPanel {//{
    //  implements ItemListener{

    public javax.swing.JFileChooser fc;
    //public JFileChooser fc;// = new JFileChooser(); 
    JFrame frame = new JFrame();
    JPanel panel1 = new JPanel(); //setp 1 panel
    JPanel panel2 = new JPanel(); //setp 2
    JPanel panel3 = new JPanel(); //step 3
    public String[] checkBoxNames = {"open", "close", "high", "low", "max",
        "today", "yesterday", "tomorrow", "lowest", "min"};

    public void setupGUI() {

        GroupLayout p1layout = new GroupLayout(panel1);
        panel1.setLayout(p1layout);
        //      panel1.addComponentListener(this);
        p1layout.setAutoCreateGaps(true);
        p1layout.setAutoCreateContainerGaps(true);

        GroupLayout p2layout = new GroupLayout(panel2);
        panel2.setLayout(p2layout);
        //     panel2.addComponentListener(this);
        p2layout.setAutoCreateGaps(true);
        p2layout.setAutoCreateContainerGaps(true);

        GroupLayout p3layout = new GroupLayout(panel3);
        panel3.setLayout(p3layout);
        //     panel3.addComponentListener(this);
        p3layout.setAutoCreateGaps(true);
        p3layout.setAutoCreateContainerGaps(true);


        //CONTENTS OF TOP PANEL
        JLabel step1 = new JLabel("Step 1:");
        step1.setFont(new java.awt.Font("Tahoma", 1, 11));
        step1.setHorizontalAlignment(javax.swing.SwingConstants.TRAILING);

        JLabel inst1 = new JLabel("Select the file you use for this program.");

        JButton fileChooseBtn = new JButton("Select File");

        fileChooseBtn.addActionListener(new ActionListener() {

            public void actionPerformed(java.awt.event.ActionEvent evt) {
                fileChooseBtnActionPerformed(evt);
            }
        });

        JButton toStep2Btn = new JButton("Next Step");
        //       toStep2Btn.addComponentListener(this);
        toStep2Btn.setActionCommand("toStep2");


        fc = new javax.swing.JFileChooser();
        //note: 'fc' is the public file chooser 

        JSeparator p1lineBreak = new JSeparator();

        //CONTENTS OF SECOND PANEL
        JLabel step2 = new JLabel("Step 2:");
        step2.setFont(new java.awt.Font("Tahoma", 1, 11)); // NOI18N
        step2.setHorizontalAlignment(javax.swing.SwingConstants.TRAILING);

        JLabel inst2 = new JLabel("Select the title of the columns you wish to plot.");


        System.out.println("checkBoxNames length = " + checkBoxNames.length);

        System.out.println("length / 4 = " + checkBoxNames.length / 4);
        System.out.println("length % 4 = " + checkBoxNames.length % 4);


        JCheckBox[] checkBox;// = new JCheckBox[checkBoxNames.length];
        checkBox = new JCheckBox[checkBoxNames.length];

        JButton toStep3Btn = new JButton("Next Step");

        JSeparator p2lineBreak = new JSeparator();

        //CONTENTS OF THIRD PANEL
        JLabel step3 = new JLabel("Step :3");
        step3.setFont(new java.awt.Font("Tahoma", 1, 11)); // NOI18N
        step3.setHorizontalAlignment(javax.swing.SwingConstants.TRAILING);

        JLabel inst3 = new JLabel("Plot the Graph.");

        JButton plotBtn = new JButton("Plot Graph");

        plotBtn.addActionListener(new java.awt.event.ActionListener() {

            public void actionPerformed(java.awt.event.ActionEvent evt) {
                graphBtnActionPerformed(evt);
            }
        });

        //***************************************************************        
        //----------------LAYOUT PANELS-------------------------------
        //***************************************************************

        //TOP PANEL - panel to choose file to use
        //horizonttal layout
        GroupLayout.ParallelGroup p1withSeparator = p1layout.createParallelGroup(LEADING);
        GroupLayout.SequentialGroup p1leftToRight = p1layout.createSequentialGroup();
        p1leftToRight.addComponent(step1);
        GroupLayout.ParallelGroup p1rightColumn = p1layout.createParallelGroup(LEADING);
        p1rightColumn.addComponent(inst1);
        p1rightColumn.addComponent(fileChooseBtn);
        p1rightColumn.addComponent(toStep2Btn);
        p1leftToRight.addGroup(p1rightColumn);
        p1withSeparator.addGroup(p1leftToRight);
        p1withSeparator.addGap(17, 17, 17);
        p1withSeparator.addComponent(p1lineBreak);

        p1layout.setHorizontalGroup(p1withSeparator);

        //vertical layout
        GroupLayout.SequentialGroup p1topToBottom = p1layout.createSequentialGroup();
        GroupLayout.ParallelGroup p1topRow = p1layout.createParallelGroup(BASELINE);
        p1topRow.addComponent(step1);
        p1topRow.addComponent(inst1);
        p1topToBottom.addGroup(p1topRow);
        p1topToBottom.addComponent(fileChooseBtn);
        p1topToBottom.addComponent(toStep2Btn);
        p1topToBottom.addGap(20, 20, 20);
        p1topToBottom.addComponent(p1lineBreak);

        p1layout.setVerticalGroup(p1topToBottom);

        //    panel1.addComponentListener(this);

        //***********************************************************************
        //---------SECOND PANEL - checkboxes for column titles
        //***********************************************************************        

        //horiszontal layout - before dynamic
        GroupLayout.ParallelGroup p2withSeparatorH = p2layout.createParallelGroup(LEADING);
        GroupLayout.SequentialGroup p2leftToRight = p2layout.createSequentialGroup();
        p2leftToRight.addComponent(step2);
        GroupLayout.ParallelGroup p2rightColumnH = p2layout.createParallelGroup(LEADING);
        p2rightColumnH.addComponent(inst2);

        //vertical group - before dynamic             

        GroupLayout.SequentialGroup p2withSeparatorV = p2layout.createSequentialGroup();
        GroupLayout.ParallelGroup p2topToBottom = p2layout.createParallelGroup(BASELINE);
        p2topToBottom.addComponent(step2);
        GroupLayout.SequentialGroup p2rightColumnV = p2layout.createSequentialGroup();
        p2rightColumnV.addComponent(inst2);

        //add dynamic - both horizontal and vertical 
        if (checkBoxNames.length > 0) {
            int rows = checkBoxNames.length / 4; //change '4' to alter num boxes from left to right
            int remainder = checkBoxNames.length % 4;

            if (rows > 0 || remainder > 0) {
                GroupLayout.SequentialGroup boxesLeftToRightH = p2layout.createSequentialGroup();
                GroupLayout.ParallelGroup boxesTopToBottomV = p2layout.createParallelGroup();
                GroupLayout.ParallelGroup column1H = p2layout.createParallelGroup();
                GroupLayout.ParallelGroup column2H = p2layout.createParallelGroup();
                GroupLayout.ParallelGroup column3H = p2layout.createParallelGroup();
                GroupLayout.ParallelGroup column4H = p2layout.createParallelGroup();

                GroupLayout.SequentialGroup column1V = p2layout.createSequentialGroup();
                GroupLayout.SequentialGroup column2V = p2layout.createSequentialGroup();
                GroupLayout.SequentialGroup column3V = p2layout.createSequentialGroup();
                GroupLayout.SequentialGroup column4V = p2layout.createSequentialGroup();

                if ((rows > 1) || (rows == 1 && remainder > 0)) {

                    for (int c = 0; c < 4; c++) {
                        //cycle through each of the 4columns, change '4' to alter num boxes from left to right
                        for (int i = c; i < checkBoxNames.length - remainder; i = i + 4) {
                            //change '4' to alter num boxes from left to right
                            checkBox[i] = new JCheckBox(checkBoxNames[i]);
                            JCheckBox cb = new JCheckBox(checkBoxNames[i]);
                            cb.addItemListener(new MyCheckBoxListener());
                            //  cb.setActionCommand(checkBoxNames[i]);

                            switch (c) {
                                case 0:
                                    column1H.addComponent(cb);
                                    column1V.addComponent(cb);
                                    break;
                                case 1:
                                    column2H.addComponent(cb);
                                    column2V.addComponent(cb);
                                    break;
                                case 2:
                                    column3H.addComponent(cb);
                                    column3V.addComponent(cb);
                                    break;
                                case 3:
                                    column4H.addComponent(cb);
                                    column4V.addComponent(cb);
                                    break;
                            }
                        }
                        if (remainder - c > 0) {
                            checkBox[checkBoxNames.length - (remainder - c)] = new JCheckBox(
                                checkBoxNames[checkBoxNames.length - (remainder - c)]);
                            JCheckBox cb = new JCheckBox(checkBoxNames[checkBoxNames.length - (remainder - c)]);
                            cb.addItemListener(new MyCheckBoxListener());
                            //   cb.setActionCommand(checkBoxNames[c]);
                            switch (c) {
                                case 0:
                                    column1H.addComponent(cb);
                                    column1V.addComponent(cb);
                                    break;
                                case 1:
                                    column2H.addComponent(cb);
                                    column2V.addComponent(cb);
                                    break;
                                case 2:
                                    column3H.addComponent(cb);
                                    column3V.addComponent(cb);
                                    break;
                                case 3:
                                    column4H.addComponent(cb);
                                    column4V.addComponent(cb);
                                    break;
                            }
                        }
                    }
                }

                if (rows == 0 && remainder > 0) {
                    for (int i = 0; i < checkBoxNames.length; i++) {
                        //change '4' to alter num boxes from left to right

                        if (remainder - i > 0) {
                            checkBox[checkBoxNames.length - (remainder - i)] = new JCheckBox(
                                checkBoxNames[checkBoxNames.length - (remainder - i)]);
                            JCheckBox cb = new JCheckBox(checkBoxNames[checkBoxNames.length - (remainder - i)]);
                            cb.addItemListener(new MyCheckBoxListener());
                            //     cb.setActionCommand(checkBoxNames[i]);
                            switch (i) {
                                case 0:
                                    column1H.addComponent(cb);
                                    column1V.addComponent(cb);
                                    break;
                                case 1:
                                    column2H.addComponent(cb);
                                    column2V.addComponent(cb);
                                    break;
                                case 2:
                                    column3H.addComponent(cb);
                                    column3V.addComponent(cb);
                                    break;
                                case 3:
                                    column4H.addComponent(cb);
                                    column4V.addComponent(cb);
                                    break;
                            }
                        }
                    }
                }

                boxesLeftToRightH.addGroup(column1H);
                boxesLeftToRightH.addGroup(column2H);
                boxesLeftToRightH.addGroup(column3H);
                boxesLeftToRightH.addGroup(column4H);

                boxesTopToBottomV.addGroup(column1V);
                boxesTopToBottomV.addGroup(column2V);
                boxesTopToBottomV.addGroup(column3V);
                boxesTopToBottomV.addGroup(column4V);

                p2rightColumnH.addGroup(boxesLeftToRightH);
                p2rightColumnV.addGroup(boxesTopToBottomV);

            }

        }// end if length >0  


        //add horizonatal - after dygnamic    
        p2rightColumnH.addComponent(toStep3Btn);
        p2leftToRight.addGroup(p2rightColumnH);
        p2withSeparatorH.addGroup(p2leftToRight);
        p2withSeparatorH.addGap(17, 17, 17);
        p2withSeparatorH.addComponent(p2lineBreak);
        p2layout.setHorizontalGroup(p2withSeparatorH);

        //add vertical - after dynamic
        p2rightColumnV.addComponent(toStep3Btn);
        p2topToBottom.addGroup(p2rightColumnV);
        p2withSeparatorV.addGroup(p2topToBottom);
        p2withSeparatorV.addGap(20, 20, 20);
        p2withSeparatorV.addComponent(p2lineBreak);
        p2layout.setVerticalGroup(p2withSeparatorV);

        //   panel2.addComponentListener(this);


        //***********************************************************************        
        //------------BOTTOM PANEL - panel that plots the graphs-----------------
        //***********************************************************************

        //horizontal layout
        GroupLayout.SequentialGroup p3leftToRight = p3layout.createSequentialGroup();
        p3leftToRight.addComponent(step3);
        GroupLayout.ParallelGroup p3rightColumn = p3layout.createParallelGroup(LEADING);
        p3rightColumn.addComponent(inst3);
        p3rightColumn.addComponent(plotBtn);
        p3leftToRight.addGroup(p3rightColumn);

        p3layout.setHorizontalGroup(p3leftToRight);

        //vertical layout
        GroupLayout.SequentialGroup p3topToBottom = p3layout.createSequentialGroup();
        GroupLayout.ParallelGroup p3topRow = p3layout.createParallelGroup(BASELINE);
        p3topRow.addComponent(step3);
        p3topRow.addComponent(inst3);
        p3topToBottom.addGroup(p3topRow);
        p3topToBottom.addComponent(plotBtn);
        p3layout.setVerticalGroup(p3topToBottom);



        //***************************************************************        
        //----------------ADD PANELS TO MAIN PANEL-------------------------------
        //***************************************************************


        /*  
        frame.getContentPane().setLayout(new GridLayout(3,0));
        frame.getContentPane().add(panel1);
        frame.getContentPane().add(panel2);
        frame.getContentPane().add(panel3);

        frame.pack();
        frame.setVisible(true);


         * 
         */

    }//end setupGUI

    public void addToFrame() {

        Attempt2GUI a2g = new Attempt2GUI();

        //   a2g.setupGUI();

        frame.setTitle("Plot Graph");
        frame.setDefaultCloseOperation(WindowConstants.EXIT_ON_CLOSE);

        frame.getContentPane().setLayout(new GridLayout(3, 0));
        frame.getContentPane().add(panel1);
        frame.getContentPane().add(panel2);
        frame.getContentPane().add(panel3);

        frame.pack();
        frame.setVisible(true);
    }
    /*
     * for the select file button to open file chooser window
     */
    private static String selFilepath = "XXX";

    private void fileChooseBtnActionPerformed(ActionEvent evt) {

        System.out.println("the filepath before file selected is " + selFilepath);
        // Show open dialog; this method does not return until the dialog is closed
        fc.showOpenDialog(this);
        File selFile = fc.getSelectedFile();
        selFilepath = selFile.getAbsolutePath();

        System.out.println("the file selected is " + selFile);
        System.out.println("the file selected in string form is " + selFilepath);
    }

    /*
     * the filepath will be passed to the reader class
     */
    public String getFilepath() {
        return selFilepath;
    }

    /*
     * set the second panel visible
     *
    private void toStep2BtnActionPerformed(ActionEvent evt) {

    if("toStep2".equals(evt.getActionCommand())){
    panel2.setVisible(true);

    //Need to revalidate and repaint, or else the panel
    //will probably be drawn in the wrong place.
    panel2.revalidate();
    panel2.repaint();
    }
    }

    /*
     * set the third panel visible
     *
    private void toStep3BtnActionPerformed(ActionEvent evt) {
    throw new UnsupportedOperationException("Not yet implemented");

    }


    /*
     * call in the graph class 
     */
    private void graphBtnActionPerformed(ActionEvent evt) {
    }

    public static void main(String[] args) {

        try {
            UIManager.setLookAndFeel(
                UIManager.getSystemLookAndFeelClassName());

        } catch (ClassNotFoundException ex) {
            java.util.logging.Logger.getLogger(MyGUI.class.getName()).log(java.util.logging.Level.SEVERE, null, ex);
        } catch (InstantiationException ex) {
            java.util.logging.Logger.getLogger(MyGUI.class.getName()).log(java.util.logging.Level.SEVERE, null, ex);
        } catch (IllegalAccessException ex) {
            java.util.logging.Logger.getLogger(MyGUI.class.getName()).log(java.util.logging.Level.SEVERE, null, ex);
        } catch (javax.swing.UnsupportedLookAndFeelException ex) {
            java.util.logging.Logger.getLogger(MyGUI.class.getName()).log(java.util.logging.Level.SEVERE, null, ex);
        }

        Attempt2GUI a2 = new Attempt2GUI();
        a2.setupGUI();
        a2.addToFrame();

        System.out.println("filepath is " + a2.getFilepath());
        a2.getFilepath();

        //    mmg.getSelectedBoxes();
    }

    /*
     * keep running total of all checkboxes selected
     */
    public static ArrayList<Integer> selected = new ArrayList<Integer>();

    public int[] addSelectedBoxes(int index) {

        selected.add(index);

        for (int i = 0; i < selected.size(); i++) {
            System.out.println("selected list in lineGUI is " + selected.get(i));
        }

        int[] selectedBoxes = {1, 2, 3};
        return selectedBoxes;
    }
}//end class lineGUI

/*
 * handle the itemLIstener on the checkboxes 
 */
class MyCheckBoxListener implements java.awt.event.ItemListener {

    ComponentGUI lg = new ComponentGUI();
    String[] boxes = lg.checkBoxNames;
    ArrayList<Integer> selectedList = new ArrayList<Integer>();
    /*
     * tdentify the selected boxes and return an array of the indexes of these boxes
     * to be used by the gui to plot each in the selected list series selected
     */

    @Override
    public void itemStateChanged(ItemEvent ie) {

        for (int i = 0; i < boxes.length; i++) {
            if (ie.getItem().toString().endsWith("text=" + boxes[i] + "]")) {
                selectedList.add(i);
                lg.addSelectedBoxes(i);
            }
        }

        int[] selectedArray = new int[selectedList.size()];

        for (int i = 0; i < selectedList.size(); i++) {
            selectedArray[i] = selectedList.get(i);
        }

        for (int i = 0; i < selectedArray.length; i++) {
            System.out.println("box selected = " + selectedArray[i]);
            System.out.println("selectedList = " + selectedList.get(i));
        }
    }

    public ArrayList<Integer> getNewBoxTick() {
        return selectedList;
    }
}

1 Ответ

1 голос
/ 05 марта 2012

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

Я свернул собственную реализацию мастера, и это было не слишком сложно. Вот несколько советов о том, как это можно сделать:

  • создать диалоговое окно мастера, имеющее 3 области: список шагов, элементы управления фактическим шагом и кнопки для навигации по шагам
  • при переходе к предыдущему / следующему шагу вы можете сделать следующее:
    • обновить кнопки «назад / вперед» в соответствии с позицией в списке шагов
    • выполнить «следующее» действие или откатить предыдущее действие, если необходимо.
    • заменить элементы управления шагом (если у вас есть панель для каждого шага, просто замените панель)

Возможно, вы захотите создать базовый класс для шагов мастера, который предоставляет общие данные, такие как next или откат , описание / имя шага, панель управления шагами и т. Д.

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...