!!!!! И я нашел большую проблему, я переписываю метод isModal, который уже предопределен, поэтому он не будет удерживать и ждать ввода пользователя! похлопать себя в лицо сейчас:) !!!!!!Mac OS JDialog не приостанавливает выполнение, даже если модальный
im делает проект в школе о графическом интерфейсе. Основной темой на данный момент является 4-слойный архитектор, здесь мы должны использовать JDialog для ввода информации о человеке и, тем самым, обновить JList в JFrame программы.
Моя проблема заключается в том, что, когда я использую кнопку «Добавить человека», JDialog устанавливается как видимым, так и модальным, поэтому он должен ждать с обновлением JList на JFrame после нажатия пользователем кнопки добавления на JDialog.
Но но это не работало, я общался со многими учителями об этом, и они не могут понять, почему это не сработает.
Дополнительная информация о том, что я программирую на Mac, но если программа работает на машине с Windows, она работает.
Я попытался найти конкретную проблему в Интернете, но не нашел ничего, что связано с проблемами JDialog java на Mac.
Есть ли у вас кто-нибудь, у кого есть опыт?
JFrame:
package gui;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import javax.swing.JButton;
import javax.swing.JFrame;
import javax.swing.JList;
import javax.swing.JScrollPane;
import javax.swing.ListSelectionModel;
import javax.swing.event.ListSelectionEvent;
import model.Person;
import service.Service;
public class MainFrame extends JFrame {
private JList<Person> jlList;
private JScrollPane jsrPane;
private JButton addButton, updateButton;
private Controller controller;
private MyDialog myDialog;
public MainFrame(){
controller = new Controller();
this.setTitle("Marks lille MainFrame.");
this.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
this.setSize(800, 600);
this.setLocation(300, 200);
this.setLayout(null);
jlList = new JList<>();
jlList.setSelectionMode(ListSelectionModel.SINGLE_SELECTION);
jsrPane = new JScrollPane(jlList);
jsrPane.setBounds(10, 10, 400, 500);
this.add(jsrPane);
addButton = new JButton("Add Person");
addButton.setBounds(420, 110, 100, 25);
addButton.addActionListener(controller);
this.add(addButton);
updateButton = new JButton("Update");
updateButton.setBounds(420, 150, 100, 25);
updateButton.addActionListener(controller);
this.add(updateButton);
}
private class Controller implements ActionListener{
public void actionPerformed(ActionEvent ae){
if(ae.getSource().equals(addButton)){
myDialog = new MyDialog("Add Person");
myDialog.setVisible(true);
System.out.println("Test");
if(myDialog.isModal()){
jlList.setListData(Service.getPersons().toArray(new Person[0]));
}
System.out.println("Test");
}else if(ae.getSource().equals(updateButton)){
Person ps = jlList.getSelectedValue();
myDialog = new MyDialog("Update Person");
myDialog.setVisible(true);
if(myDialog.isModal()){
Service.removePerson(ps);
jlList.setListData(Service.getPersons().toArray(new Person[0]));
}
}
}
}
}
JDialog:
package gui;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import javax.swing.JButton;
import javax.swing.JCheckBox;
import javax.swing.JDialog;
import javax.swing.JFrame;
import javax.swing.JLabel;
import javax.swing.JTextField;
import service.Service;
public class MyDialog extends JDialog {
private JButton okButton, cancelButton;
private JLabel lblName, lblTitle;
private JTextField txfName, txfTitle;
private JCheckBox ckbRetire;
private Controller controller;
private boolean modalResult;
public MyDialog(String title){
controller = new Controller();
this.setDefaultCloseOperation(JDialog.DO_NOTHING_ON_CLOSE);
this.setTitle(title);
setModalityType(JDialog.DEFAULT_MODALITY_TYPE);
this.setLayout(null);
this.setSize(300, 300);
this.setLocation(300, 200);
okButton = new JButton("Add");
okButton.setBounds(100, 250, 80, 25);
okButton.addActionListener(controller);
this.add(okButton);
cancelButton = new JButton("Cancel");
cancelButton.setBounds(180, 250, 80, 25);
cancelButton.addActionListener(controller);
this.add(cancelButton);
lblName = new JLabel("Name:");
lblName.setBounds(10, 10, 100, 25);
this.add(lblName);
txfName = new JTextField();
txfName.setBounds(5, 35, 200, 25);
this.add(txfName);
lblTitle = new JLabel("Title:");
lblTitle.setBounds(10, 70, 100, 25);
this.add(lblTitle);
txfTitle = new JTextField();
txfTitle.setBounds(5, 95, 200, 25);
this.add(txfTitle);
ckbRetire = new JCheckBox("retired");
ckbRetire.setBounds(10, 150, 100, 25);
this.add(ckbRetire);
}
private class Controller implements ActionListener{
public void actionPerformed(ActionEvent ae){
if(ae.getSource().equals(okButton)){
String name = txfName.getText().trim();
String title = txfTitle.getText().trim();
boolean retired = ckbRetire.isSelected();
Service.createPerson(name, title, retired);
modalResult = true;
MyDialog.this.setVisible(false);
}else if(ae.getSource().equals(cancelButton)){
modalResult = false;
MyDialog.this.setVisible(false);
}
}
}
public boolean isModal(){
return modalResult;
}
}
Основной метод:
package gui;
public class MainFrameApp {
/**
* @param args
*/
public static void main(String[] args) {
MainFrame frame = new MainFrame();
frame.setVisible(true);
}
}
Если вам нужно обслуживание, DAO и модель классов, дайте мне знать.
Edit # 1: Бег на Java строить 1.7.0_09-b05
Edit # 2: Пробовал установка супер к JDialog, и установив JFrame как супер. Пробовал setModal, хотя он устарел. Пробовал устанавливать модальный при вызове JDialog, все еще нет succes
И я нашел большую проблему, я переписываю метод isModal, который уже предопределен, поэтому он не будет держать и ждать ввода пользователя! похлопать себя в лицо сейчас :) – Mark