Изменение свойств компонента JPanel с помощью события action

#java #jframe #jpanel #actionlistener

#java #jframe #jpanel #actionlistener

Вопрос:

Я пытаюсь настроить систему, в которой при нажатии кнопки текст 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. кстати, я все еще новичок в Java, поэтому я понимаю, может ли это показаться глупым вопросом

Ответ №1:

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

 b1.addActionListener(new ActionListener(){

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

}

});
  

Комментарии:

1. как бы я это сделал

2. ранее я пытался поместить прослушиватель действий в класс window и получил кучу ошибок, поэтому я не совсем уверен, как бы я это сделал

3. реализовать прослушиватель в классе window внутри метода конструктора

4. БОЛЬШОЕ ВАМ СПАСИБО … это сработало. Извините, если мой вопрос показался немного глуповатым… но спасибо за помощь

5. черт возьми, неужели я чувствую себя идиотом из-за того, что не сделал этого в первую очередь XD