【问题标题】:ActionListner and ActionPerformed returning action outside of class [closed]ActionListener 和 Action 在类外执行返回动作 [关闭]
【发布时间】:2016-02-21 00:22:27
【问题描述】:

我在这个类之外创建了一个 jpanel,它有一个按钮,我希望执行以下操作也被传递。我是编程新手,不知道该怎么做。无法在线找到帮助。 b2.setText(b);

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

public class myJPanel1 extends JPanel implements ActionListener
{
        String b = "a";
    JButton jl1;

    public myJPanel1(student st1, myJPanel2 b2)
    {

                super();

        setBackground(Color.yellow);
        //JButton jl1 = new JButton(st1.getInfo());
        jl1 = new JButton(st1.getInfo());
                jl1.addActionListener(this);
                add(jl1);

    }

   @Override
        public void actionPerformed(ActionEvent e) {
        double r = Math.random();
        int myNumber = (int)(r*3f);
        if (myNumber == 0){ 

            b = "reading";

        }
        if (myNumber == 1){ 

            b = "talking";

        }
        if (myNumber == 2){ 
            b = "interacting";

            b2.setText(b);

        } 

    }     
}

导入 java.awt.; 导入 javax.swing.;

公共类 myJPanel2 扩展了 JPanel {

JButton b1,b2,b3,b4;

public myJPanel2(student st1)
{
    super();
    setBackground(Color.pink);
    //setLayout(new GridLayout(3,1));
    b1 = new JButton ("When the user clicks on the button in the UPPER panel");

    add(b1);

    b2 = new JButton("Display here whatsUp from the student in UPPER Panel" );
    add(b2);

    b3 = new JButton("===>>>>You CANNOT create a student here <======" );
    add(b3);

    b4 = new JButton("It has to be the student from the UPPER Panel" );
    add(b4);
}

}

【问题讨论】:

  • 考虑提供一个runnable example 来证明您的问题。这不是代码转储,而是您正在做的事情的一个例子,它突出了您遇到的问题。这将减少混乱并获得更好的响应
  • 根据您的示例,b2.setText 将生成 NullPointerException,因为 b2 从未初始化也不会添加到任何可见容器中,myJPanel2 也没有 setText 方法,所以,它不会编译

标签: java string swing


【解决方案1】:

JPanel 没有 setText() 方法,因此无法在面板上设置文本。

也许您正在尝试设置按钮的文本。在这种情况下,您需要将 JButton 定义为实例变量。然后在该变量上调用 setText(),而不是在面板上。

//myJPanel2 b2;
JButton jl1;

...

//JButton jl1 = new JButton(st1.getInfo());
jl1 = new JButton(st1.getInfo());

...

//b2.setText(b);//this doesn´t work   
jl1.setText(b);

【讨论】:

  • 除了谢谢你,先生什么都没做
  • @RossGerard,是的,基本概念会有所作为。如果它没有做任何事情,那么你还没有正确地实现这个概念。发布正确的SSCCE 来演示您如何测试它。类名也应以大写字符开头。因此,请在重新发布之前修复您的代码。
  • 我的意思是我尝试了推荐的更改,它对 jl1 工作正常,但这不是我试图通过操作更改的按钮。我正在尝试更改我从另一个类添加的 b2
  • 好吧,在您的代码中,您将“b2”定义为“myJPanel2”类,这样就行不通了。如果你想在另一个类中更新变量“b2”,那么你需要将“b2”按钮的引用传递给你的类,就像你将“student”引用传递给类一样。
  • 我把新代码放上去。这是我在第一次发布之前最初尝试过的。对我来说不幸的是,我仍然遇到错误,即它想要在 b2.setText(b); 处为 b2 提供一个类;
【解决方案2】:

您在按钮上设置了文本,但没有重新绘制它。拨打revalidate();,然后拨打repaint();设置文字后。

【讨论】:

  • 我不确定重绘是否正确?我认为 repaint() 与重新绘制图像有关?
  • 不,不需要调用 revalidate() 或 repaint()。当属性发生变化时,Swing 会自动重新绘制组件。
  • @RossGerard 我忘记在重新绘制之前添加重新验证。好久没用swing了。 Swing 已成为历史。
  • 代码有效 b2.repaint();但是当我按下按钮时什么也没发生
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2012-07-09
  • 1970-01-01
  • 2015-10-30
  • 2014-02-12
  • 1970-01-01
相关资源
最近更新 更多