Advertisement
antonovm-esc

index out of bounds with modal dialog and documentpane

Oct 10th, 2016
159
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
Java 6.54 KB | None | 0 0
  1. package com.example;
  2.  
  3. import com.jidesoft.document.DocumentComponent;
  4. import com.jidesoft.document.DocumentPane;
  5. import com.jidesoft.grid.JideTable;
  6. import com.jidesoft.grid.TableModelWrapperUtils;
  7. import com.jidesoft.grid.TextFieldCellEditor;
  8. import com.jidesoft.swing.JideTabbedPane;
  9.  
  10. import javax.swing.*;
  11. import javax.swing.table.DefaultTableModel;
  12. import java.awt.*;
  13. import java.awt.event.ActionEvent;
  14. import java.math.BigDecimal;
  15. import java.util.Random;
  16.  
  17. /**
  18.  * Dependends on:
  19.  * com.jidesoft:jide-grids:3.5.1
  20.  * com.jidesoft:jide-components:3.5.1
  21.  * com.jidesoft:jide-common:3.5.1
  22.  */
  23. public class ModalPopupFailure {
  24.  
  25.     public static void main(String[] args) {
  26.         turnOnVerboseDebug();
  27.  
  28.         JFrame frame = new JFrame();
  29.         frame.setTitle("test");
  30.         frame.setDefaultCloseOperation(WindowConstants.EXIT_ON_CLOSE);
  31.         JComponent panel = new ModalPopupFailure().buildPanel();
  32.         frame.setContentPane(panel);
  33.         frame.setBounds(450, 300, 700, 500);
  34.         frame.setVisible(true);
  35.     }
  36.  
  37.     private static void turnOnVerboseDebug() {
  38.         Toolkit.getDefaultToolkit().getSystemEventQueue().push(new TimedEventQueue());
  39.     }
  40.  
  41.     /**
  42.      * @return Table editor panel
  43.      */
  44.     private JPanel tableTab() {
  45.         JPanel result = new JPanel(new BorderLayout());
  46.  
  47.         DefaultTableModel model = new DefaultTableModel(1, 1);
  48.         model.setValueAt(new BigDecimal(0L), 0, 0);
  49.         JideTable table = new JideTable(model);
  50.         table.putClientProperty("terminateEditOnFocusLost", Boolean.TRUE);
  51.  
  52.         final int actualCol0 = TableModelWrapperUtils.getActualColumnAt(table.getModel(), 0);
  53.         CustomCellEditor bdce = new CustomCellEditor(Integer.class);
  54.         table.getColumnModel().getColumn(actualCol0).setCellEditor(bdce);
  55.  
  56.         result.add(table, BorderLayout.CENTER);
  57.         return result;
  58.     }
  59.  
  60.     /**
  61.      * @return Main panel with tabs
  62.      */
  63.     private JComponent buildPanel() {
  64.         JPanel mainPanel = new JPanel(new BorderLayout());
  65.  
  66.         final DocumentPane documentPane = new DocumentPane();
  67.  
  68.         DocumentComponent dc1 = new DocumentComponent(new JLabel("tab1 label"), "aaa");
  69.         documentPane.openDocument(dc1);
  70.  
  71.         DocumentComponent dc2 = new DocumentComponent(tableTab(), "TABLETAB");
  72.         documentPane.openDocument(dc2);
  73.         documentPane.setActiveDocument("TABLETAB");
  74.  
  75.         documentPane.setTabbedPaneCustomizer(new DocumentPane.TabbedPaneCustomizer() {
  76.             @Override
  77.             public void customize(final JideTabbedPane tabbedPane) {
  78.                 tabbedPane.setShowCloseButton(true);
  79.                 tabbedPane.setUseDefaultShowCloseButtonOnTab(false);
  80.                 tabbedPane.setShowCloseButtonOnTab(true);
  81.             }
  82.         });
  83.  
  84.         documentPane.setTabPlacement(SwingConstants.TOP);
  85.  
  86.         mainPanel.add(documentPane, BorderLayout.CENTER);
  87.         mainPanel.add(new JButton(new AbstractAction("New tab") {
  88.                     @Override
  89.                     public void actionPerformed(ActionEvent e) {
  90.                         Integer randInt = new Random().nextInt();
  91.                         DocumentComponent newdc = new DocumentComponent(
  92.                                 new JLabel("Generated tab label " + randInt),
  93.                                 Integer.toString(randInt));
  94.  
  95.                         documentPane.openDocument(newdc);
  96.                     }
  97.                 }),
  98.                 BorderLayout.NORTH);
  99.         JLabel decription = new JLabel("<html>Steps to reproduce:<br />" +
  100.                 "TABLETAB should be the last tab<br />" +
  101.                 "The \"correct\" value for cell editor is 777.<br />" +
  102.                 "Enter any \"incorrect\" number, then close any tab standing before TABLETAB.<br />" +
  103.                 "An exception caused by window repaint should be raised by now.<br />" +
  104.                 "If dialog would not be modal, there would be no window repaint triggered</html>");
  105.         mainPanel.add(decription, BorderLayout.SOUTH);
  106.  
  107.         return mainPanel;
  108.     }
  109.  
  110.     private class CustomCellEditor extends TextFieldCellEditor {
  111.  
  112.         boolean firstTime = true;
  113.  
  114.         public CustomCellEditor(Class<?> aClass) {
  115.             super(aClass);
  116.             _textField.setInputVerifier(new InputVerifier() {
  117.                 @Override
  118.                 public boolean verify(JComponent input) {
  119.                     boolean valid = "777".equals(_textField.getText());
  120.                     if (valid) return true;
  121.  
  122.                     final JDialog dialog = new JDialog();
  123.                     dialog.setTitle("Exception expected");
  124.                     dialog.setContentPane(new JLabel("<html>If one of previous tabs was closed, an exception should be raised by now.</html>"));
  125.                     dialog.setLocationRelativeTo(null);
  126.  
  127.                     dialog.setModal(true); // Switching to false seems to fix the problem
  128.  
  129.                     dialog.setSize(new Dimension(300, 100));
  130.                     dialog.setVisible(true);
  131.  
  132.                     return true;
  133.                 }
  134.             });
  135.         }
  136.  
  137.         @Override
  138.         public boolean stopCellEditing() {
  139.             System.out.println("Stopping cell edit " + new Random().nextInt() + "in edt: " + SwingUtilities.isEventDispatchThread());
  140.             if (firstTime) {
  141.                 firstTime = false;
  142.                 return false;
  143.             }
  144.  
  145.             return _textField.getInputVerifier().shouldYieldFocus(_textField) && super.stopCellEditing();
  146.         }
  147.     }
  148.  
  149.     static class TimedEventQueue extends EventQueue {
  150.         @Override
  151.         protected void dispatchEvent(AWTEvent event) {
  152.             long startNano = System.nanoTime();
  153.             super.dispatchEvent(event);
  154.             long endNano = System.nanoTime();
  155.  
  156.             //if (endNano - startNano > 50)
  157.             System.out.println("DISPATCHED EVENT: " + ((endNano - startNano) / 1000000) + "ms: " + event);
  158.         }
  159.  
  160.         @Override
  161.         public AWTEvent peekEvent() {
  162.             AWTEvent ret = super.peekEvent();
  163.             System.out.println("PEEK EVENT: " + ret);
  164.             return ret;
  165.         }
  166.  
  167.         @Override
  168.         public AWTEvent peekEvent(int id) {
  169.             AWTEvent ret = super.peekEvent(id);
  170.             System.out.println("PEEK EVENT BY ID: " + ret);
  171.             return ret;
  172.         }
  173.  
  174.         @Override
  175.         public void push(EventQueue newEventQueue) {
  176.             System.out.println("PUSHING QUEUE " + newEventQueue);
  177.             super.push(newEventQueue);
  178.         }
  179.     }
  180. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement