Java 为什么我的JDialog中的JButton不工作?固定的

Java 为什么我的JDialog中的JButton不工作?固定的,java,swing,model-view-controller,mouseevent,jbutton,Java,Swing,Model View Controller,Mouseevent,Jbutton,这是所讨论的JDialog视图的构造函数: import javax.swing.JButton; import javax.swing.JDialog; import javax.swing.JPanel; import javax.swing.border.EmptyBorder; public class AjoutPatient extends JDialog { private static final long serialVersionUID = 1L; privat

这是所讨论的JDialog视图的构造函数:

import javax.swing.JButton;
import javax.swing.JDialog;
import javax.swing.JPanel;
import javax.swing.border.EmptyBorder;


public class AjoutPatient extends JDialog {

  private static final long serialVersionUID = 1L;
  private ControleurAjout ajoutControleur;
  private JPanel contentPane;
  private JPanel buttonPane;
  private JButton ajouterButton;
  private JButton annulerButton;

  AjoutPatient() {
      init();

      //Creation du controleur
      ajoutControleur = new ControleurAjout(this);

      //Ajout de listeners sur les composantes
      ajouterButton.addActionListener(ajoutControleur);
      annulerButton.addActionListener(ajoutControleur);

      //Reglage de visibilite et modal
      setModal(true);
      setVisible(true);
  }

  private void init(){
      setDefaultCloseOperation(JDialog.DISPOSE_ON_CLOSE);
      setTitle("Test JDialog");
      //Ajout panel principal
      contentPane = new JPanel();
      contentPane.setBorder(new EmptyBorder(5, 5, 5, 5));
      setContentPane(contentPane);
      contentPane.setLayout(null);

      //Panel des bouton ajouter et annuler
      buttonPane = new JPanel();
      buttonPane.setBounds(5, 322, 304, 42);
      contentPane.add(buttonPane);
      buttonPane.setLayout(null);

      //Boutons ajouter et annuler
      ajouterButton = new JButton("Ajouter");
      ajouterButton.setBounds(130, 11, 81, 23);
      buttonPane.add(ajouterButton);
      annulerButton = new JButton("Annuler");
      annulerButton.setBounds(213, 11, 81, 23);
      buttonPane.add(annulerButton);
  }

  /*
   * Getters
   */
  public JButton getAjouterButton(){
      return ajouterButton;
  }

  public JButton getAnnulerButton(){
      return annulerButton;
  }
}
然后,JDialog控制器:

import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
public class ControleurAjout implements ActionListener {

  private AjoutPatient vue;

  ControleurAjout(AjoutPatient ajout){
      vue = ajout;      
  }

  public void actionPerformed(ActionEvent e) {
    if(e.getSource() == vue.getAjouterButton()){
            vue.dispose();
        }
    }else if(e.getSource() == vue.getAnnulerButton()){
            vue.dispose();
    }
  }

  public JButton getAjouterButton(){
      return ajouterButton;
  }

  public JButton getAnnulerButton(){
      return annulerButton;
  }
}
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import javax.swing.JDialog;

public class ControleurRecherche implements ActionListener {

  private FenetreRecherche vue;

  ControleurRecherche(FenetreRecherche recherche){
      vue = recherche;
  }

  //Ecouteurs d'evenement
  public void actionPerformed(ActionEvent e) {
    if(e.getSource() == vue.getAjouterButton()){
        ajout = new AjoutPatient();
        //modele.ajouterPatient(ajout);
    }else if(e.getSource() == vue.getFermerButton()){
            System.exit(0);
    } 
}
这是JFrame主控制器:

import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
public class ControleurAjout implements ActionListener {

  private AjoutPatient vue;

  ControleurAjout(AjoutPatient ajout){
      vue = ajout;      
  }

  public void actionPerformed(ActionEvent e) {
    if(e.getSource() == vue.getAjouterButton()){
            vue.dispose();
        }
    }else if(e.getSource() == vue.getAnnulerButton()){
            vue.dispose();
    }
  }

  public JButton getAjouterButton(){
      return ajouterButton;
  }

  public JButton getAnnulerButton(){
      return annulerButton;
  }
}
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import javax.swing.JDialog;

public class ControleurRecherche implements ActionListener {

  private FenetreRecherche vue;

  ControleurRecherche(FenetreRecherche recherche){
      vue = recherche;
  }

  //Ecouteurs d'evenement
  public void actionPerformed(ActionEvent e) {
    if(e.getSource() == vue.getAjouterButton()){
        ajout = new AjoutPatient();
        //modele.ajouterPatient(ajout);
    }else if(e.getSource() == vue.getFermerButton()){
            System.exit(0);
    } 
}
这是主要的JFrame方法:

import java.awt.BorderLayout;
import java.awt.FlowLayout;
import java.awt.GridLayout;
import javax.swing.JButton;
import javax.swing.JFrame;
import javax.swing.JPanel;
import javax.swing.border.EmptyBorder;

public class FenetreRecherche extends JFrame {

  private static final long serialVersionUID = 1L;
  private ControleurRecherche rechControleur;
  private JPanel contentPane;
  private JPanel buttonPane;
  private JButton ajouterButton;
  private JButton fermerButton;

  public static void main(String[] args) {

    FenetreRecherche recherche = new FenetreRecherche();
    recherche.setVisible(true);

  }

  FenetreRecherche() {
      init();
      //Creation du controlleur
      rechControleur = new ControleurRecherche(this);
      //Ajout de listeners sur les composantes
      ajouterButton.addActionListener(rechControleur);
      fermerButton.addActionListener(rechControleur);
  }

    //Initialiser le GUI
    private void init(){

    setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
    setTitle("Test");
    setResizable(false);
    setBounds(100, 100, 600, 320);

    //Panel de contenu de la fenetre
    contentPane = new JPanel();
    contentPane.setBorder(new EmptyBorder(5, 5, 5, 5));
    contentPane.setLayout(new BorderLayout(0, 0));
    setContentPane(contentPane);
    contentPane.setLayout(new GridLayout(4, 1, 0, 0));

    //Panel des boutons menu
    buttonPane = new JPanel();
    FlowLayout flowButtonPane = (FlowLayout) buttonPane.getLayout();
    flowButtonPane.setVgap(20);
    flowButtonPane.setAlignment(FlowLayout.RIGHT);
    contentPane.add(buttonPane);

    //Boutons menu
    ajouterButton = new JButton("Ajouter");
    buttonPane.add(ajouterButton);
    fermerButton = new JButton("Fermer");
    buttonPane.add(fermerButton);       
  }
  /*
   * Getters
   */
  public JButton getAjouterButton(){
      return ajouterButton;
  }
  public JButton getFermerButton(){
      return fermerButton;
  }

}
尽管如此,我希望这个问题可以毫无问题地解决。 只需要在构造函数末尾更改JDialog的setVisible(true)。编辑,以便有最终的工作版本在这里

我使用MousePressed事件打开JDialog

不要用鼠标听器~

您需要使用ActionListener。有关更多信息和工作示例,请阅读上Swing教程的部分

我使用MousePressed事件打开JDialog

不要用鼠标听器~

您需要使用ActionListener。有关更多信息和工作示例,请阅读上Swing教程的部分

我使用MousePressed事件打开JDialog

不要用鼠标听器~

您需要使用ActionListener。有关更多信息和工作示例,请阅读上Swing教程的部分

我使用MousePressed事件打开JDialog

不要用鼠标听器~




您需要使用ActionListener。有关更多信息和工作示例,请阅读Swing教程中的部分。

JButton
emits。所以,你需要抓住它。@ PM77—1,它仍然不起作用,它可能与JFrAMP控制器代码有关,我将在一瞬间添加,因为我使用MouthPress事件打开J对话框,这也是我混淆的原因。考虑提供一个可运行的示例来演示您的problem@MadProgrammer,好的,等等,这将需要一段时间,因为我的GUI对此问题有太多不必要的代码,所以我将重新格式化它以便可以执行。@MadProgrammer,完成了,这应该可以运行。
JButton
emits。所以,你需要抓住它。@ PM77—1,它仍然不起作用,它可能与JFrAMP控制器代码有关,我将在一瞬间添加,因为我使用MouthPress事件打开J对话框,这也是我混淆的原因。考虑提供一个可运行的示例来演示您的problem@MadProgrammer,好的,等等,这将需要一段时间,因为我的GUI对此问题有太多不必要的代码,所以我将重新格式化它以便可以执行。@MadProgrammer,完成了,这应该可以运行。
JButton
emits。所以,你需要抓住它。@ PM77—1,它仍然不起作用,它可能与JFrAMP控制器代码有关,我将在一瞬间添加,因为我使用MouthPress事件打开J对话框,这也是我混淆的原因。考虑提供一个可运行的示例来演示您的problem@MadProgrammer,好的,等等,这将需要一段时间,因为我的GUI对此问题有太多不必要的代码,所以我将重新格式化它以便可以执行。@MadProgrammer,完成了,这应该可以运行。
JButton
emits。所以,你需要抓住它。@ PM77—1,它仍然不起作用,它可能与JFrAMP控制器代码有关,我将在一瞬间添加,因为我使用MouthPress事件打开J对话框,这也是我混淆的原因。考虑提供一个可运行的示例来演示您的problem@MadProgrammer,好的,等等,这将需要一段时间,因为我的GUI对此问题有太多不必要的代码,所以我将重新格式化以使其能够执行。@MadProgrammer,完成了,这应该可以运行。除了MouseListener更广泛的用途之外,您能澄清为什么使用ActionListener而不是MouseListener更好吗?我将更改代码以使用ActionListener,看看这是否解决了问题。
除了MouseListener更广泛的用途之外,还有其他用途吗?
-这还不够充分吗?当你知道常用的方法时,为什么要尝试重新发明轮子?。保持你的代码简单,这样其他人就会理解它,不要仅仅因为你想做就做疯狂的事情!无论如何,按钮单击定义为在同一按钮上按住鼠标和松开鼠标。MouseListener不容易支持这一点,因为即使用户将鼠标移动1个像素,也不会生成mouseClicked事件。因为我使用的另一种方法至少需要按下鼠标,所以我想我应该使用一种方法进行保存。它仍然不起作用,我打开的JDialog似乎没有实例化任何侦听器。。。这就是我必须要做的,除非你能帮我做这件事。@Ido013当按钮聚焦时,用鼠标按空格键/enter键,或通过编程,或通过nemonic快捷键(如果设置),可以触发按钮。MouseListener将只捕获其中一个用例,而ActionListener将捕获所有用例。ActionListener将激活按钮的事件抽象到一个统一的界面中。@Ido013:如果您尝试使用
.setEnabled(false)
禁用按钮,您认为您的鼠标侦听器会像用户预期的那样被禁用吗?不,它仍然可以工作,导致非常混乱的GUI。这里还有另一个声音告诉你——使用合适的工具,ActionListener。除了更广泛的用途之外,你能澄清为什么使用ActionListener而不是MouseListener更好吗?我将更改代码以使用ActionListener,看看这是否解决了问题。
除了MouseListener更广泛的用途之外,还有其他用途吗?
-这还不够充分吗?当你知道常用的方法时,为什么要尝试重新发明轮子?。保持你的代码简单,这样其他人就会理解它,不要仅仅因为你想做就做疯狂的事情!无论如何,按钮单击定义为在同一按钮上按住鼠标和松开鼠标。MouseListener不容易支持这一点,因为即使用户将鼠标移动1个像素,也不会生成mouseClicked事件。因为我使用了另一种方法,需要预先设置鼠标