Javaに関する様々な情報をご紹介します。

Javaに関する様々な情報をご紹介します。
評価

0

親フレームがダイアログのボタンに反応するプログラムを作るには

JTextAreaを検索するダイアログを作りたいと思い、プログラムを作っていきました。
その結果、検索を行うプログラムの作成とダイアログの作成までは上手く行ったのですが、親フレームがダイアログのボタンに反応するプログラムを作る事ができません。

作りかけのソースを下記に書きます。よろしくお願いします。

package study3;

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

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

public class Main extends JFrame implements ActionListener {

    private JPanel contentPane;
    JButton btnNewButton;
    Sub1 sub1; 
    String keyword;
    /**
     * Launch the application.
     */
    JTextArea textArea;
    public static void main(String[] args) {
        EventQueue.invokeLater(new Runnable() {
            public void run() {
                try {
                    Main frame = new Main();
                    frame.setVisible(true);
                } catch (Exception e) {
                    e.printStackTrace();
                }
            }
        });
    }

    /**
     * Create the frame.
     */
    public Main() {
        setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        setBounds(100, 100, 450, 300);
        contentPane = new JPanel();
        contentPane.setBorder(new EmptyBorder(5, 5, 5, 5));
        setContentPane(contentPane);
        contentPane.setLayout(null);
        
        textArea = new JTextArea();
        textArea.setBounds(12, 10, 410, 213);
        contentPane.add(textArea);
        
        btnNewButton = new JButton("検索");
        btnNewButton.setBounds(317, 233, 91, 21);
        contentPane.add(btnNewButton);
        btnNewButton.addActionListener(this);
        sub1 = new Sub1();
        keyword ="";
    }
     public void actionPerformed (ActionEvent e)
     {
        if(e.getSource() == btnNewButton)
        { 
             sub1.setAlwaysOnTop(true);
             sub1.setVisible(true);
             keyword = sub1.keyword;

             //jtextAreaの改行コードを合わせる(これをしないと文字位置を見誤る)
             String text = textArea.getText().replaceAll("\r\n", "\n");

             //現在のカーソル位置から最後までの文字列(下へ検索用)
             String word = text.substring(textArea.getSelectionEnd(), text.length());

             if(keyword == null)
             {
                 keyword="";
             }
             //検索したい文字が見つからなければ
             if(word.indexOf(keyword) < 0){
             //Mess.setText(keyword+"は見つかりませんでした");
                 textArea.requestFocus(true);
                return;
             }

             //検索した文字列を選択する(下へ検索用)
             textArea.setSelectionStart(textArea.getSelectionEnd() + word.indexOf(keyword));
             textArea.setSelectionEnd(textArea.getSelectionStart() + keyword.length());//検索した文字列を選択する(上へ検索用)

             //script.setSelectionStart(word.lastIndexOf(keyword));
             //script.setSelectionEnd(script.getSelectionStart() + keyword.length());
             textArea.requestFocus(true);
        } 
    }
}


package study3;

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

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

public class Sub1 extends JDialog implements ActionListener {

    private final JPanel contentPanel = new JPanel();
    JTextPane textPane;
    JButton okButton;
    String keyword;
    /**
     * Create the dialog.
     */
    public Sub1() {
        setModalityType(JDialog.ModalityType.MODELESS);
        setBounds(100, 100, 267, 77);
        getContentPane().setLayout(new BorderLayout());
        contentPanel.setBorder(new EmptyBorder(5, 5, 5, 5));
        getContentPane().add(contentPanel, BorderLayout.CENTER);
        contentPanel.setLayout(null);
        {
            //OKを押すとダイアログが出てくる
            okButton = new JButton("検索");
            okButton.setBounds(192, 10, 49, 21);
            contentPanel.add(okButton);
            okButton.setActionCommand("検索");
            okButton.addActionListener(this);
            getRootPane().setDefaultButton(okButton);
        }
        
        textPane = new JTextPane();
        textPane.setBounds(12, 10, 168, 19);
        contentPanel.add(textPane);
    }
     public void actionPerformed (ActionEvent e)
     {
         String cmd = e.getActionCommand();
         //ボタンのアクション
         if (cmd.equals("検索")){
            keyword = textPane.getText();
         }
    }
}

4

回答

82008

閲覧

4件の回答

評価

0

>できません。
でその後に何をしてみたのか。

評価

0

ダイアログは基本モーダル(その画面が開かれている間他の画
面の操作ができない)だと思うので、モーダレス(その画面が
開かれている間他の画面の操作もできる)のダイアログにする
かダイアログのかわりにもうひとつJFrameを作ればいいと思
います。

評価

0

親フレームに呼び出したい機能をメソッドとして用意してやりダイアログから
そのメソッドを呼び出します。
ダイアログは親フレームの参照が必要になるのでコンストラクタで渡してあげます。

ダイアログをMainのインナークラスにすれば透過的にMainのフィールドやメソッドに
アクセスできるので参照を渡す必要がなくなりますが、プログラムが長くなると
見通しが悪くなってしまう場合があります。
以下のような感じになります。

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

import javax.swing.JButton;
import javax.swing.JFrame;
import javax.swing.JPanel;
import javax.swing.JTextArea;
import javax.swing.border.EmptyBorder;

public class Main extends JFrame implements ActionListener {

    private JPanel contentPane;
    JButton btnNewButton;
    Sub1 sub1;
    /**
     * Launch the application.
     */
    JTextArea textArea;
    public static void main(String[] args) {
        //変更無しなので省略
    }

    /**
     * Create the frame.
     */
    public Main() {
        setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        setBounds(100, 100, 450, 300);
        contentPane = new JPanel();
        contentPane.setBorder(new EmptyBorder(5, 5, 5, 5));
        setContentPane(contentPane);
        contentPane.setLayout(null);

        textArea = new JTextArea();
        textArea.setBounds(12, 10, 410, 213);
        contentPane.add(textArea);

        btnNewButton = new JButton("検索");
        btnNewButton.setBounds(317, 233, 91, 21);
        contentPane.add(btnNewButton);
        btnNewButton.addActionListener(this);
        sub1 = new Sub1(this);
    }

     @Override
    public void actionPerformed (ActionEvent e)
     {

        if(e.getSource() == btnNewButton)
        {
             sub1.setAlwaysOnTop(true);
             sub1.setVisible(true);
             find();
        }
    }

     public void find() {
         find(sub1.getKeyword());
     }

     public void find(String keyword) {
        //jtextAreaの改行コードを合わせる(これをしないと文字位置を見誤る)
         String text = textArea.getText().replaceAll("\r\n", "\n");

         //現在のカーソル位置から最後までの文字列(下へ検索用)
         String word = text.substring(textArea.getSelectionEnd(), text.length());

         if(keyword == null)
         {
             keyword="";
         }
         //検索したい文字が見つからなければ
         if(word.indexOf(keyword) < 0){
         //Mess.setText(keyword+"は見つかりませんでした");
             textArea.requestFocus(true);
            return;
         }

         //検索した文字列を選択する(下へ検索用)
         textArea.setSelectionStart(textArea.getSelectionEnd() + word.indexOf(keyword));
         textArea.setSelectionEnd(textArea.getSelectionStart() + keyword.length());//検索した文字列を選択する(上へ検索用)

         //script.setSelectionStart(word.lastIndexOf(keyword));
         //script.setSelectionEnd(script.getSelectionStart() + keyword.length());
         textArea.requestFocus(true);
     }
}

-------------------------------------------------

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.JPanel;
import javax.swing.JTextPane;
import javax.swing.border.EmptyBorder;

public class Sub1 extends JDialog implements ActionListener {

    private final JPanel contentPanel = new JPanel();
    private Main frame;
    JTextPane textPane;
    JButton okButton;

    /**
     * Create the dialog.
     */
    public Sub1(Main frame) {
        if (frame == null) {
            throw new IllegalArgumentException("Argument must not be null!");
        }
        this.frame = frame;

        setModalityType(JDialog.ModalityType.MODELESS);
        setBounds(100, 100, 267, 77);
        getContentPane().setLayout(new BorderLayout());
        contentPanel.setBorder(new EmptyBorder(5, 5, 5, 5));
        getContentPane().add(contentPanel, BorderLayout.CENTER);
        contentPanel.setLayout(null);

        //OKを押すとダイアログが出てくる
        okButton = new JButton("検索");
        okButton.setBounds(192, 10, 49, 21);
        contentPanel.add(okButton);
        okButton.setActionCommand("検索");
        okButton.addActionListener(this);
        getRootPane().setDefaultButton(okButton);

        textPane = new JTextPane();
        textPane.setBounds(12, 10, 168, 19);
        contentPanel.add(textPane);
    }

    @Override
    public void actionPerformed (ActionEvent e)
     {
         String cmd = e.getActionCommand();
         //ボタンのアクション
         if (cmd.equals("検索")){
            frame.find(getKeyword());
         }
    }

    public String getKeyword() {
        return textPane.getText();
    }
}

評価

0

3番目の方の方法でやってみたら出来ました。
親切な回答、有難うございました。

質問から6ヶ月以上経過しているので、回答を書き込むことはできません。