【问题标题】:Java GUI won't display JLabelJava GUI 不会显示 JLabel
【发布时间】:2012-11-11 06:55:43
【问题描述】:

我想用 Java 创建一个简单的 GUI。我知道创建JLabel 等的基础知识。但是,我找不到为什么我的JLabel 没有显示在屏幕上。这是我的代码:

package test;

import java.awt.Color;
import java.awt.Font;
import java.awt.GridLayout;
import java.awt.event.*;
import javax.swing.*;

public class A1Panel extends JPanel implements ActionListener { 
    JLabel firstInt;

    public void init() {
        makeComponents();
        makeLayout();
    }

    private void makeComponents() {
        firstInt = new JLabel("First argument");
        firstInt.setFont(new Font("Helvetica", Font.BOLD, 16));
        firstInt.setBackground(Color.lightGray);
        firstInt.setVisible(true);
        firstInt.setHorizontalAlignment(SwingConstants.CENTER);
    }

    private void makeLayout() {
        add(firstInt);
    }

    public void actionPerformed(ActionEvent e) {    
    }
}

然后我使用另一个名为 GUI 的类将我的 JPanel 添加到我的 JFrame

import test.A1Panel;

public class GUI {
public static void main(String[] args) {       
    JFrame frame = new JFrame("Testing GUI"); 
    frame.setLayout( new GridLayout(1,3));

    JPanel panel = new A1Panel();
    panel.setBorder( BorderFactory.createRaisedBevelBorder() );
    frame.add( panel);

    frame.setSize(800,600);
    frame.setLocationRelativeTo(null);
    frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
    frame.setVisible(true);
    frame.pack();
    }
}

当我点击编译时,我得到的是一个带有三个 面板的简单框架。我不明白为什么我的JLabel 不在第一个面板中,因为我已将它添加到我的框架中。我错过了什么吗?

【问题讨论】:

  • 在 EDT 线程上调用 Swing 相关的代码,而不是在主线程上。

标签: java swing user-interface jpanel frame


【解决方案1】:

框架不是空的,面板是。在您的代码中,我没有看到对方法 init()makeComponents() 的调用。实际上,我会将您的 init() 方法变成构造函数,如下所示:

public A1Panel() {
    makeComponents();
    makeLayout();
}

另一种方法是在声明 JPanel panel = new A1Panel() 后调用 panel.init()

【讨论】:

    【解决方案2】:

    实例化 A1Panel 后,您还没有调用 A1Panel.init()

    我建议删除init() 并将所有代码添加到A1Panel 的构造函数中。但是,如果您想保留 init() 函数,则需要在 JPanel panel = new A1Panel() 之后调用它

    【讨论】:

    • 那我应该在哪里称呼它?
    • @fireshadow52,不正确。如果他要调用panel.init(),它会起作用,而无需static 修饰符。
    【解决方案3】:

    添加标签的代码实际上并没有在 main 中调用,是吗?所以仔细看,init 到底是什么时候调用的?

    看看

    private void makeLayout()
    

    方法。

    【讨论】:

      【解决方案4】:

      如果我将public void init() 替换为A1Panel(),它就可以完成工作。感谢您的帮助。

      【讨论】:

        猜你喜欢
        • 2018-02-21
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2013-04-27
        • 2017-07-11
        相关资源
        最近更新 更多