【问题标题】:JButton does not open JDialogJButton 不打开 JDialog
【发布时间】:2017-01-19 15:10:41
【问题描述】:

我正在构建一个简单的程序。我有一个从 JDialog 扩展的类和从 JFrame 扩展的类,并且是应用程序的 GUI。我实现了 ActionListener,它应该在单击 JButton 后打开对话框。但是什么也没发生,我不知道为什么。

图形界面

    package nemocnice_sam;

import java.awt.BorderLayout;
import java.awt.FlowLayout;
import java.awt.HeadlessException;
import java.awt.ScrollPane;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;

import javax.swing.JButton;
import javax.swing.JFrame;
import javax.swing.JPanel;
import javax.swing.JScrollPane;
import javax.swing.JTable;

public class App extends JFrame {

    JTable tbl = new JTable();
    JButton pridejPacienta = new JButton("Přidej pacienta");
    JButton smazPacienta = new JButton("Smaž pacienta");
    JButton export = new JButton("Export");
    JButton konec = new JButton("Konec");
    JPanel panel = new JPanel();

    PacientDialog novyPacient;

    ActionListener al = new ActionListener() {

        @Override
        public void actionPerformed(ActionEvent e) {

            if(e.getSource() == pridejPacienta){
                novyPacient = new PacientDialog();
                novyPacient.setModal(true);
                novyPacient.setVisible(true);

            }

        }
    };

    SeznamPacientu pacienti = new SeznamPacientu();
    ModelPacientu model = new ModelPacientu(pacienti);





    public static void main(String[] args) {
        new App();

    }



    public App() {
        setLayout(new BorderLayout());
        panel.setLayout(new FlowLayout(FlowLayout.LEFT));
        panel.add(pridejPacienta);
        panel.add(smazPacienta);
        panel.add(export);
        panel.add(konec);

        add(panel,BorderLayout.NORTH);
        tbl.setModel(model);
        add(new JScrollPane(tbl), BorderLayout.CENTER);
        setVisible(true);

        setDefaultCloseOperation(EXIT_ON_CLOSE);
        pack();
    }





}

对话类

    package nemocnice_sam;

import java.awt.GridLayout;

import javax.swing.JButton;
import javax.swing.JDialog;
import javax.swing.JLabel;
import javax.swing.JTextField;

public class PacientDialog extends JDialog {

    JTextField jmeno = new JTextField();
    JTextField prijmeni = new JTextField();
    JTextField rc = new JTextField();
    JTextField cp = new JTextField();
    JButton ok = new JButton("OK");

    public PacientDialog(){
        setLayout(new GridLayout(5,2));
        add(new JLabel("Jméno:"));
        add(jmeno);
        add(new JLabel("Příjmení:"));
        add(prijmeni);
        add(new JLabel("RČ:"));
        add(rc);
        add(new JLabel("ČP:"));
        add(cp);
        pack();
    }

}

【问题讨论】:

  • 您是否曾经使用例如pridejPacienta.addActionListener(...) 将您创建的actionListener 绑定到按钮或其他组件?
  • 你有你的答案,但这里有一个简单的清单1我的行动是否正在运行? 2我的操作是否绑定到按钮 3 按钮是否正确
  • 仅作记录:在创建minimal reproducible example 时...考虑使用全英文词汇。这里的主要语言是英语,任何以不同语言输入的内容只会降低您获得有用答案的机会。但在这种情况下不是。

标签: java swing jbutton actionlistener jdialog


【解决方案1】:

你需要在按钮中定义actionListener。

konec.addActionListener(al);

【讨论】:

  • 我不想使用按钮“konec”。当我点击pridejPacienta @josivan 时,我需要它打开
  • pridejPacienta.addActionListener(al)。您需要根据您的上下文理解和使用答案。 josivan 可以简单地说mybutton.addActionListener(myActionListener)。你应该明白该怎么做。
  • @TomášNosek,然后在pridejPacienta 按钮中添加监听器。 pridejPacienta,addActionListener(al);
【解决方案2】:

单独定义一个 ActionListener 是不够的。

为了完成其工作,该侦听器必须注册到某个组件,该组件实际上将事件发送到该侦听器。

因此,您可以将其添加到相应的按钮中,例如:

pridejPacienta.addActionListener(al);

此外:当你这样做时,你确实不需要在你的动作监听器中检查if (source ==。你看,当每个按钮都有一个不同的监听器,那么就不会有不同的来源了。

当您想将相同的 ActionListener 附加到多个按钮时,您只需要此类检查!

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2015-08-03
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-12-21
    • 1970-01-01
    相关资源
    最近更新 更多