JLabel没有出现在JPanel上

时间:2015-05-22 15:49:47

标签: java swing jframe jpanel jlabel

出于某种原因,即使我已在我的代码中实现了validate方法,并将我的JPanel添加到了我的JFrame中。我也试图让我的JLabel拥有Comic Sans字体,并让它在屏幕中居中。为什么我的JLabel没有出现在我的JPane上

package math_program;

import java.awt.Color;
import java.awt.Font;
import java.util.Random;
import javax.swing.*;
import static javax.swing.JFrame.EXIT_ON_CLOSE;

public class Canvas 
{
    Images obj = new Images();

    public void paintFrame()
    {
        //Instantiation of objects
        Random gen = new Random();
        JFrame frame = new JFrame();
        JPanel panel = new JPanel();

        //Text
        JLabel problem = new JLabel();

        frame.setVisible(true);
        frame.setAlwaysOnTop(true);
        frame.setResizable(false);
        frame.setDefaultCloseOperation(EXIT_ON_CLOSE); //Make frame actually closeable
        frame.setTitle("Math Owl: Alpha V:0.1 (coded by John)");
        frame.setSize(800, 500);
        frame.setLocationRelativeTo(null);
        frame.add(panel); //Add JPanel to JFrame
        panel.setVisible(true);
        panel.setLayout(null);
        panel.setBackground(Color.WHITE); //To see if text is even appearing

        //Adding Components
        problem.setFont(new Font("Comic Sans MS", Font.PLAIN, 20));
        problem.setLocation(400,250);
        problem.setText(gen.nextInt(11) + " + " + gen.nextInt(11));
        panel.add(problem);
        panel.validate();

    }

}

3 个答案:

答案 0 :(得分:0)

使用合适的布局管理器就像copeg所说的那样。即使是默认的布局管理器(Flow Layout)也可以使用。只需删除panel.setLayout(null);,您的JLabel即会显示。

另外,当我尝试你的代码段代码时Images obj = new Images();也有问题我假设你已经在你的包中定义了Images类。 `

答案 1 :(得分:0)

    public void switchCamera(){
    Log.i(TAG, "Switching Camera");
    if (mCamera != null) {
        mCamera.stopPreview();
        mCamera.release();
        //mCamera = null;
    }

    //swap the id of the camera to be used
    if (camId == Camera.CameraInfo.CAMERA_FACING_BACK) {
        camId = Camera.CameraInfo.CAMERA_FACING_FRONT;
    }else {
        camId = Camera.CameraInfo.CAMERA_FACING_BACK;
    }
    try {
        mCamera = Camera.open(camId);
        //mCamera.setDisplayOrientation(90);
        //You must get the holder of SurfaceView!!!
        mCamera.setPreviewDisplay(mView.getHolder());
        //Then resume preview...
        mCamera.startPreview();
    }
    catch (Exception e) { e.printStackTrace(); }
}

答案 2 :(得分:0)

问题是,使用null布局时,您必须同时设置每个组件的位置和大小。您只设置标签的位置,因此您可以使用problem.setSize(x, y);进行修复。话虽如此,采取这种方法是错误的。查看此框架的整个GUI设计是什么样的,然后选择appropriate LayoutManager

试试这个:

public class MyCanvas {

    public MyCanvas() {

        Random gen = new Random();
        JFrame frame = new JFrame();
        JPanel panel = new JPanel();
        JLabel problem = new JLabel();

        panel.setBackground(Color.WHITE);

        problem.setFont(new Font("Comic Sans MS", Font.PLAIN, 20));
        problem.setText(gen.nextInt(11) + " + " + gen.nextInt(11));
        panel.add(problem); // Default FlowLayout

        frame.add(panel); // Default BorderLayout at position CENTER
        frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        frame.setTitle("Math Owl: Alpha V:0.1 (coded by John)");
        frame.pack();
        frame.setLocationRelativeTo(null);
        frame.setVisible(true);
    }

    public static void main(String[] args) {

        new MyCanvas();
    }
}

注意:

  • frame.setVisible(true)应该是您的最后一次通话。
  • frame.setAlwaysOnTop(true)frame.setResizable(false)是您通常希望从用户的角度避免的事情。
  • frame.setSize(...)应替换为frame.pack()
  • 应在frame.setLocationRelativeTo(null)pack()之间调用
  • setVisible(true)
  • 不需要panel.setVisible(true),它对您没有任何帮助。
  • 不需要panel.validate()(应该是revalidate()),只有在运行时更改布局时才需要它。
  • 班级Canvas已存在,请使用其他名称。