2015-08-27 40 views
1

我想在用户没有选择两个PDF时禁用我的mergeButton。 我会如何去做这件事?我试图做一个while循环来检查file1file2是否为空,但循环没有终止。当用户没有选择文件时,JAVA禁用按钮

package pdfMerge; 

import java.awt.BorderLayout; 
import java.awt.GridLayout; 
import java.awt.event.ActionListener; 
import java.io.File; 
import java.io.IOException; 

import javax.swing.JButton; 
import javax.swing.JFileChooser; 
import javax.swing.JFrame; 
import javax.swing.JPanel; 

import org.apache.pdfbox.exceptions.COSVisitorException; 
import org.apache.pdfbox.pdmodel.PDDocument; 
import org.apache.pdfbox.util.PDFMergerUtility; 

import java.awt.event.*; 


public class pdfMerger extends JFrame { 
    private static final String ActionEvent = null; 
    private JButton choose1, choose2, mergeButton; 
    private JFileChooser fileChooser1, fileChooser2; 
    private JPanel contentsPane; 
    private int returnValue1, returnValue2; 
    private File file1, file2; 
    private String fileName1, fileName2; 
    private boolean valid; 


    public pdfMerger(){ 
     super("PDF Merger"); 
     setLayout(new BorderLayout()); 
     setSize(500, 500); 
     setDefaultCloseOperation(EXIT_ON_CLOSE); 
     addComponents(); 
     addAction(); 
     setVisible(true); 

    } 

    public void addComponents(){ 

     contentsPane = new JPanel(new GridLayout(0, 3)); 
     add(contentsPane, BorderLayout.SOUTH); 

     choose1 = new JButton("Choose 1st pdf"); 
     choose2 = new JButton("Choose 2nd pdf"); 

     mergeButton = new JButton("Merge"); 



     fileChooser1 = new JFileChooser(); 
     fileChooser2 = new JFileChooser(); 

     contentsPane.add(choose1); 
     contentsPane.add(choose2); 
     contentsPane.add(mergeButton); 

    } 

    public void addAction(){ 
     choose1.addActionListener(
       new ActionListener(){ 
        public void actionPerformed(ActionEvent event){ 

           if (event.getSource() == choose1){ 
            returnValue1 = fileChooser1.showOpenDialog(null); 
            if (returnValue1 == JFileChooser.APPROVE_OPTION){ 
             file1 = fileChooser1.getSelectedFile(); 
             fileName1 = file1.toString(); 
             fileName1 = fileName1.replace("\\", "\\\\"); 
             System.out.println(fileName1); 


           } 
          } 
         } 
        } 
     ); 
     choose2.addActionListener(
       new ActionListener(){ 
        public void actionPerformed(ActionEvent event){ 
           if (event.getSource() == choose2){ 
            returnValue2 = fileChooser2.showOpenDialog(null); 
            if (returnValue2 == JFileChooser.APPROVE_OPTION){ 
             file2 = fileChooser2.getSelectedFile(); 
             fileName2 = file2.toString(); 
             fileName2 = fileName2.replace("\\", "\\\\"); 
             System.out.println(fileName2); 
           } 
          } 
         } 
        } 
     ); 

     mergeButton.addActionListener(
       new ActionListener(){ 


        public void actionPerformed(ActionEvent event){ 


         PDFMergerUtility ut = new PDFMergerUtility(); 
         ut.addSource(fileName1); 
         ut.addSource(fileName2); 
         ut.setDestinationFileName("C:\\Users\\Shaheedul\\Desktop\\MergedPDF.pdf"); 
         try { 
          ut.mergeDocuments(); 
         } catch (Exception error){ 
          System.out.println("Something went wrong!"); 
         } 
        } 
       } 
     ); 


    } 
    } 
+0

有许多方法可以做到这一点,但这里是我想尝试:在节目开始禁用mergeButton,只有启用如果同时设置了file1和file2,则从choose1并选择2的动作侦听器。 –

+0

您当前的用户界面不太友好。点击每个“选择”按钮后,您应该显示选定的文件,以便用户可以确认已选择文件。 – camickr

回答

4

简单:设置mergeButton或其行动禁用开始:

mergeButton.setEnabled(false); 

然后在文件选择按钮的动作侦听器,设置启用mergeButton如果2个文件已经被选定。

例如注意到// !!标注主要意见,

// !! class names should begin with upper case letter 
public class PdfMerger extends JFrame { 
    // ... 
    private JButton choose1, choose2, mergeButton; 
    // ... 

    public PdfMerger() { 
     super("PDF Merger"); 
     setLayout(new BorderLayout()); 
     setSize(500, 500); // advise against this 
     setDefaultCloseOperation(EXIT_ON_CLOSE); 
     addComponents(); 
     addAction(); 
     setVisible(true); 

     // !! 
     mergeButton.setEnabled(false); 
    } 

    // ... 

    public void addAction() { 
     choose1.addActionListener(new ActionListener() { 
      public void actionPerformed(ActionEvent event) { 

       if (event.getSource() == choose1) { 
        returnValue1 = fileChooser1.showOpenDialog(null); 
        if (returnValue1 == JFileChooser.APPROVE_OPTION) { 
         file1 = fileChooser1.getSelectedFile(); 
         fileName1 = file1.toString(); 
         fileName1 = fileName1.replace("\\", "\\\\"); 
         System.out.println(fileName1); 

         // !! added 
         mergeButton.setEnabled(bothFilesChosen()); 
        } 
       } 
      } 
     }); 
     choose2.addActionListener(new ActionListener() { 
      public void actionPerformed(ActionEvent event) { 
       if (event.getSource() == choose2) { 
        returnValue2 = fileChooser2.showOpenDialog(null); 
        if (returnValue2 == JFileChooser.APPROVE_OPTION) { 
         file2 = fileChooser2.getSelectedFile(); 
         fileName2 = file2.toString(); 
         fileName2 = fileName2.replace("\\", "\\\\"); 
         System.out.println(fileName2); 

         // !! added 
         mergeButton.setEnabled(bothFilesChosen()); 
        } 
       } 
      } 
     }); 

     // .... 

    } 

    // !! 
    private boolean bothFilesChosen() { 
     return (file1 != null && file1.exists() && file2 != null && file2.exists()); 
    } 
} 
4

那么,当你有一个选择按钮,你也许应该显示在Swing组件所选择的文件,使用户有一个视觉线索已被选中哪些文件。如果您不显示该值,用户如何知道他们点击了两个按钮?另外,如果“合并”按钮被禁用,用户如何知道哪个“选择”按钮单击以启用合并按钮?

因此,在这种情况下,您可以使用不可编辑的文本字段。然后,您可以为每个文本字段添加DocumentListener。无论何时在任何一个字段中更改文字,然后检查是否启用/禁用“合并”按钮。

下面是这种方法的一个例子:

import java.awt.*; 
import java.awt.event.*; 
import java.util.List; 
import java.util.ArrayList; 
import javax.swing.*; 
import javax.swing.event.*; 

public class DataEntered implements DocumentListener 
{ 
    private JButton button; 
    private List<JTextField> textFields = new ArrayList<JTextField>(); 

    public DataEntered(JButton button) 
    { 
     this.button = button; 
    } 

    public void addTextField(JTextField textField) 
    { 
     textFields.add(textField); 
     textField.getDocument().addDocumentListener(this); 
    } 

    public boolean isDataEntered() 
    { 
     for (JTextField textField : textFields) 
     { 
      if (textField.getText().trim().length() == 0) 
       return false; 
     } 

     return true; 
    } 

    @Override 
    public void insertUpdate(DocumentEvent e) 
    { 
     checkData(); 
    } 

    @Override 
    public void removeUpdate(DocumentEvent e) 
    { 
     checkData(); 
    } 

    @Override 
    public void changedUpdate(DocumentEvent e) {} 

    private void checkData() 
    { 
     button.setEnabled(isDataEntered()); 
    } 

    private static void createAndShowUI() 
    { 
     JButton submit = new JButton("Submit"); 
     submit.setEnabled(false); 

     JTextField textField1 = new JTextField(10); 
     JTextField textField2 = new JTextField(10); 

     DataEntered de = new DataEntered(submit); 
     de.addTextField(textField1); 
     de.addTextField(textField2); 

     JFrame frame = new JFrame("SSCCE"); 
     frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); 
     frame.add(textField1, BorderLayout.WEST); 
     frame.add(textField2, BorderLayout.EAST); 
     frame.add(submit, BorderLayout.SOUTH); 
     frame.pack(); 
     frame.setLocationByPlatform(true); 
     frame.setVisible(true); 
    } 

    public static void main(String[] args) 
    { 
     EventQueue.invokeLater(new Runnable() 
     { 
      public void run() 
      { 
       createAndShowUI(); 
      } 
     }); 
    } 
} 
相关问题