2012-11-22 89 views
1

我想用Java创建一个简单的GUI。我知道创建JLabel等的基本知识。但是,我找不到为什么我的JLabel没有显示在屏幕上。这里是我的代码:Java GUI不会显示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) {  
    } 
} 

我再加入我的JPanelJFrame使用不同的类名为GUI:

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不在第一个面板中,因为我已将它添加到我的框架中。我错过了什么吗?

+0

呼叫摇摆相关的代码后,不主线程。 –

回答

1

添加标签的代码实际上并未在主要中调用,是吗?所以仔细看一下,init是什么时候实际调用的?

看那

private void makeLayout() 

方法。

2

你以后实例A1Panel,你有没有叫A1Panel.init()

我建议删除init()并添加所有代码的A1Panel构造。但是,如果你想保持init()功能,你会怎么称呼它后JPanel panel = new A1Panel()

+0

然后我应该在哪里调用它? – iHubble

+0

@ fireshadow52,不正确。如果他要调用'panel.init()',它可以工作,而不需要'static'修饰符。 – Timr

1

如果我通过A1Panel()更换public void init(),它的工作。感谢您的帮助。

2

框架不是空的,面板是。我的代码中没有任何地方可以看到对方法init()makeComponents()的调用。事实上,我会变成你的init()方法为构造函数,像这样:

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

这另一种方法是调用panel.init()的EDT线程上宣布JPanel panel = new A1Panel()