Note that there are some explanatory texts on larger screens.

plurals
  1. PO
    text
    copied!<p>I have got it to work. However, there is a problem. The following lines are causing it to make ALL of my popups (i.e. JPopupMenu, JMenu, etc), scrunched so that you can't really read the titles on them.</p> <p>The following lines seem to be the culprit. </p> <pre><code>BasicComboPopup popup = (BasicComboPopup) this.getAccessibleContext().getAccessibleChild(0); Window popupWindow = SwingUtilities.windowForComponent(popup); Window comboWindow = SwingUtilities.windowForComponent(this); if (comboWindow.equals(popupWindow)) { Component c = popup.getParent(); Dimension d = c.getPreferredSize(); c.setPreferredSize(d); } else { popupWindow.pack(); } </code></pre> <p>What is that bit doing? When I take it out, it gets rid of the error.</p> <pre><code>package addressbook.gui; import javax.swing.JFileChooser; import java.io.File; import javax.swing.JButton; import java.awt.event.ActionListener; import java.awt.event.ActionEvent; import javax.swing.JOptionPane; import javax.swing.JComboBox; import javax.swing.event.DocumentListener; import javax.swing.event.DocumentEvent; import java.awt.BorderLayout; import java.awt.Component; import java.awt.Dimension; import java.awt.EventQueue; import java.awt.Window; import java.awt.event.KeyAdapter; import java.awt.event.KeyEvent; import java.util.ArrayList; import java.util.List; import javax.swing.DefaultComboBoxModel; import javax.swing.JButton; import javax.swing.JComboBox; import javax.swing.JFrame; import javax.swing.JList; import javax.swing.JTextField; import javax.swing.MutableComboBoxModel; import javax.swing.SwingUtilities; import javax.swing.plaf.basic.BasicComboBoxEditor; import javax.swing.plaf.basic.BasicComboBoxRenderer; import javax.swing.plaf.basic.BasicComboPopup; import java.beans.PropertyChangeEvent; import java.beans.PropertyChangeListener; import javax.swing.JPanel; import javax.swing.JCheckBox; import javax.swing.BorderFactory; public class FileChooserWithDelete extends JFileChooser { private String textFieldString; private JIntelligentComboBox comboBox; private DefaultComboBoxModel dcm; private JCheckBox read, write, execute; public FileChooserWithDelete() { super("./"); dcm = new DefaultComboBoxModel(); java.io.File f = getCurrentDirectory(); java.io.File[] files = f.listFiles(); for (int i =0; i &lt; files.length; i++) { dcm.addElement(new Object[] {files[i].getName(), "", 0}); } JButton delete = new JButton("Delete"); delete.setToolTipText("Delete file"); comboBox = new JIntelligentComboBox(dcm); addPropertyChangeListener( new PropertyChangeListener() { public void propertyChange(PropertyChangeEvent evt) { if (JFileChooser.DIRECTORY_CHANGED_PROPERTY.equals(evt.getPropertyName())) { JFileChooser chooser = (JFileChooser) evt.getSource(); java.io.File oldDir = (java.io.File) evt.getOldValue(); java.io.File newDir = (java.io.File) evt.getNewValue(); java.io.File curDir = chooser.getCurrentDirectory(); System.out.println(curDir.getName()); /* //dcm.removeAllElements(); comboBox.removeAllItems(); dcm.removeAllElements(); java.io.File[] moreFiles = curDir.listFiles(); System.out.println("Obama is a loser!"); for (int i =0; i &lt; moreFiles.length; i++) { dcm.addElement(new Object[] {moreFiles[i].getName(), "", 0}); //comboBox.insertItemAt(moreFiles[i].getName(), i); } for (int i =0; i &lt; comboBox.getItemCount(); i++) { System.out.println(java.util.Arrays.toString((Object[]) comboBox.getItemAt(i))); } // comboBox.init(); */ comboBox.updateFiles(); } } }); java.awt.Container cont = (java.awt.Container) (getComponents()[3]); java.awt.Container cont2 = (java.awt.Container) (cont.getComponents()[3]); java.awt.Container cont3 = (java.awt.Container) (cont.getComponents()[0]); read = new JCheckBox("Read"); write = new JCheckBox("Write"); execute = new JCheckBox("Execute"); JPanel checkBoxPanel = new JPanel(); checkBoxPanel.setBorder(BorderFactory.createEtchedBorder(javax.swing.border.EtchedBorder.RAISED)); cont3.remove(1); cont3.add(comboBox, 1); checkBoxPanel.setLayout(new java.awt.FlowLayout()); checkBoxPanel.add(read); checkBoxPanel.add(write); checkBoxPanel.add(execute); read.setEnabled(false); write.setEnabled(false); execute.setEnabled(false); addPropertyChangeListener( new PropertyChangeListener() { public void propertyChange(PropertyChangeEvent e2) { if (JFileChooser.SELECTED_FILE_CHANGED_PROPERTY .equals(e2.getPropertyName())) { JFileChooser chooser = (JFileChooser)e2.getSource(); File oldFile = (File)e2.getOldValue(); File newFile = (File)e2.getNewValue(); // The selected file should always be the same as newFile File curFile = chooser.getSelectedFile(); try { if (curFile.canRead()) { read.setSelected(true); } else { read.setSelected(false); } if (curFile.canWrite()) { write.setSelected(true); } else { write.setSelected(false); } if (curFile.canExecute()) { execute.setSelected(true); } else { execute.setSelected(false); } } catch(NullPointerException npe) { return; } } } }); delete.addActionListener( new ActionListener() { public void actionPerformed(ActionEvent e) { File f= getSelectedFile(); java.awt.Container cont = (java.awt.Container) (getComponents()[3]); java.awt.Container cont2 = (java.awt.Container) (cont.getComponents()[3]); java.awt.Container cont3 = (java.awt.Container) (cont.getComponents()[0]); //javax.swing.JTextField jtf = (javax.swing.JTextField) (cont3.getComponents()[1]); String text = (String) comboBox.getItemAt(0); if (f == null) f = new File("./" + text); int option = JOptionPane.showConfirmDialog(null, "Are you sure you wnat to delete?", "Delete file " + f.getName() + "?", JOptionPane.YES_NO_OPTION, JOptionPane.QUESTION_MESSAGE); if (option == JOptionPane.YES_OPTION) { if (!f.exists() || text == null) { JOptionPane.showMessageDialog(null, "File doesn't exist.", "Could not find file.", JOptionPane.ERROR_MESSAGE); cancelSelection(); } else { f.delete(); cancelSelection(); } } }}); cont2.setLayout(new java.awt.FlowLayout()); //((java.awt.Container) (getComponents()[3])).add(delete); cont2.add(delete); cont2.add(checkBoxPanel); } protected class JIntelligentComboBox extends JComboBox { private List&lt;Object&gt; itemBackup = new ArrayList&lt;Object&gt;(); public JIntelligentComboBox(MutableComboBoxModel aModel) { super(aModel); init(); } private void init() { this.setRenderer(new searchRenderer()); this.setEditor(new searchComboBoxEditor()); this.setEditable(true); int size = this.getModel().getSize(); Object[] tmp = new Object[this.getModel().getSize()]; for (int i = 0; i &lt; size; i++) { tmp[i] = this.getModel().getElementAt(i); itemBackup.add(tmp[i]); } this.removeAllItems(); this.getModel().addElement(new Object[]{"", "", 0}); for (int i = 0; i &lt; tmp.length; i++) { this.getModel().addElement(tmp[i]); } final JTextField jtf = (JTextField) this.getEditor().getEditorComponent(); jtf.addKeyListener( new KeyAdapter() { @Override public void keyReleased(KeyEvent e) { searchAndListEntries(jtf.getText()); } }); } @Override public MutableComboBoxModel getModel() { return (MutableComboBoxModel) super.getModel(); } private void updateFiles() { itemBackup.clear(); java.io.File f = getCurrentDirectory(); java.io.File[] files = f.listFiles(); for (int i =0; i &lt; files.length; i++) { itemBackup.add(new Object[] {files[i].getName(), "", 0}); } } private void searchAndListEntries(Object searchFor) { List&lt;Object&gt; found = new ArrayList&lt;Object&gt;(); for (int i =0; i &lt; itemBackup.size(); i++) { System.out.println(java.util.Arrays.toString((Object[])itemBackup.get(i))); } for (int i = 0; i &lt; this.itemBackup.size(); i++) { Object tmp = this.itemBackup.get(i); if (tmp == null || searchFor == null) { continue; } Object[] o = (Object[]) tmp; String s = (String) o[0]; /* if (s.matches("(?i).*" + searchFor + ".*")) { found.add(new Object[]{ ((Object[]) tmp)[0], searchFor, ((Object[]) tmp)[2] }); } } */ if (s.startsWith((String) searchFor)) found.add(new Object[] {((Object[]) tmp) [0], searchFor, ((Object[]) tmp) [2]});} this.removeAllItems(); this.getModel().addElement(new Object[]{searchFor, searchFor, 0}); for (int i = 0; i &lt; found.size(); i++) { this.getModel().addElement(found.get(i)); } this.setPopupVisible(true); // http://stackoverflow.com/questions/7605995\ /* BasicComboPopup popup = (BasicComboPopup) this.getAccessibleContext().getAccessibleChild(0); Window popupWindow = SwingUtilities.windowForComponent(popup); Window comboWindow = SwingUtilities.windowForComponent(this); if (comboWindow.equals(popupWindow)) { Component c = popup.getParent(); Dimension d = c.getPreferredSize(); c.setPreferredSize(d); } else { popupWindow.pack(); } */ System.out.println("break"); for (int i =0; i &lt; found.size(); i++) { System.out.println(java.util.Arrays.toString((Object[]) found.get(i))); } } class searchRenderer extends BasicComboBoxRenderer { @Override public Component getListCellRendererComponent(JList list, Object value, int index, boolean isSelected, boolean cellHasFocus) { if (index == 0) { setText(""); return this; } Object[] v = (Object[]) value; String s = (String) v[0]; String lowerS = s.toLowerCase(); String sf = (String) v[1]; String lowerSf = sf.toLowerCase(); List&lt;String&gt; notMatching = new ArrayList&lt;String&gt;(); if (!sf.equals("")) { int fs = -1; int lastFs = 0; while ((fs = lowerS.indexOf(lowerSf, (lastFs == 0) ? -1 : lastFs)) &gt; -1) { notMatching.add(s.substring(lastFs, fs)); lastFs = fs + sf.length(); } notMatching.add(s.substring(lastFs)); } String html = ""; if (notMatching.size() &gt; 1) { html = notMatching.get(0); int start = html.length(); int sfl = sf.length(); for (int i = 1; i &lt; notMatching.size(); i++) { String t = notMatching.get(i); html += "&lt;b style=\"color: black;\"&gt;" + s.substring(start, start + sfl) + "&lt;/b&gt;" + t; start += sfl + t.length(); } } this.setText("&lt;html&gt;&lt;head&gt;&lt;/head&gt;&lt;body style=\"color: gray;\"&gt;" + html + "&lt;/body&gt;&lt;/head&gt;"); return this; } } class searchComboBoxEditor extends BasicComboBoxEditor { public searchComboBoxEditor() { super(); } @Override public void setItem(Object anObject) { if (anObject == null) { super.setItem(anObject); } else { Object[] o = (Object[]) anObject; super.setItem(o[0]); } } @Override public Object getItem() { return new Object[]{super.getItem(), super.getItem(), 0}; } } } public JTextField getComboBoxTextField() { final JTextField jtf = (JTextField) comboBox.getEditor().getEditorComponent(); return jtf; } } </code></pre>
 

Querying!

 
Guidance

SQuiL has stopped working due to an internal error.

If you are curious you may find further information in the browser console, which is accessible through the devtools (F12).

Reload