如何将ActionListeners添加到模态JDialog?

时间:2013-01-04 12:22:31

标签: java swing jtable modal-dialog actionlistener

我想创建一个响应鼠标和键操作的JDialog。该对话框包含一个jTable,我希望他选择一条记录。他应该能够通过双击或按键(例如“2”)来选择它。

所以我从这开始:

public showDialog(TableModel model) {
    super(new JFrame(), "Please select a record..."); 
    table = new JTable(model);

    //add JTable with ScrollPane
    JScrollPane scrollPane = new JScrollPane();
    scrollPane.setPreferredSize(new Dimension(800, Math.min(table.getPreferredSize().height+60, 800)));
    scrollPane.getViewport().add(table);
    add(scrollPane);

    //display
    setAlwaysOnTop(true);
    toFront();
    pack();
    setVisible(true);

    //mouse
    table.addMouseListener(new MouseAdapter() {
        @Override
        public void mouseClicked(java.awt.event.MouseEvent evt) {
            System.out.println("clicked");
        }
    });

    //keys
    table.addKeyListener(new KeyAdapter() {

        @Override
        public void keyTyped(java.awt.event.KeyEvent evt) {}

        @Override
        public void keyReleased(java.awt.event.KeyEvent evt) {}

        @Override
        public void keyPressed(java.awt.event.KeyEvent evt) {
            System.out.println(evt.getKeyChar() + " pressed");
        }
    });
}

这完美无缺。

但是,如果我对语句setModal(true);做同样的事情,那么听众就会停止工作。

如何在不失去听众功能的情况下制作JDialog模式?

3 个答案:

答案 0 :(得分:3)

简单解决方案:当JDialog是模态的时,setVisible()会阻塞当前线程,即Dialog的构造函数。因此,从不添加监听器(实际上仅在关闭对话框时)。因此没有事件。

解决方案:设置'setVisible(true);'到CTOR结束

顺便说一句,你不应该在CTOR中进行模态锁定,有一个额外的方法,比如'void showTheDialog();'更好。 如果你从一开始就这样做了,那么听众就会在那里,一切都会奏效;-) 编辑:或者使用像Factory方法那样的东西,甚至更好。

顺便说一下,请坚持命名约定,花了我10秒的时间来弄清楚'public showDialog(TableModel model){'你没有忘记方法返回类型但是这实际上是CTOR本身: - )

答案 1 :(得分:2)

我认为这可能会导致问题:

super(new JFrame(), "Please select a record...");

为什么要创建新的JFrame,您必须指定现有的。{/ p>

顺便说一句,你应该在你的类的构造函数中调用super JDialog,而不是其他方法。

答案 2 :(得分:2)