![](/img/trans.png)
[英]ArrayIndexOutOfBoundsException with ActionListener in JList
[英]Using ActionListener w/ JList & static Arrays
今天,我再次為您正在工作的項目尋求幫助/支持。 現在,我已經創建了一個GUI,允許用戶上傳“ ach”格式的文件。 (這只是具有特定格式的文本文件)。 上傳后,該程序將使用緩沖的閱讀器將文本行分成四個可能的JList。 在每個文本文件中,最多有四個“批頭”(以5開頭的數字),以及任意數量的“條目詳細信息”(以6開頭的數字)。 ach文件可能如下所示:
500000000000000000001
600000000000000000001
600000000000000000002
600000000000000000003
555555555555555555551
622222222222222222221
622222222222222222223
622222222222222222224
因此,第一個“五個”數字和后面的所有“六個”將是“批處理一個”並顯示在第一個JList中,第二個“五個”數字和后面的所有“六個”將顯示在第二個JList中。 在這種情況下,其他兩個JList將為空,因為只有兩個批處理。
現在這是我要完成的工作:
一旦用戶上傳了文件並填充了字段(我已經成功完成了),用戶就需要能夠單擊列表中“六個”數字之一。 一旦他們單擊它,JOptionsPane將詢問他們原因碼。 這是我的第一個問題,如何實現監聽器。 由於JList字段是使用字符串數組填充的,該字符串數組稍后會在程序中使用緩沖讀取器進行填充,因此我不確定如何完成此操作。
我現在不會關注第二個問題,因為我專注於此。 下面是我的代碼,任何幫助將不勝感激!
package nacha;
import java.awt.*;
import java.awt.event.MouseAdapter;
import java.awt.event.MouseEvent;
import java.awt.event.MouseListener;
import java.io.BufferedReader;
import java.io.BufferedWriter;
import java.io.FileReader;
import java.io.FileWriter;
import java.io.IOException;
import java.util.ArrayList;
import javax.swing.BorderFactory;
import javax.swing.JButton;
import javax.swing.JFileChooser;
import javax.swing.JFrame;
import javax.swing.JLabel;
import javax.swing.JList;
import javax.swing.JScrollPane;
import javax.swing.ListSelectionModel;
import javax.swing.SwingConstants;
import javax.swing.UIManager;
import javax.swing.border.Border;
import javax.swing.filechooser.FileNameExtensionFilter;
public class NachaVersion3
{
final static boolean RIGHT_TO_LEFT = false;
final static boolean shouldFill = true;
final static boolean shouldWeightX = true;
static int entryDetailCountOne;
static int entryDetailCountTwo;
static int entryDetailCountThree;
static int entryDetailCountFour;
static String batchHeaderDisplayOne=" ";
static String batchHeaderDisplayTwo=" ";
static String batchHeaderDisplayThree=" ";
static String batchHeaderDisplayFour=" ";
static ArrayList<String> entryDetailListGUI = new ArrayList<String>();
static ArrayList<String> entryDetailList = new ArrayList<String>();
static ArrayList<String> entryDetailList2 = new ArrayList<String>();
static ArrayList<String> entryDetailList3 = new ArrayList<String>();
static ArrayList<String> entryDetailList4 = new ArrayList<String>();
public static void addComponentsToPane(Container pane){
if (RIGHT_TO_LEFT){
pane.setComponentOrientation(ComponentOrientation.RIGHT_TO_LEFT);
}
Border border = BorderFactory.createRaisedBevelBorder();
JButton submit;
JLabel labelTitle;
JLabel labelEntryDetailHeader1;
JLabel labelEntryDetailHeader2;
JLabel labelEntryDetailHeader3;
JLabel labelEntryDetailHeader4;
final JList listEntryDetail1;
JList listEntryDetail2;
JList listEntryDetail3;
JList listEntryDetail4;
pane.setLayout(new GridBagLayout());
GridBagConstraints c = new GridBagConstraints();
if (shouldFill){
c.fill = GridBagConstraints.HORIZONTAL;
}
labelTitle = new JLabel("ACH File Converter");
labelTitle.setBorder(border);
labelTitle.setFont(new java.awt.Font("Arial", Font.BOLD, 60));
labelTitle.setHorizontalAlignment(SwingConstants.CENTER);
c.fill = GridBagConstraints.HORIZONTAL;
c.gridwidth=3;
c.gridx=0;
c.gridy=0;
pane.add(labelTitle, c);
labelEntryDetailHeader1 = new JLabel("Entry Detail Files Under Header: "+batchHeaderDisplayOne.substring(0,50));
labelEntryDetailHeader1.setBorder(border);
labelEntryDetailHeader1.setFont(new java.awt.Font("Arial", Font.LAYOUT_LEFT_TO_RIGHT, 14));
c.fill=GridBagConstraints.HORIZONTAL;
c.gridwidth=1;
c.gridx=0;
c.gridy=1;
pane.add(labelEntryDetailHeader1, c);
labelEntryDetailHeader2 = new JLabel("Entry Detail Files Under Header: "+batchHeaderDisplayTwo.substring(0,50));
labelEntryDetailHeader2.setBorder(border);
labelEntryDetailHeader2.setFont(new java.awt.Font("Arial", Font.LAYOUT_LEFT_TO_RIGHT, 14));
c.fill=GridBagConstraints.HORIZONTAL;
c.gridwidth=1;
c.gridx=1;
c.gridy=1;
pane.add(labelEntryDetailHeader2, c);
listEntryDetail1 = new JList(entryDetailList.toArray());
listEntryDetail1.setBorder(border);
listEntryDetail1.setSelectionMode(ListSelectionModel.SINGLE_INTERVAL_SELECTION);
listEntryDetail1.setLayoutOrientation(JList.VERTICAL);
listEntryDetail1.setVisibleRowCount(10);
listEntryDetail1.setSize(200,200);
c.fill = GridBagConstraints.HORIZONTAL;
c.gridwidth=1;
c.gridx=0;
c.gridy=2;
JScrollPane scrollPane1 = new JScrollPane(listEntryDetail1);
pane.add(scrollPane1, c);
listEntryDetail2 = new JList(entryDetailList2.toArray());
listEntryDetail2.setBorder(border);
listEntryDetail2.setSelectionMode(ListSelectionModel.SINGLE_INTERVAL_SELECTION);
listEntryDetail2.setLayoutOrientation(JList.VERTICAL);
listEntryDetail2.setVisibleRowCount(10);
listEntryDetail2.setSize(200,200);
c.fill = GridBagConstraints.HORIZONTAL;
c.gridwidth=1;
c.gridx=1;
c.gridy=2;
JScrollPane scrollPane2 = new JScrollPane(listEntryDetail2);
pane.add(scrollPane2, c);
labelEntryDetailHeader3 = new JLabel("Entry Detail Files Under Header: "+batchHeaderDisplayThree.substring(0,50));
labelEntryDetailHeader3.setBorder(border);
labelEntryDetailHeader3.setFont(new java.awt.Font("Arial", Font.LAYOUT_LEFT_TO_RIGHT, 14));
c.fill=GridBagConstraints.HORIZONTAL;
c.gridwidth=1;
c.gridx=0;
c.gridy=3;
pane.add(labelEntryDetailHeader3, c);
labelEntryDetailHeader4 = new JLabel("Entry Detail Files Under Header: "+batchHeaderDisplayFour.substring(0,50));
labelEntryDetailHeader4.setBorder(border);
labelEntryDetailHeader4.setFont(new java.awt.Font("Arial", Font.LAYOUT_LEFT_TO_RIGHT, 14));
c.fill=GridBagConstraints.HORIZONTAL;
c.gridwidth=1;
c.gridx=1;
c.gridy=3;
pane.add(labelEntryDetailHeader4, c);
listEntryDetail3 = new JList(entryDetailList3.toArray());
listEntryDetail3.setBorder(border);
listEntryDetail3.setSelectionMode(ListSelectionModel.SINGLE_INTERVAL_SELECTION);
listEntryDetail3.setLayoutOrientation(JList.VERTICAL);
listEntryDetail3.setVisibleRowCount(10);
listEntryDetail3.setSize(200,200);
c.fill = GridBagConstraints.HORIZONTAL;
c.gridwidth=1;
c.gridx=0;
c.gridy=4;
JScrollPane scrollPane3 = new JScrollPane(listEntryDetail3);
pane.add(scrollPane3, c);
listEntryDetail4 = new JList(entryDetailList4.toArray());
listEntryDetail4.setBorder(border);
listEntryDetail4.setSelectionMode(ListSelectionModel.SINGLE_INTERVAL_SELECTION);
listEntryDetail4.setLayoutOrientation(JList.VERTICAL);
listEntryDetail4.setVisibleRowCount(10);
listEntryDetail4.setSize(200,200);
c.fill = GridBagConstraints.HORIZONTAL;
c.gridwidth=1;
c.gridx=1;
c.gridy=4;
JScrollPane scrollPane4 = new JScrollPane(listEntryDetail4);
pane.add(scrollPane4, c);
submit = new JButton("Submit");
submit.setFont(new java.awt.Font("Arial", Font.BOLD, 40));
submit.setHorizontalAlignment(SwingConstants.CENTER);
submit.setVerticalAlignment(SwingConstants.CENTER);
c.fill = GridBagConstraints.HORIZONTAL;
c.gridwidth=2;
c.gridheight=8;
c.gridx=0;
c.gridy=5;
c.ipady=153;
pane.add(submit,c);
}
private static void createAndShowGUI(){
JFrame frame = new JFrame("ACH File Converter");
frame.setSize(500,500);
frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
addComponentsToPane(frame.getContentPane());
frame.pack();
frame.setVisible(true);
}
public static void main(String args[]){
BufferedReader br = null;
BufferedWriter bw = null;
int countFive = 0;
ArrayList<String> batchHeaderList = new ArrayList<String>();
JFileChooser chooser = new JFileChooser();
UIManager.put("ScrollPane.background", Color.BLACK);
FileNameExtensionFilter filter = new FileNameExtensionFilter("ACH Files", "ach");
chooser.setFileFilter(filter);
chooser.setDialogTitle("Please choose ACH file to upload");
int returnVal = chooser.showOpenDialog(chooser);
if(returnVal == JFileChooser.APPROVE_OPTION)
{
try{
String sCurrentLine;
br = new BufferedReader(new FileReader(chooser.getSelectedFile()));
bw = new BufferedWriter(new FileWriter(chooser.getCurrentDirectory()+"//NachaOutput.ACH"));
while((sCurrentLine = br.readLine()) !=null)
{
if (sCurrentLine.startsWith("5")){
batchHeaderList.add(sCurrentLine);
countFive++;
if (countFive == 1){
batchHeaderDisplayOne=sCurrentLine;
}else if (countFive ==2 ){
batchHeaderDisplayTwo=sCurrentLine;
}else if (countFive == 3){
batchHeaderDisplayThree=sCurrentLine;
}else if (countFive == 4){
batchHeaderDisplayFour=sCurrentLine;
}
}else if (sCurrentLine.startsWith("6") && countFive==1){
entryDetailList.add(sCurrentLine);
}else if (sCurrentLine.startsWith("6") && countFive==2){
entryDetailList2.add(sCurrentLine);
}else if (sCurrentLine.startsWith("6") && countFive==3){
entryDetailList3.add(sCurrentLine);
}
}
} catch (IOException e){
e.printStackTrace();
} finally {
try {
br.close();
bw.close();
} catch (IOException e){
e.printStackTrace();
}
}
javax.swing.SwingUtilities.invokeLater(new Runnable(){
public void run(){
createAndShowGUI();
}
});
}
}
}
如果您想測試此代碼以幫助我,則需要從上方復制並粘貼ACH示例文本到文本文件中,並將其另存為.ACH。
那是我的第一個問題:如何實現監聽器。
向每個需要一個JList
添加一個ListSelectionListener
。 在處理程序中,您可以根據選擇自定義原因代碼列表。 然后,在模式對話框中請求相關的原因代碼,如從對話框中獲取用戶的輸入所示。
listEntryDetail.getSelectionModel().addListSelectionListener(new ListSelectionListener() {
@Override
public void valueChanged(ListSelectionEvent e) {
…
String code = (String)JOptionPane.showInputDialog(…);
…
}
});
另請參見如何編寫列表選擇偵聽器以及這些示例 。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.