Обработка события щелчка JButton в другом классе - PullRequest
7 голосов
/ 17 сентября 2011

Я новичок в Java из C #, поэтому я не знаком с лучшими практиками Java.

У меня есть основной класс, который открывает JFrame для получения нескольких строк ввода от пользователя. Когда пользователь нажимает кнопку «Отправить», графический интерфейс пользователя должен закрыться, и основной класс продолжает обработку с использованием ввода.

Это основной класс:
public class Main {
    FInput fInput;

    public void main(String[] args) {
        if(args.length==0)
        {
            fInput = new FInput();
            fInput.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
            fInput.pack();
            fInput.setVisible(true);
        }
    else
        startProcess(args);
    }

    public void startProcess(String[] args) {
// Do stuff
}

Основной класс будет использовать этот кадр для получения ввода от пользователя:

public class FInput extends JFrame{
    private JTextField txtSourceDirectory;
    private JTextField txtTargetDirectory;
    private JTextField txtDefectNumber;
    private JTextField txtSliceTokens;
    private JButton btnStart;

    public FInput() {
        // Initialize text fields and button
        JButton.addActionListener(something);
    }
}

Во всех примерах, которые я смог найти, слушателем был бы сам FMain. Однако в этом случае я хочу, чтобы Main прослушивал и использовал входные данные в методе startProcess.

Будет ли иметь Main реализовать ActionListener и передать его конструктору FMain - это путь?

Ответы [ 3 ]

5 голосов
/ 17 сентября 2011

Да, это правильная идея.Чтобы сделать это, вы должны сделать две вещи:

  1. Поместите это в начало класса FInput:

    Main m = new Main(this);
    
  2. Затем поместите эти строки где-нибудь в класс Main ...

    FInput gui;
    
    public Main(FInput in) { gui = in; }
    

Теперь вы можете ссылаться на любой компонент в классе FInput изMain класс, делая что-то вроде этого.

gui.someComponent ...

Чтобы настроить слушателей, просто напишите someComponent.addItemListener(m); или что-то в этом роде.

Надеюсь, что это поможет!

@ Yoav В ответ на ваш последний комментарий ...

Вам не нужно отделять класс прослушивания от класса GUI;Вы можете объединить два в один класс ...

import javax.swing.*;
import java.awt.*;
import java.awt.event.*;

public class Main extends JFrame implements ActionListener {

    private JTextField txtSourceDirectory;
    private JTextField txtTargetDirectory;
    private JTextField txtDefectNumber;
    private JTextField txtSliceTokens;
    private JButton btnStart;

    public Main() {
        txtSourceDirectory = new JTextField(40); //change this to the amount of characters you need
        txtTargetDirectory = new JTextField(40);
        txtDefectNumber = new JTextField(40);
        txtSliceTokens = new JTextField(40);
        btnStart = new JButton("Start");
        add(txtSourceDirectory);
        add(txtTargetDirectory);
        add(txtDefectNumber);
        add(txtSliceTokens);
        add(btnStart);
        btnStart.addActionListener(this);
        setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        pack();
        setVisible(true);
    }

    public void actionPerformed(ActionEvent event) {
        //do stuff
    }

    static void startProcess(String[] ARGS) {
        //do stuff
    }

    public static void main(String[] args) {
        if (args.length == 0) {
            Main frame = new Main();
        } else {
            startProcess(args);
        }
    }
}
2 голосов
/ 17 сентября 2011

Также рассмотрите возможность использования JOptionPane, показанного здесь , в вашем Main классе. Вы можете настроить внешний вид, включая текст кнопки , как показано в Как создавать диалоги .

2 голосов
/ 17 сентября 2011

Первый основной метод в java всегда должен быть public static void .Ниже приведен пример того, как это можно сделать.

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

import javax.swing.JButton;
import javax.swing.JFrame;
import javax.swing.JOptionPane;
import javax.swing.JPanel;
import javax.swing.JTextField;

/**
 * Main class is frame but also implements ActionListener interface.
 */
public class Main extends JFrame implements ActionListener {
    private JButton btnStart;
    private static Main frame;

    public Main() {
        JPanel panel = new JPanel();
        btnStart = new JButton("Press me");

        // Add action listener. Listener could be any class that implements
        // ActionListener
        btnStart.addActionListener(this);

        // This means add button btnStart to panel
        panel.add(btnStart);

        // This means add panel to frame
        this.add(panel);
    }

    // main method in java always must be public, static and void. You forgot to
    // put static.
    public static void main(String[] args) {
        if (args.length == 0) {
            frame = new Main();
            frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
            frame.pack();
            frame.setVisible(true);
        } else
            frame.startProcess(args);
    }

    public void startProcess(String[] args) {
        // TODO
    }

    @Override
    public void actionPerformed(ActionEvent arg0) {
        // Here you put your code that is executed every time you press button.
        // For example you just want to show message.
        JOptionPane.showMessageDialog(this, "You pressed Button.");

    }
}

Но гораздо лучше иметь специальный класс.Например:

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

import javax.swing.JFrame;
import javax.swing.JOptionPane;


    public class ButtonListener implements ActionListener {
        JFrame parent;

        public ButtonListener(JFrame parent) {
            this.parent = parent;
        }

        @Override
        public void actionPerformed(ActionEvent e) {
            JOptionPane.showMessageDialog(parent, "You pressed Button");
        }

    }

А в основном классе вы просто добавляете слушатель действия к кнопке:

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

import javax.swing.JButton;
import javax.swing.JFrame;
import javax.swing.JOptionPane;
import javax.swing.JPanel;
import javax.swing.JTextField;

/**
 * Main class is frame but also implements ActionListener interface.
 */
public class Main extends JFrame {
    private JButton btnStart;
    private static Main frame;

    public Main() {
        JPanel panel = new JPanel();
        btnStart = new JButton("Press me");


        ButtonListener listener = new ButtonListener(this);
        // Add action listener. Listener could be any class that implements
        // ActionListener
        btnStart.addActionListener(listener);

        // This means add button btnStart to panel
        panel.add(btnStart);

        // This means add panel to frame
        this.add(panel);
    }

    // main method in java always must be public, static and void. You forgot to
    // put static.
    public static void main(String[] args) {
        if (args.length == 0) {
            frame = new Main();
            frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
            frame.pack();
            frame.setVisible(true);
        } else
            frame.startProcess(args);
    }

    public void startProcess(String[] args) {
        // TODO
    }
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...