Изменить свойства компонента JPanel с помощью события действия - PullRequest
0 голосов
/ 03 марта 2019

Я пытаюсь настроить систему, в которой при нажатии кнопки текст JLabel изменится, но я не могу заставить его работать.Я уже проверял, что слушатель действия работает, выполняя 'system.out.println ("test"); ".Это работает нормально, но при попытке изменить текст JComponent это не работает.Я уже искал ответы и не нашел ничего подходящего.

Основной класс:

package com.fcs.app;

public class A {
   public static void main(String args[]) {

    window w = new window();

    w.drawWindow();
   }
}

Класс JFrame и JPanel:

package com.fcs.app;

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

public class window extends JPanel {

JFrame jf = new JFrame();
JPanel jp = new JPanel();
JButton b1 = new JButton();
JTextField tf1 = new JTextField();
JTextField tf2 = new JTextField();
JLabel plus = new JLabel();
JLabel equals = new JLabel();
JLabel rt = new JLabel();

int Result = 10;

public void drawWindow() {

    //JFrame setup
    jf.setSize(400, 400);
    jf.setUndecorated(true);
    jf.setLayout(null);
    jf.setContentPane(jp);
    jf.setLocation(100, 100);
    jf.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
    jf.setVisible(true);

    //JPanel setup
    jp.setSize(400, 400);
    jp.setLocation(0, 0);
    jp.setBackground(Color.WHITE);
    jp.add(b1);
    jp.add(tf1);
    jp.add(tf2);
    jp.add(plus);
    jp.add(equals);
    jp.add(rt);
    jp.setLayout(null);
    jp.setVisible(true);

    //JButton setup
    b1.setFont(new Font("Times", Font.PLAIN, 15));
    b1.setText("Calculate!");
    b1.setSize(100, 40);
    b1.setLocation(150, 350);
    b1.addActionListener(new Listener());
    b1.setVisible(true);

    //TextField 1 setup
    tf1.setSize(120, 50);
    tf1.setLocation(140, 20);
    tf1.setFont(new Font("Times", Font.PLAIN, 25));
    tf1.setHorizontalAlignment(JTextField.CENTER);
    tf1.setVisible(true);

    //TextField 2 setup
    tf2.setSize(120, 50);
    tf2.setLocation(140, 120);
    tf2.setFont(new Font("Times", Font.PLAIN, 25));
    tf2.setHorizontalAlignment(JTextField.CENTER);
    tf2.setVisible(true);

    //Plus sign Setup
    plus.setSize(120, 50);
    plus.setLocation(140, 70);
    plus.setHorizontalAlignment(JLabel.CENTER);
    plus.setFont(new Font("Times", Font.PLAIN, 40));
    plus.setText("+");
    plus.setVisible(true);

    //Equals sign Setup
    equals.setSize(120, 50);
    equals.setLocation(140, 170);
    equals.setHorizontalAlignment(JLabel.CENTER);
    equals.setFont(new Font("Times", Font.PLAIN, 40));
    equals.setText("=");
    equals.setVisible(true);

    //Result text
    rt.setSize(400, 50);
    rt.setLocation(0, 250);
    rt.setHorizontalAlignment(JLabel.CENTER);
    rt.setFont(new Font("Times", Font.PLAIN, 60));
    rt.setText("");
    rt.setVisible(true);
}
}

Класс ActionListener:

package com.fcs.app;

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

public class Listener implements ActionListener {

window w = new window();

@Override
public void actionPerformed(ActionEvent e) {
    // TODO Auto-generated method stub
    w.rt.setText("Test");
    }
}

1 Ответ

0 голосов
/ 03 марта 2019

Вы создаете новые ссылки на Window, такие как window w = new window ();это создаст новый экземпляр окна, а вы пытаетесь изменить только что созданное окно.Попробуйте передать объект окна, который вы создали ранее, в классе окна или реализовать анонимный ActionListener в классе окна.

b1.addActionListener(new ActionListener(){

@Override
public void actionPerformed(ActionEvent e) {
    // TODO Auto-generated method stub
    rt.setText("Test");
    }

}

});
...