Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- package com.example;
- import com.jidesoft.document.DocumentComponent;
- import com.jidesoft.document.DocumentPane;
- import com.jidesoft.grid.JideTable;
- import com.jidesoft.grid.TableModelWrapperUtils;
- import com.jidesoft.grid.TextFieldCellEditor;
- import com.jidesoft.swing.JideTabbedPane;
- import javax.swing.*;
- import javax.swing.table.DefaultTableModel;
- import java.awt.*;
- import java.awt.event.ActionEvent;
- import java.math.BigDecimal;
- import java.util.Random;
- /**
- * Dependends on:
- * com.jidesoft:jide-grids:3.5.1
- * com.jidesoft:jide-components:3.5.1
- * com.jidesoft:jide-common:3.5.1
- */
- public class ModalPopupFailure {
- public static void main(String[] args) {
- turnOnVerboseDebug();
- JFrame frame = new JFrame();
- frame.setTitle("test");
- frame.setDefaultCloseOperation(WindowConstants.EXIT_ON_CLOSE);
- JComponent panel = new ModalPopupFailure().buildPanel();
- frame.setContentPane(panel);
- frame.setBounds(450, 300, 700, 500);
- frame.setVisible(true);
- }
- private static void turnOnVerboseDebug() {
- Toolkit.getDefaultToolkit().getSystemEventQueue().push(new TimedEventQueue());
- }
- /**
- * @return Table editor panel
- */
- private JPanel tableTab() {
- JPanel result = new JPanel(new BorderLayout());
- DefaultTableModel model = new DefaultTableModel(1, 1);
- model.setValueAt(new BigDecimal(0L), 0, 0);
- JideTable table = new JideTable(model);
- table.putClientProperty("terminateEditOnFocusLost", Boolean.TRUE);
- final int actualCol0 = TableModelWrapperUtils.getActualColumnAt(table.getModel(), 0);
- CustomCellEditor bdce = new CustomCellEditor(Integer.class);
- table.getColumnModel().getColumn(actualCol0).setCellEditor(bdce);
- result.add(table, BorderLayout.CENTER);
- return result;
- }
- /**
- * @return Main panel with tabs
- */
- private JComponent buildPanel() {
- JPanel mainPanel = new JPanel(new BorderLayout());
- final DocumentPane documentPane = new DocumentPane();
- DocumentComponent dc1 = new DocumentComponent(new JLabel("tab1 label"), "aaa");
- documentPane.openDocument(dc1);
- DocumentComponent dc2 = new DocumentComponent(tableTab(), "TABLETAB");
- documentPane.openDocument(dc2);
- documentPane.setActiveDocument("TABLETAB");
- documentPane.setTabbedPaneCustomizer(new DocumentPane.TabbedPaneCustomizer() {
- @Override
- public void customize(final JideTabbedPane tabbedPane) {
- tabbedPane.setShowCloseButton(true);
- tabbedPane.setUseDefaultShowCloseButtonOnTab(false);
- tabbedPane.setShowCloseButtonOnTab(true);
- }
- });
- documentPane.setTabPlacement(SwingConstants.TOP);
- mainPanel.add(documentPane, BorderLayout.CENTER);
- mainPanel.add(new JButton(new AbstractAction("New tab") {
- @Override
- public void actionPerformed(ActionEvent e) {
- Integer randInt = new Random().nextInt();
- DocumentComponent newdc = new DocumentComponent(
- new JLabel("Generated tab label " + randInt),
- Integer.toString(randInt));
- documentPane.openDocument(newdc);
- }
- }),
- BorderLayout.NORTH);
- JLabel decription = new JLabel("<html>Steps to reproduce:<br />" +
- "TABLETAB should be the last tab<br />" +
- "The \"correct\" value for cell editor is 777.<br />" +
- "Enter any \"incorrect\" number, then close any tab standing before TABLETAB.<br />" +
- "An exception caused by window repaint should be raised by now.<br />" +
- "If dialog would not be modal, there would be no window repaint triggered</html>");
- mainPanel.add(decription, BorderLayout.SOUTH);
- return mainPanel;
- }
- private class CustomCellEditor extends TextFieldCellEditor {
- boolean firstTime = true;
- public CustomCellEditor(Class<?> aClass) {
- super(aClass);
- _textField.setInputVerifier(new InputVerifier() {
- @Override
- public boolean verify(JComponent input) {
- boolean valid = "777".equals(_textField.getText());
- if (valid) return true;
- final JDialog dialog = new JDialog();
- dialog.setTitle("Exception expected");
- dialog.setContentPane(new JLabel("<html>If one of previous tabs was closed, an exception should be raised by now.</html>"));
- dialog.setLocationRelativeTo(null);
- dialog.setModal(true); // Switching to false seems to fix the problem
- dialog.setSize(new Dimension(300, 100));
- dialog.setVisible(true);
- return true;
- }
- });
- }
- @Override
- public boolean stopCellEditing() {
- System.out.println("Stopping cell edit " + new Random().nextInt() + "in edt: " + SwingUtilities.isEventDispatchThread());
- if (firstTime) {
- firstTime = false;
- return false;
- }
- return _textField.getInputVerifier().shouldYieldFocus(_textField) && super.stopCellEditing();
- }
- }
- static class TimedEventQueue extends EventQueue {
- @Override
- protected void dispatchEvent(AWTEvent event) {
- long startNano = System.nanoTime();
- super.dispatchEvent(event);
- long endNano = System.nanoTime();
- //if (endNano - startNano > 50)
- System.out.println("DISPATCHED EVENT: " + ((endNano - startNano) / 1000000) + "ms: " + event);
- }
- @Override
- public AWTEvent peekEvent() {
- AWTEvent ret = super.peekEvent();
- System.out.println("PEEK EVENT: " + ret);
- return ret;
- }
- @Override
- public AWTEvent peekEvent(int id) {
- AWTEvent ret = super.peekEvent(id);
- System.out.println("PEEK EVENT BY ID: " + ret);
- return ret;
- }
- @Override
- public void push(EventQueue newEventQueue) {
- System.out.println("PUSHING QUEUE " + newEventQueue);
- super.push(newEventQueue);
- }
- }
- }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement