使用 Java Swing 的 JDialog 后如何更新 JFrame main 的值?

How to update values of a JFrame main after using a JDialog of Java Swing?

我有一个名为 MainFrame 的主程序 window,它是一个 jForm,我根据计时器向其更新数据,但问题是在使用 jdialog 后我无法在同一个 MainFrame 中更新数据,因为我最终创建了另一个副本 window,但随着数据的改变,一个使用原始计时器,另一个使用新计时器,我知道我可以使用 dispose() 关闭第一个 window 和然后保留第二个,但我想避免将 windows 改变太多

按下 jDialog 按钮时我用来创建另一个 window 的代码如下

private void jButton1ActionPerformed(java.awt.event.ActionEvent evt) {//GEN-FIRST:event_jButton1ActionPerformed
        // TODO add your handling code here:

        String textoFieldTimer = jTextField1.getText();

        int timeUserConfig = Integer.parseInt(textoFieldTimer);
        
        Timer timeDefault = new Timer(timeUserConfig, null);
        
        TokenAccess token = new TokenAccess();
        token.access_code = code;

        MainFrame mainFrame = new MainFrame(token);
        mainFrame.setVisible(true);

        mainFrame.timeDefault.stop();
        mainFrame.timeDefault = timeDefault;
        
        mainFrame.setUpdateTime(timeUserConfig);
        this.dispose();

    }//GEN-LAST:event_jButton1ActionPerformed

有没有其他方法可以更新 window?像 mainFrame.update(); 或者可能将 jTextField 的值从 jDialog 发送到 mainFrame?因为前面的代码为我创建了另一个 MainFrame。

方法主要setLabel和Timer.start/stop

public void setUpdateTime(int timeUserConfig) {
        this.timeUserConfig = timeUserConfig;
        if (timeUserConfig == 0) {
            timeDefault.start();
            timeDefault.addActionListener(new java.awt.event.ActionListener() {
                @Override
                public void actionPerformed(java.awt.event.ActionEvent evt) {
                    setLabelText();
                    String timeUserConfigStr = Integer.toString(timeDefaultInt);
                    tiempoActualizado.setText("Tiempo de Actualizado: " + timeUserConfigStr+"ms");
                }
            });
        } else {          
            timeDefault.stop();
            timeDefault = new Timer(timeUserConfig, null);
            timeDefault.start();
            timeDefault.addActionListener(new java.awt.event.ActionListener() {
                @Override
                public void actionPerformed(java.awt.event.ActionEvent evt) {
                    setLabelText();
                    String timeUserConfigStr = Integer.toString(timeUserConfig);
                    tiempoActualizado.setText("Tiempo de Actualizado: " + timeUserConfigStr+"ms");
                }
            });
        }
    }

setLabelText是标签的方法集

public void setLabelText() {

        String humedadStr = String.valueOf(humedad);
        String temperaturaStr = String.valueOf(temperatura);
        String presionStr = String.valueOf(co2);

        temporalHum.setText(humedadStr);
        temporalTemperatura.setText(temperaturaStr);
        temporalPresion.setText(presionStr);
    }

如有任何帮助,我们将不胜感激。

感谢更新,我从这个问题中找到了另一个不使用 OptionPane 的解决方案:programmatically close a JPanel which is displayed in JDialog.

我无法复制你的代码

MainFrame 开始,假设您通过单击按钮打开了 JDialog 并希望 setText() 标记 lbSomething:

private void btInputActionPerformed(java.awt.event.ActionEvent evt) {
    // Open new JDialog when button is clicked
    NewJDialog dialog = new NewJDialog(new javax.swing.JFrame, true);
    dialog.setVisible(true);
    // Get user input from JDialog
    String temp = dialog.getInput();
    if (temp != null) {
        /*
         * Perform jButton1ActionPerformed() content here
         * Including timeUserConfig, timeDefault and setUpdateTime() here
         * so that you don't have to access mainFrame in the JDialog.
        */
        lbSomething.setText(temp);
    }
}

然后关于JDialog(简单的输入检测):

public class NewJDialog extends javax.swing.JDialog {

    // Set the variable as class variable
    private String textTOFieldTimer;

    public NewJDialog(java.awt.Frame parent, boolean modal) {
        // default contents
    }

    @SupressWarinings("unchecked")
    private void initComponents() {
        // default contents
    }

    private void btSaveAction Performed(java.awt.event.ActionEvent evt) {
        // Check if input correct and whether to disable JDialog
        if (tfInput.getText.length() != 0) {
            input = tfInput.getText();
            // Connect to the whole JDialog by getWindowAncestor()
            Window window = SwingUtilities.getWindowAncestor(NewJDialog.this);
            // Just setVisible(false) instead of dispose()
            window.setVisible(false);
        } else {
            JOptionPane.showMessageDialog(this, "Wrong Input");
        }
    }

    public String getInput() {
        return textToFieldTimer;
    }

    // default variables declarations
}

希望这个回答对您有所帮助。


如果显示源代码会更好,但是将值更新到现有 JFrame 的简单解决方案是使用 setText()getText()

例如:

String input = JOptionPane.showInputDialog(this, "Nuevo valor");
lbPresionActual.setText(input);

如果您创建了一个 self-defined JDialog,它将在关闭 JDialog 时传输 input 值,这可能是一个不同的问题。