Я пишу программу, позволяющую пользователю выбрать файл 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;
}
}