【问题标题】:Display text to a label from another class - JFrame将文本显示到另一个类的标签 - JFrame
【发布时间】:2012-11-20 09:48:46
【问题描述】:

我有一个 GUI 屏幕,其中有一个标签。我现在想用如下所示的文本设置标签 (Test)。但它没有得到更新。我认为以下代码中有错误,我在 try 块中重新创建 FrameTest 的新对象;

FrameTest frame = new FrameTest();
frame.setVisible(true); //(the full code given below)

完整代码:注意:以下类扩展自JFrame

import java.awt.BorderLayout;

public class FrameTest extends JFrame {

    private JPanel contentPane;
    private JLabel lblLabel;

    public  void mainScreen() {
        EventQueue.invokeLater(new Runnable() {
            public void run() {
                try {
                    FrameTest frame = new FrameTest();
                    frame.setVisible(true);
                } catch (Exception e) {
                    e.printStackTrace();
                }
            }
        });
    }


    public void writeLabel(String k){
        this.lblLabel.setText(k);

    }


    public FrameTest() {
        setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        setBounds(100, 100, 450, 300);
        contentPane = new JPanel();
        contentPane.setBorder(new EmptyBorder(5, 5, 5, 5));
        contentPane.setLayout(new BorderLayout(0, 0));
        setContentPane(contentPane);

        lblLabel = new JLabel("LABEL");
        contentPane.add(lblLabel, BorderLayout.CENTER);
    }

}

测试类

public class Test {

    public static void main(String[] args) {

         FrameTest f = new FrameTest();
         f.mainScreen();
         f.writeLabel("FFFFF");
}}

求助,如何让 Text "FFFFF" 显示在标签上?

【问题讨论】:

  • setBounds(100, 100, 450, 300); 我们要说多少次?不要设置界限 - pack() 框架然后 setLocationByPlatform(true)

标签: java swing


【解决方案1】:

在您的mainScreen() 中,您创建了一个新的FrameTest,这与您在main 例程中创建的不同,因此它实际上是在更改不可见框架的文本。试试这个:

private FrameTest frame = this;

public  void mainScreen() {
    EventQueue.invokeLater(new Runnable() {
        public void run() {
                frame.setVisible(true);
        }
    });
}

或者简单地说:

public  void mainScreen() {
    EventQueue.invokeLater(new Runnable() {
        public void run() {
                setVisible(true);
        }
    });
}

【讨论】:

  • 是的,这也有效。你能评论我上面的回答吗?它是正确的还是如果我以后使用它会出现其他问题?
  • @MouseEvent 为什么必须在函数中再次引用this 对象。他为什么不直接说this.setVisible(true) 或者干脆说setVisible(true)
  • @sunil this.setVisible(true) 不会工作,因为它会引用Runnable,而不是框架,但setVisible(true) 应该可以工作。
  • 是的..你是rt。匿名类中的this 将引用Runnable 实例。我这边的错误。但是我们可以将原始的this 称为FrameTest.this。所以我们可以像 FrameTest.this.setVisible(true) 这样调用而不是重新引用对象
  • 我使用的风格是因为我想模仿OP的风格。
【解决方案2】:

为你的 FrameTest 添加一个方法

public String readLabel(){
       return this.lblLabel.getText();
}

【讨论】:

  • 我想要的是编辑来自 Class Test的标签文本
【解决方案3】:

将mainScreen()函数改为

public  void mainScreen() {
        EventQueue.invokeLater(new Runnable() {
            public void run() {
                try {
                    setVisible(true);
                } catch (Exception e) {
                    e.printStackTrace();
                }
            }
        });
    }

其余代码相同

【讨论】:

  • 这是因为,在mainScreen 函数中,您正在创建另一个 JFrame 实例并将其显示给用户。在Test 类中,您正在创建另一个JFrame 实例f。这两个对象完全不同,对一个对象所做的更改在另一个对象中是不可见的。
【解决方案4】:

您使用代码的方式不会触发重新绘制框架或标签。 在 Swing 中,您可以更改许多 Gui 对象,但它们只会在请求时在一个批次中重绘。 自动重绘最常见的情况是在您从事件处理程序返回之后。 (例如,单击按钮或按键)

【讨论】:

  • 不用这个,JLabel会自动触发。
  • JLabel(像许多组件一样)在您更改任意数量的属性时调用revalidaterepaint。我同意,有时它需要轻推,但更多时候不需要,Swing 会自行更新
【解决方案5】:

将 try 块替换为;

            try {
                setVisible(true);
            } catch (Exception e) {
                e.printStackTrace();
            }

一切正常!

【讨论】:

  • 但是,FrameTest 是从 JFrame 扩展而来的,所以我想我可以使用 setVisible 吗?
  • @MadProgrammer 哦.. 谢谢。所以如果我删除try-catch 会好吗?
  • 嗯,你是对的,它确实有效。 (但你的第一个代码没有的原因,这就是我清除的,考虑接受一些东西......)
  • 不需要异常处理程序,因为没有任何东西抛出异常; MouseEvent 的建议是正确的
猜你喜欢
  • 1970-01-01
  • 2020-08-19
  • 1970-01-01
  • 2019-06-08
  • 2014-03-12
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多