0

我想创建一个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 模式?

4

3 回答 3

3

简单的解决方法:当JDialog是modal时,setVisible()阻塞当前线程,即Dialog的Constructor。因此,永远不会添加侦听器(实际上仅在关闭对话框时)。因此没有事件。

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

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

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

于 2013-01-04T12:58:37.710 回答
2
于 2013-01-04T13:03:32.423 回答
2

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

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

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

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

于 2013-01-04T12:47:55.743 回答