• Home
  • Features
  • Pricing
  • Docs
  • Announcements
  • Sign In

jiangxincode / ApkToolBoxGUI / #1162

06 Sep 2025 02:20AM UTC coverage: 2.955% (-0.001%) from 2.956%
#1162

push

jiangxincode
[Feature]Simplify the persist of some Swing Components 2

0 of 4 new or added lines in 3 files covered. (0.0%)

1 existing line in 1 file now uncovered.

248 of 8392 relevant lines covered (2.96%)

0.03 hits per line

Source File
Press 'n' to go to next uncovered line, 'b' for previous

0.0
/src/main/java/edu/jiangxin/apktoolbox/swing/extend/filepanel/FilePanel.java
1
package edu.jiangxin.apktoolbox.swing.extend.filepanel;
2

3
import edu.jiangxin.apktoolbox.utils.Constants;
4
import edu.jiangxin.apktoolbox.utils.FileUtils;
5
import org.apache.commons.lang3.ArrayUtils;
6
import org.apache.commons.lang3.StringUtils;
7
import org.apache.logging.log4j.LogManager;
8
import org.apache.logging.log4j.Logger;
9

10
import javax.swing.*;
11
import javax.swing.filechooser.FileNameExtensionFilter;
12
import java.awt.*;
13
import java.awt.datatransfer.DataFlavor;
14
import java.awt.datatransfer.Transferable;
15
import java.awt.datatransfer.UnsupportedFlavorException;
16
import java.awt.event.ActionEvent;
17
import java.awt.event.ActionListener;
18
import java.io.File;
19
import java.io.IOException;
20
import java.util.List;
21

22
public class FilePanel extends JPanel {
23
    private static final Logger LOGGER = LogManager.getLogger(FilePanel.class.getSimpleName());
×
24
    private JTextField fileTextField;
25

26
    private String buttonText;
27

28
    private String currentDirectoryPath = ".";
×
29

30
    private int fileSelectionMode = JFileChooser.FILES_ONLY;
×
31

32
    private String description;
33

34
    private String[] extensions;
35

36
    private JFileChooser fileChooser;
37

38
    private IFileReadyCallback callback;
39

40
    public FilePanel(String buttonText) {
41
        super();
×
42
        fileChooser = new JFileChooser();
×
43
        this.buttonText = buttonText;
×
44
        initUI();
×
45
    }
×
46

47
    public void setCurrentDirectoryPath(String currentDirectoryPath) {
48
        this.currentDirectoryPath = currentDirectoryPath;
×
49
    }
×
50

51
    public void setPersistentKey(String persistentKey) {
NEW
52
        fileTextField.setName(persistentKey);
×
NEW
53
    }
×
54

55
    public void setFileReadyCallback(IFileReadyCallback callback) {
56
        this.callback = callback;
×
57
    }
×
58

59
    public void setFileSelectionMode(int fileSelectionMode) {
60
        this.fileSelectionMode = fileSelectionMode;
×
61
    }
×
62

63
    public void setDescriptionAndFileExtensions(String description, String[] extensions) {
64
        this.description = description;
×
65
        this.extensions = extensions;
×
66
        if (StringUtils.isNotEmpty(description) || (ArrayUtils.isNotEmpty(extensions))) {
×
67
            FileNameExtensionFilter filter = new FileNameExtensionFilter(description, extensions);
×
68
            if (fileChooser != null) {
×
69
                fileChooser.resetChoosableFileFilters();
×
70
                fileChooser.addChoosableFileFilter(filter);
×
71
                fileChooser.setAcceptAllFileFilterUsed(false);
×
72
            }
73
        } else {
×
74
            if (fileChooser != null) {
×
75
                fileChooser.resetChoosableFileFilters();
×
76
                fileChooser.setAcceptAllFileFilterUsed(true);
×
77
            }
78
        }
79
    }
×
80

81
    private void initUI() {
82
        setLayout(new BoxLayout(this, BoxLayout.X_AXIS));
×
83

84
        fileTextField = new JTextField();
×
85
        fileTextField.setPreferredSize(new Dimension(600, 30));
×
86
        fileTextField.setMaximumSize(new Dimension(1200, 30));
×
87
        fileTextField.setTransferHandler(new FileTransferHandler());
×
88

89
        JButton chooseButton = new JButton(buttonText);
×
90
        chooseButton.addActionListener(new OpenDictionaryFileActionListener());
×
91

92
        add(fileTextField);
×
93
        add(Box.createHorizontalStrut(Constants.DEFAULT_X_BORDER));
×
94
        add(chooseButton);
×
95
    }
×
96

97
    public File getFile() {
98
        return new File(fileTextField.getText());
×
99
    }
100

101
    class OpenDictionaryFileActionListener implements ActionListener {
×
102
        @Override
103
        public void actionPerformed(ActionEvent e) {
104
            fileChooser.setCurrentDirectory(new File(currentDirectoryPath));
×
105
            fileChooser.setFileSelectionMode(fileSelectionMode);
×
106
            fileChooser.setMultiSelectionEnabled(false);
×
107
            if (StringUtils.isNotEmpty(description) || (ArrayUtils.isNotEmpty(extensions))) {
×
108
                FileNameExtensionFilter filter = new FileNameExtensionFilter(description, extensions);
×
109
                fileChooser.addChoosableFileFilter(filter);
×
110
                fileChooser.setAcceptAllFileFilterUsed(false);
×
111
            } else {
×
112
                fileChooser.resetChoosableFileFilters();
×
113
                fileChooser.setAcceptAllFileFilterUsed(true);
×
114
            }
115
            int returnVal = fileChooser.showOpenDialog(FilePanel.this);
×
116
            if (returnVal == JFileChooser.APPROVE_OPTION) {
×
117
                File selectedFile = fileChooser.getSelectedFile();
×
118
                fileTextField.setText(FileUtils.getCanonicalPathQuiet(selectedFile));
×
119
                if (callback != null) {
×
120
                    callback.onFileReady(selectedFile);
×
121
                }
122
            }
123
        }
×
124
    }
125

126
    class FileTransferHandler extends TransferHandler {
127
        public FileTransferHandler() {
×
128
        }
×
129

130
        @Override
131
        public boolean importData(JComponent comp, Transferable t) {
132
            List<File> files = null;
×
133
            try {
134
                files = (List<File>) t.getTransferData(DataFlavor.javaFileListFlavor);
×
135
            } catch (IOException e) {
×
136
                LOGGER.error("importData failed: IOException");
×
137
            } catch (UnsupportedFlavorException e) {
×
138
                LOGGER.error("importData failed: UnsupportedFlavorException");
×
139
            }
×
140
            if (files == null || files.size() != 1) {
×
141
                LOGGER.error("importData failed: getTransferData failed");
×
142
                return false;
×
143
            }
144
            File file = files.get(0);
×
145
            if ((!file.isFile() && fileSelectionMode == JFileChooser.FILES_ONLY)
×
146
                    ||(!file.isDirectory() && fileSelectionMode == JFileChooser.DIRECTORIES_ONLY)) {
×
147
                LOGGER.error("importData failed: fileSelectionMode is not match");
×
148
                return false;
×
149
            }
150
            fileTextField.setText(FileUtils.getCanonicalPathQuiet(file));
×
151
            if (callback != null) {
×
152
                callback.onFileReady(file);
×
153
            }
154
            return true;
×
155
        }
156

157
        @Override
158
        public boolean canImport(JComponent jComponent, DataFlavor[] dataFlavors) {
159
            for (DataFlavor dataFlavor : dataFlavors) {
×
160
                if (DataFlavor.javaFileListFlavor.equals(dataFlavor)) {
×
161
                    return true;
×
162
                }
163
            }
164
            return false;
×
165
        }
166
    }
167
}
STATUS · Troubleshooting · Open an Issue · Sales · Support · CAREERS · ENTERPRISE · START FREE · SCHEDULE DEMO
ANNOUNCEMENTS · TWITTER · TOS & SLA · Supported CI Services · What's a CI service? · Automated Testing

© 2026 Coveralls, Inc