Закрытие другого JFrame из другого метода - PullRequest
1 голос
/ 02 марта 2012

Я работаю над этим в течение некоторого времени, и я действительно ценю некоторую помощь прямо сейчас.Я пытаюсь заставить JFrame, содержащий поля ввода текста, закрыться из моего метода actionPerformed, но я не могу заставить что-либо работать.JFrame.dispose не позволит мне получить доступ к правильному Jframe, и setVisible (false) одинаково бесполезен, если я не делаю это совершенно неправильно.

//halp
import javax.swing.*;
import java.awt.*;

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

class PersonInput extends JPanel
              implements ActionListener {

//Fields for data entry
private JFormattedTextField firstField, lastField, dateField;

public String x[] = new String[3];

public PersonInput() {

    //Values for the fields
    String first = "First Name";
    String last = "Last Name";
    String date = "MM/DD/YYYY";


    //Create the text fields and set them up.
    firstField = new JFormattedTextField();
    firstField.setValue(new String(first));

    lastField = new JFormattedTextField();
    lastField.setValue(new String(last));

    dateField = new JFormattedTextField();
    dateField.setValue(new String(date));
    dateField.setColumns(10);

    JButton ok = new JButton("OK");
    ok.setVerticalTextPosition(AbstractButton.BOTTOM);
    ok.setHorizontalTextPosition(AbstractButton.CENTER);
    ok.setActionCommand("ok");
    ok.addActionListener(this);
    ok.setToolTipText("Confirms user input and continues with the program.");

    JPanel buttons = new JPanel(new GridLayout(0,1));
    buttons.add(ok);


    //Layout the text fields in a panel.
    JPanel fieldPane = new JPanel(new GridLayout(0,1));
    fieldPane.add(firstField);
    fieldPane.add(lastField);
    fieldPane.add(dateField);

    //Put the panels in this panel, labels on left,
    //text fields on right.
    setBorder(BorderFactory.createEmptyBorder(20, 20, 20, 20));
    add(fieldPane, BorderLayout.CENTER);
    add(buttons, BorderLayout.LINE_END);


}

public void actionPerformed(ActionEvent e) {
    if ("ok".equals(e.getActionCommand()))
    {
            JFrame frame1 = new JFrame("People Sorter");

        x[0] = firstField.getText();
        x[1] = lastField.getText();
        x[2] = dateField.getText();

        JOptionPane.showMessageDialog(frame1, "Person has been added.");
        dispPerson();
        frame.setVisible(false);
    }
}

public void dispPerson()
{
    System.out.println(x[0] + x[1] + x[2]);

}
public static void createAndShowGUI() {
    //Create and set up the window.
    JFrame frame = new JFrame("Person Input");
    frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);

    //Add contents to the window.
    frame.add(new PersonInput());

    //Display the window.
    frame.pack();
    frame.setVisible(true);
}

public static void main(String[] args) {

    SwingUtilities.invokeLater(new Runnable() {
        public void run() {
            //Turn off metal's use of bold fonts
        UIManager.put("swing.boldMetal", Boolean.FALSE);
            createAndShowGUI();
        }
    });
}
}

Я весь слух, если у кого-то есть идеи;Я был напряжён из-за этого весь день.Большое спасибо за то, что уделили мне время!

РЕДАКТИРОВАТЬ: Просто для пояснения, кадр, который я пытаюсь закрыть, создан в методе createAndShowGUI.

1 Ответ

0 голосов
/ 16 мая 2012

похоже, проблема в том, что мы пытаемся объединить как статическое, так и нестатическое содержимое.Для краткого объяснения можно ссылаться на статическое содержимое без необходимости создания экземпляра (объекта) этого класса.Это означает, что createAndShowGUI может быть вызван:

внутри другого статического метода (например, основного) Из ссылки на класс PersonInput.createAndShowGUI () или из объекта, но этот метод или атрибут всегда будут одинаковыми, статические атрибуты являются общими.

Я могу предложить 2 способа решения вашей проблемы.

Один из них - передать фрейм объекта PersonInput

//halp
import javax.swing.*;
import java.awt.*;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.awt.event.KeyEvent;
class PersonInput extends JPanel
              implements ActionListener {
//Fields for data entry
private JFormattedTextField firstField, lastField, dateField;

public String x[] = new String[3];


JFrame frame;
public PersonInput(JFrame frame) {
this.frame = frame;
//the rest of your code
}

Другой способ - получить объект фрейма снаружи.метод и объявить его статическим.

static JFrame frame = new JFrame("Person Input");;
public static void createAndShowGUI() {
    //Create and set up the window.
    frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
    //Add contents to the window.
    frame.add(new PersonInput());
    //Display the window.
    frame.pack();
    frame.setVisible(true);
}

Помните, что static variable cannot be referenced from a static context

...