创建新JFrame然后关闭后继续执行代码

时间:2015-10-09 19:39:52

标签: java jframe jtable jdialog

所以这可能是一个愚蠢的问题,但我无法弄明白。 基本上我有我的MainWindow,当我按下一个按钮时,一个名为PartSelectionWindow的新窗口应该出现,其中包含一个JTable(JTable填充了一个自定义表模型)。然后我选择一行并按确定返回MainWindow并使用所选的信息。这就是问题所在:

如果我为PartSelectionWindow使用JFrame,则在窗口关闭后,代码执行不会在MainWindow按钮事件中继续

如果我使用的是JDialog,则Jtable没有填写自定义模型,并且它的按钮没有响应,只能通过单击JDialog的X来关闭它。它好像被禁用了一样。调试时我注意到它在关闭JDialog后尝试填写表格。我在某处读到这可能是因为在setVisible设置为true后代码暂停,所以我尝试将代码填入JTable,然后将setVisible设置为true,但它仍然不起作用。

强制性代码:

    //MainWindow button event when tryng to use new JFrame
    private void btnSetupListActionPerformed(java.awt.event.ActionEvent evt) {                                             
        //call to new JFrame
        new partsWindow();
        //after closing partsWindow the next line of code does NOT execute
        txtPartNum.setText(PartsWindow.jpart.getPartNumber());
    }  

    //MainWindow button event when tryng to use new JDialog
    private void btnSetupListActionPerformed(java.awt.event.ActionEvent evt) {                                             
        //call to new JDialog
        new partsDialog(this, true);
        //after closing partsWindow the next line of code does NOT execute
        txtPartNum.setText(PartsWindow.jpart.getPartNumber());
    }  

JDialog窗口的构造函数

public partsDialog(java.awt.Frame parent, boolean modal) {
    super(parent, modal);
    initComponents();
    this.setTitle("Setup Material Client");
    this.setVisible(true);
    this.setLocationRelativeTo(null);
    jTable1.getTableHeader().addMouseListener(new partsDialog.ColumnFitAdapter());
    jTable1.getTableHeader().setReorderingAllowed(false);
    GetBomForSetupMaterial = jtrace.GetBomForSetupMaterial(Main.station);
    jTable1.setModel(new PartModel(GetBomForSetupMaterial.getPartPositionList()));
}

任何帮助都将不胜感激。

3 个答案:

答案 0 :(得分:1)

要说明我的评论,您可以使用此类代码(简化)

import java.awt.BorderLayout;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;

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


public class JDialogTest extends JDialog {
private static final long serialVersionUID = 1L;
private String text;
private JTextField textField;

public JDialogTest(JFrame owner, String text){
    super(owner,true);
    this.text = text;
    init();
}


private void init() {
    this.getContentPane().setLayout(new BorderLayout());
    JButton btnContinue = new JButton("Close me and continue");
    btnContinue.addActionListener(new ActionListener() {
        @Override
        public void actionPerformed(ActionEvent e) {
            JDialogTest.this.dispose(); 
        }
    });
    textField = new JTextField();
    this.getContentPane().add(new JLabel(text),BorderLayout.NORTH);
    this.getContentPane().add(textField,BorderLayout.CENTER);
    this.getContentPane().add(btnContinue,BorderLayout.SOUTH);
    this.pack();
}

public JTextField getTextField() {
    return textField;
}

public static void main(String[] args) {
    JFrame frame = new JFrame();
    frame.setVisible(true);
    JDialogTest test = new JDialogTest(frame, "Hello");
    System.out.println("I open");
    test.setLocationRelativeTo(null);
    test.setVisible(true);
    System.out.println("Good you closed it value is " + test.getTextField().getText());
    frame.setVisible(false);

}

 }

我刚刚传递了一些文字,最后在JLabel你应该传递你的表格或信息如何创建它

答案 1 :(得分:0)

对于第二个窗口,请执行frame.setDefaultCloseOperation(JFrame.DISPOSE_ON_CLOSE)或类似的操作。我在手机上,所以无法获得确切的密码。这行代码将使框架终止,而不是程序

答案 2 :(得分:0)

在主窗口中,将其设为JFrame。构造它时,在那里创建对话框,但将其可见设置为false。对话框应为modal = false。当您将其设置为false时,主窗口将等待,直到JDialog不再可见,才能继续执行代码:

Public class MainWindow extends JFrame {
    protected JDialog = yourDialog;

public MainWindow {
    yourDialog = new JDialog(this, false);
    //* rest of your construction *//
}

private void yourButtonPressedActionPreformed(java.awt.eventActionEvent evt) {
    yourDialog.setVisible(true);
    //* The code halted here until you have set the visibility of that dialog to false. 
        Make the dialog do that to itself when the button is pressed *//
    foobar = yourDialog.getYourData();
}

将JDialog模式设置为false将停止主窗口中的代码操作,直到完成为止,但由于您只将其可见性设置为false,因此您仍然可以根据需要从中获取数据。