繁体   English   中英

如何将ActionListeners添加到模式JDialog?

[英]How to add ActionListeners to a modal JDialog?

我想创建一个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);做同样的事情setModal(true); ,听众停止工作。

如何在不损失侦听器功能的情况下使JDialog成为模态?

简单的解决方案:当JDialog是模式对话框时,则setVisible()阻止当前线程,即Dialog的Constructor。 因此,从不添加侦听器(实际上仅在关闭对话框时)。 因此没有事件。

解决方案:设置“ setVisible(true);” 到CTOR的尽头

顺便说一句,您不应在CTOR中进行模式锁定,而应使用额外的方法,例如“ void showTheDialog();”。 更好。 如果您从一开始就这样做,那么侦听器将一直在那儿,并且一切都会起作用;-)编辑:或使用类似Factory方法的方法,那会更好。

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

我认为这可能会引起问题:

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

为什么要创建一个新的JFrame ,您必须指定一个现有的。

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM