已引用的问题 “how to restrict Joptionpane message dialog box prompting once for the Condition?”
我的代码可能是一个基本完成的 GUI 程序。 我的代码是显示 Jfilechooser 选择的目录中的文件。
文件将以复选框的形式出现在框架中。问题是我将文件放入带有复选框的数组列表中,并尝试将其显示在框架上。
但问题是我无法在文本区域中创建这些文件,因为我无法在文本区域内获取组件。
因此文件(复选框)在面板中被粉碎。
我尝试应用滚动 Pane 以将其放入框架中并查看它。但我卡在某个地方,无法将滚动 Pane 应用于数组列表。
欢迎任何建议。 我需要在可视区域访问这些文件(复选框)。
我总共有 1000 多个文件。所以我需要将它们放入滚动 Pane 中进行查看和选择。 (有时,当我读取 2000 多个文件时,GUI 会卡住)不知道为什么?
类似于我需要的示例输出。
full code below:
package latestprojectswing;
import java.awt.Dimension;
import java.awt.Font;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.io.File;
import java.util.ArrayList;
import java.util.Iterator;
import javax.swing.JButton;
import javax.swing.JCheckBox;
import javax.swing.JFileChooser;
import javax.swing.JFrame;
import javax.swing.JLabel;
import javax.swing.JOptionPane;
import javax.swing.JPanel;
import javax.swing.JScrollBar;
import javax.swing.JScrollPane;
import javax.swing.JTextArea;
import javax.swing.JTextField;
import javax.swing.ScrollPaneConstants;
public class latestswingpgm3 extends Thread implements ActionListener
{
JFrame frame;
JPanel panel;
JTextField tf,text,tf1;
JTextArea ta,text1;
JLabel lab1;
String str;
JScrollBar scrol;
JScrollPane scrollPane;
File fl;
private JCheckBox chckbxSelectAll;
private JCheckBox chckbxf1;
private JTextField textField;
private JLabel lblSourceFolderfiles;
private JButton btnChoosedirectoryfrom;
private JButton btnDisplay;
private JLabel lblListFilesBelow;
private JScrollPane jScrollPane1;
ArrayList<JCheckBox> aL = new ArrayList<JCheckBox>();
int selectedCounter = 0;
int y=100;
JPanel contentPane;
String outputDir;
latestswingpgm3()
{
frame = new JFrame( "Search box" );
frame.getContentPane().setLayout( null );
frame.setSize( 820, 700 );
panel = new JPanel();
panel.setBounds( 25, 90, 750, 400 );
//panel.setLayout(null);
//panel.setBounds( 25, 90, 750, 400 );
scrollPane = new JScrollPane( panel );
scrollPane.setHorizontalScrollBarPolicy(JScrollPane.HORIZONTAL_SCROLLBAR_AS_NEEDED);
scrollPane.setVerticalScrollBarPolicy(JScrollPane.VERTICAL_SCROLLBAR_ALWAYS);
//scrollPane.setBounds( 25, 90, 750, 300 );
scrollPane.setPreferredSize(new Dimension(500, 300));
//panel.setVisible(true);
scrollPane.setVisible(true);
frame.add(panel);
frame.add(scrollPane);
tf = new JTextField();
tf.setBounds( 25, 50, 750, 40 );
tf.setFont( new Font( "Latha", Font.BOLD, 20 ) );
tf.setHorizontalAlignment( JTextField.CENTER );
frame.getContentPane().add( tf );
chckbxSelectAll = new JCheckBox("Select All");
chckbxSelectAll.setBounds(25, 557, 97, 23);
frame.getContentPane().add(chckbxSelectAll);
chckbxSelectAll.addActionListener(new ActionListener() {
public void actionPerformed(ActionEvent e) {
Iterator<JCheckBox> i = aL.iterator();
while(i.hasNext()) {
JCheckBox tmp = i.next();
if(chckbxSelectAll.isSelected()) {
tmp.doClick();
} else {
tmp.setSelected(false);
selectedCounter -= 1;
if(selectedCounter < 0) {
selectedCounter = 0;
}
textField.setText(Integer.toString(selectedCounter));
}
}
}
});
JButton btnGenerate = new JButton("Generate");
btnGenerate.addActionListener(new ActionListener() {
public void actionPerformed(ActionEvent e) {
Iterator<JCheckBox> i = aL.iterator();
while(i.hasNext()) {
JCheckBox tmp = i.next();
//scroll adder
jScrollPane1 = new JScrollPane(frame);
jScrollPane1.add(tmp);
jScrollPane1.revalidate();
if(tmp.isSelected()) {
String filepathNName = tf.getText() +"\\"+ tmp.getText();
//filepathNName = System.getProperty("path.separator");
String filename = tmp.getText();
System.out.println("filename = " + filename);
System.out.println("filepaname = " + filepathNName);
System.out.println("outputDir = " + outputDir);
boolean success = latestex1.exlCreator(filepathNName, outputDir, filename);
if(success) {
JOptionPane.showMessageDialog(null, "Successfully Completed. Pls refer to the path " + outputDir + " for output files");
} else {
JOptionPane.showMessageDialog(null, "OOPS. Some Error!!!");
}
}
}
}
});
btnGenerate.setBounds(316, 604, 89, 23);
frame.getContentPane().add(btnGenerate);
textField = new JTextField();
textField.setBounds(268, 558, 86, 20);
frame.getContentPane().add(textField);
textField.setColumns(10);
JLabel lblNoOfFiles = new JLabel("NO of Files Selected");
lblNoOfFiles.setBounds(141, 561, 139, 14);
frame.getContentPane().add(lblNoOfFiles);
JLabel lblDestinationFolderTo = new JLabel("Destination PathTo Generate Files");
lblDestinationFolderTo.setBounds(553, 561, 226, 14);
frame.getContentPane().add(lblDestinationFolderTo);
JButton btnBrowse = new JButton("Browse");
btnBrowse.addActionListener(new ActionListener() {
public void actionPerformed(ActionEvent arg0) {
JFileChooser chooser = new JFileChooser();
chooser.setFileSelectionMode(JFileChooser.FILES_AND_DIRECTORIES);
int returnVal = chooser.showOpenDialog(frame);
if(returnVal == JFileChooser.APPROVE_OPTION) {
str = chooser.getSelectedFile().getAbsolutePath();
}
if ( str != null && !str.trim().equals( "" ) )
{
tf1.setText( str );
outputDir = str;
// Enable the search button
//btnDisplay.setEnabled( true );
}
else
{
//btnDisplay.setEnabled( false );
}
}
});
btnBrowse.setBounds(553, 583, 89, 23);
frame.getContentPane().add(btnBrowse);
tf1 = new JTextField();
tf1.setBounds( 553, 620, 400, 30 );
tf1.setFont( new Font( "Latha", Font.BOLD, 20 ) );
frame.getContentPane().add( tf1 );
lblSourceFolderfiles = new JLabel("Source Folder/ Files");
lblSourceFolderfiles.setBounds(6, 17, 138, 14);
frame.getContentPane().add(lblSourceFolderfiles);
btnChoosedirectoryfrom = new JButton("ChooseDirectory From");
btnChoosedirectoryfrom.addActionListener(this);
btnChoosedirectoryfrom.setBounds(141, 9, 170, 30);
frame.getContentPane().add(btnChoosedirectoryfrom);
btnDisplay = new JButton("Select To Display");
btnDisplay.setEnabled(false);
btnDisplay.setBounds(534, 9, 180, 30);
btnDisplay.addActionListener( this );
frame.getContentPane().add(btnDisplay);
lblListFilesBelow = new JLabel("List files Below to choose ");
lblListFilesBelow.setBounds(344, 17, 180, 14);
frame.getContentPane().add(lblListFilesBelow);
frame.setVisible( true );
frame.setDefaultCloseOperation( JFrame.EXIT_ON_CLOSE );
}
public void actionPerformed( ActionEvent ae )
{
if ( ae.getActionCommand().equals( "ChooseDirectory From" ) )
{
JFileChooser chooser = new JFileChooser();
chooser.setFileSelectionMode(JFileChooser.FILES_AND_DIRECTORIES);
int returnVal = chooser.showOpenDialog(frame);
if(returnVal == JFileChooser.APPROVE_OPTION) {
str = chooser.getSelectedFile().getAbsolutePath();
}
if ( str != null && !str.trim().equals( "" ) )
{
tf.setText( str );
// Enable the search button
btnDisplay.setEnabled( true );
}
else
{
btnDisplay.setEnabled( false );
}
}
if ( ae.getActionCommand().equals( "Select To Display" ) )
{
if(aL!=null) {
Iterator<JCheckBox> i = aL.iterator();
while(i.hasNext()) {
panel.remove(i.next());
}
selectedCounter = 0;
textField.setText(Integer.toString(selectedCounter));
}
fl = new File( str );
File[] flist = fl.listFiles();
for ( int i = 0; i < flist.length; i++ )
{
if ( flist[i].isFile() )
{
final JCheckBox cb1 = new JCheckBox(flist[i].getName());
scrollPane.add(cb1);
panel.add(cb1);
cb1.setBounds(25, y, 200, 25);
cb1.setFont(new Font( "Latha", Font.BOLD, 20 ));
cb1.addActionListener(new ActionListener() {
public void actionPerformed(ActionEvent e){
if(cb1.isSelected()) {
selectedCounter += 1;
} else {
selectedCounter -= 1;
if(selectedCounter < 0) {
selectedCounter = 0;
}
}
textField.setText(Integer.toString(selectedCounter));
}
});
aL.add(cb1);
panel.add(cb1);
y+=30;
}
}
}
}
public static void main( String args[] )
{
new latestswingpgm3();
}
}
最佳答案
您有几个问题:
使用
JTable
在用于表格数据的JScrollPane
中。避免阻止 event dispatch thread ,它会卡住 GUI,使用
SwingWorker
在后台执行文件 I/O ;显示了完整的示例 here .要为每行获取一个复选框,请确保第一列的类型为
Boolean.class
。 default editor and renderer将为您管理复选框;显示了完整的示例 here .
关于java - 如何在java SWING面板中添加Scrollable(滚动条组件)复选框?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/35427546/