Java: не может печатать на TextArea из другого класса - PullRequest
2 голосов
/ 21 марта 2012

У меня есть один кадр, в котором есть одна TestArea.Когда я добавляю некоторую строку из этого класса, тогда добавляется строка, но когда я хочу добавить строку из другого класса, строка не добавляется.Я создал один метод для добавления строки в TextArea, когда я вызываю этот метод в этом классе, тогда строка добавляется в текстовую область.Но когда я вызываю этот метод из другого класса, строка не добавляется в TextArea.

Код (MainClass):

public class MainClass {
private JFrame frame;
private TextArea textArea;
private Font font;
private JButton button1;
private JButton button2;
private SecondClass secondClass;

public MainClass() {
    try {
        UIManager.setLookAndFeel(UIManager.getSystemLookAndFeelClassName());
        frame = new JFrame("XXX");
        frame.setBounds(200, 200, 600, 400);
        frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        frame.getContentPane().setLayout(null);

        button1 = new JButton("Button1");
        font = new Font("Arial", Font.BOLD, 13);
        button1.setFont(font);
        button1.setBounds(4, 4, 289, 30);

        button2 = new JButton("Button2");
        button2.setFont(font);
        button2.setBounds(300, 4, 289, 30);

        font = null;

        textArea = new TextArea();
        textArea.setBounds(4, 38, 585, 322);
        textArea.setEnabled(true);

        font = new Font("Arial", Font.PLAIN, 13);
        textArea.setFont(font);

        frame.add(button1);
        frame.add(button2);
        frame.add(textArea);

        button1.addActionListener(new ActionListener() {
            @Override
            public void actionPerformed(ActionEvent arg0) {
                textArea.append("*** I am in actionPerformed() ***\n");
                appendToTextArea("Call from actionPerformed() method\n");
            }
        });

        button2.addActionListener(new ActionListener() {
            @Override
            public void actionPerformed(ActionEvent arg0) {
                secondClass = new SecondClass();
                secondClass.printOnTextArea();
            }
        });

    } catch (Exception e) {
        textArea.append(e.toString());
    }
}

public void appendToTextArea(String str) {
    System.out.println(str+"\n");

    textArea.append(str+"\n"); //this line not work when I call this method from other class
}

public static void main(String[] args) {
    EventQueue.invokeLater(new Runnable() {
        @Override
        public void run() {
            MainClass window = new MainClass();
            window.frame.setVisible(true);
        }
    });
}

}

Код (SecondClass):

import com.grissserver.MainClass;

public class SecondClass extends MainClass{
void printOnTextArea() {
    System.out.println("*** printOnTextArea() ***");
    super.appendToTextArea("call from Second Class in printOnTextArea()");
}
}

Пожалуйста, дайте некоторую идею, почему это не работает.

Ответы [ 2 ]

4 голосов
/ 21 марта 2012

Мне кажется, проблема в том, что вы пытаетесь рисовать в текстовой области неправильно.

В вашем методе действия вы создаете новый объект SecondClass, который расширяет MainClass. Это означает, что этот объект имеет свой собственный объект textarea. Но этот новый объект (рамка) не отображается, потому что вы вызываете только setVisibile в MainClass#main, и, следовательно, вы не можете видеть отображаемый текст!

Короче говоря: есть две разные текстовые области! И одного из них не видно

3 голосов
/ 21 марта 2012

SecondClass имеет собственную текстовую область. Таким образом, вам может потребоваться передать текстовое поле MainClass в SecondClass .

public class SecondClass {
    private TextArea tArea;
    SecondClass(TextArea ta) {
        tArea = ta;
    }
    void printOnTextArea() {
        System.out.println("*** printOnTextArea() ***");
        tArea.append("call from Second Class in printOnTextArea()");
    }
}

Вы должны изменить свой MainClass следующим образом.

....
button2.addActionListener(new ActionListener() {
    @Override
    public void actionPerformed(ActionEvent arg0) {
        secondClass = new SecondClass(textArea);
        secondClass.printOnTextArea();
    }
});
....

надеюсь, это поможет ...

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...