2

それが今SwingUtilities.invokeLaterまで避けてきた理由ですが、Swing Threadを安全にすることは非常に重要です。すみません、今回が初めてなのでよろしくお願いします。データベースクエリの後にウィンドウを閉じようとしています。したがって、私が理解している限り、更新はUIによって処理される必要がありますSwingUtilities.invokeLater。私の仕事は次のとおりです。

主要:

public static void main(String args[]) {
    java.awt.EventQueue.invokeLater(new Runnable() {
    public void run() {
    new forminsert().setVisible(true);
forminsert f=new forminsert();
    }
    });

    }
  public forminsert() {
    initComponents();
}

public class forminsert extends javax.swing.JFrame {    
private void initComponents() {

    jPanel1 = new javax.swing.JPanel();
    jTextField1 = new javax.swing.JTextField();
    jButton1 = new javax.swing.JButton();
    jButton2 = new javax.swing.JButton();
    jButton3 = new javax.swing.JButton();

    setDefaultCloseOperation(javax.swing.WindowConstants.EXIT_ON_CLOSE);
    setUndecorated(true);

    jPanel1.setBackground(new java.awt.Color(0, 0, 0));
    jPanel1.setBorder(javax.swing.BorderFactory.createMatteBorder(3, 3, 3, 3, new java.awt.Color(0, 204, 204)));
              /////***REST CODE***/////           

}

ADD ボタンのリスナー

  private void jButton2ActionPerformed(java.awt.event.ActionEvent evt)               {                                         
 new Thread(new thread1()).start();

}                                        
public class thread1 implements Runnable
{

    public void run() {
     insert ins=new insert();
    ////code for inserting///     
    }
 }

参照ボタンのリスナー

private void jButton1ActionPerformed(java.awt.event.ActionEvent evt)                {                                         
    JFileChooser ss=new JFileChooser();
    ////Code to choose the file////
                 }                                        

ここに問題があります。終了するコードです。

private void jButton3ActionPerformed(java.awt.event.ActionEvent evt) {

forminsert f=new forminsert();f.call();
}

public  void call()
{
java.awt.EventQueue.invokeLater(new Runnable() {
    public void run() {
 jPanel1.setVisible(false);
getRootPane().setVisible(false);

    }
    });

画面: スクリーンショット

どこが間違っているのか説明してください。使いたくないSystem.exitので、質問が多すぎてすみません。ありがとうございます。

アップデート:

これは、 @trashgod によって要求されたサンプルの作業コードです。

package faltur;

import java.io.File;
import javax.swing.JFileChooser;

public class insert extends javax.swing.JFrame {

/** Creates new form insert */
public insert() {
    initComponents();
}


@SuppressWarnings("unchecked")

 private void initComponents() {

    jPanel1 = new javax.swing.JPanel();
    jTextField1 = new javax.swing.JTextField();
    jButton1 = new javax.swing.JButton();
    jButton2 = new javax.swing.JButton();

    setDefaultCloseOperation(javax.swing.WindowConstants.EXIT_ON_CLOSE);
    setUndecorated(true);

    jPanel1.setForeground(new java.awt.Color(240, 240, 240));

    jButton1.setText("Browse..");
    jButton1.addActionListener(new java.awt.event.ActionListener() {
        public void actionPerformed(java.awt.event.ActionEvent evt) {
            jButton1ActionPerformed(evt);
        }
    });

    jButton2.setText("exit");
    jButton2.addActionListener(new java.awt.event.ActionListener() {
        public void actionPerformed(java.awt.event.ActionEvent evt) {
            jButton2ActionPerformed(evt);
        }
    });

    javax.swing.GroupLayout jPanel1Layout = new javax.swing.GroupLayout(jPanel1);
    jPanel1.setLayout(jPanel1Layout);
    jPanel1Layout.setHorizontalGroup(
        jPanel1Layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
        .addGroup(jPanel1Layout.createSequentialGroup()
            .addGroup(jPanel1Layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
                .addGroup(jPanel1Layout.createSequentialGroup()
                    .addContainerGap()
                    .addComponent(jButton1)
                    .addGap(31, 31, 31)
                    .addComponent(jTextField1, javax.swing.GroupLayout.PREFERRED_SIZE, 185, javax.swing.GroupLayout.PREFERRED_SIZE))
                .addGroup(jPanel1Layout.createSequentialGroup()
                    .addGap(153, 153, 153)
                    .addComponent(jButton2)))
            .addContainerGap(99, Short.MAX_VALUE))
    );
    jPanel1Layout.setVerticalGroup(
        jPanel1Layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
        .addGroup(jPanel1Layout.createSequentialGroup()
            .addGap(66, 66, 66)
            .addGroup(jPanel1Layout.createParallelGroup(javax.swing.GroupLayout.Alignment.BASELINE)
                .addComponent(jButton1, javax.swing.GroupLayout.PREFERRED_SIZE, 30, javax.swing.GroupLayout.PREFERRED_SIZE)
                .addComponent(jTextField1, javax.swing.GroupLayout.PREFERRED_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.PREFERRED_SIZE))
            .addGap(87, 87, 87)
            .addComponent(jButton2)
            .addContainerGap(94, Short.MAX_VALUE))
    );

    javax.swing.GroupLayout layout = new javax.swing.GroupLayout(getContentPane());
    getContentPane().setLayout(layout);
    layout.setHorizontalGroup(
        layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
        .addComponent(jPanel1, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, Short.MAX_VALUE)
    );
    layout.setVerticalGroup(
        layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
        .addComponent(jPanel1, javax.swing.GroupLayout.DEFAULT_SIZE,   javax.swing.GroupLayout.DEFAULT_SIZE, Short.MAX_VALUE)
    );

    pack();
}

private void jButton1ActionPerformed(java.awt.event.ActionEvent evt)                {                                         
 JFileChooser ss=new JFileChooser();
 ss.showOpenDialog(jTextField1);

 File f=ss.getSelectedFile();

   path=f.toString();
    System.out.println(path);

}                                        

private void jButton2ActionPerformed(java.awt.event.ActionEvent evt) {
  insert in=new insert();
  in.exit();/////////////CALLS exit()/////////////////modify this//////
}


public static void main(String args[]) {
    java.awt.EventQueue.invokeLater(new Runnable() {
        public void run() {
            new insert().setVisible(true);
        }
    });
}
public void exit()////////////////////////MODIFY THIS///////////////////
{
jPanel1.getRootPane().setVisible(false);

}

private javax.swing.JButton jButton1;
private javax.swing.JButton jButton2;
private javax.swing.JPanel jPanel1;
private javax.swing.JTextField jTextField1;

 public String path="";
}

exit()実行してウィンドウを閉じるように修正する方法を教えてください。

4

2 に答える 2

6

フレームのデフォルトのクローズ操作はであるため、ここに示すように、を介してEXIT_ON_CLOSE送信できます。与えられた、WindowEvent.WINDOW_CLOSINGdispatchEvent()JFrame f

private static final String EXIT = "Exit";
private Action exit = new AbstractAction(EXIT) {

        @Override
        public void actionPerformed(ActionEvent e) {
            f.dispatchEvent(new WindowEvent(
                f, WindowEvent.WINDOW_CLOSING));
        }
    };
private JButton b = new JButton(exit);

アクションの使用方法および一般的なコーディング規則に従うも参照してください。

補遺:改訂されたコードに基づいて、プログラムを終了するための1つのアプローチがあります。クラス名は通常大文字で始まりますが、インスタンス名は小文字であることに注意してください。

private void jButton2ActionPerformed(java.awt.event.ActionEvent evt) {
    insert.dispatchEvent(new WindowEvent(
        insert, WindowEvent.WINDOW_CLOSING));
}

public static void main(String args[]) {
    java.awt.EventQueue.invokeLater(new Runnable() {

        @Override
        public void run() {
            insert = new Insert();
            insert.setVisible(true);
        }
    });
}

private static Insert insert;
...
于 2012-12-19T11:30:16.027 に答える
3

を使用するのが面倒だっfoo.setVisible(false)たので、単に に変更したところsetVisible(false)、機能しました。

于 2012-12-19T15:35:55.510 に答える