JComponent不设置位置也不设置文本

时间:2016-04-27 23:53:29

标签: java jframe jbutton jcomponent

在下面的代码中我只想将位置和文本分配给JFrame上的按钮组件,但是它总是将它们指定为屏幕的高度并向左压缩而不显示我指定的文本。关心任何帮助?

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

class Main
{
    public static final String SIMULATOR_NAME = "Flocking Simulator 2K16"; //Simulator window name.
    private static final String SPARROW_GRAPHIC = "Bird.png"; //Graphic image for sparrows.
    public static final int MAXIMUM_WIDTH = 800; //Simulator window width.
    public static final int MAXIMUM_HEIGHT = 600; //Simulator window height.

    private static final int DEFAULT_BIRDS = 50; //Default number of birds on program launch.
    private static final int MINIMUM_BIRDS = 5; //Minimum quantity of birds.
    private static final int MAXIMUM_BIRDS = 100; //Maximum quantity of birds.
    private static final double DEFAULT_VELOCITY = 0.25; //Move at 0.25 pixels per 1ms.
    private static final int MOVEMENT_DELAY = 5; //Update movement every 5ms.
    private static final int MOVEMENTS_UNTIL_NEXT_UPDATE = 5; //Update directions every 25ms.

    private static JFrame frame; //Frame used from the JFrame class to draw graphics onto.

    private static Flock sparrows; //The flock of sparrows used for the simulator.

    private static JButton addBird; //The button object for adding a bird.
    private static JButton removeBird; //The button object for adding a bird.

    public static void main(String [ ] args)
    {
        Initialize();
        GameLoop();
    }

    private static void Initialize()
    {
        frame = new JFrame(SIMULATOR_NAME + " - Number Of Birds: " + DEFAULT_BIRDS);
        frame.setSize(MAXIMUM_WIDTH, MAXIMUM_HEIGHT);
        frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        frame.setLayout(new GridLayout());
        LoadObjectGraphics();
        frame.setVisible(true);
    }

    private static void LoadObjectGraphics()
    {
        sparrows = new Flock(SPARROW_GRAPHIC, DEFAULT_BIRDS, new CartesianCoordinate(MAXIMUM_WIDTH, MAXIMUM_HEIGHT), DEFAULT_VELOCITY);

        for (int i = 0; i < DEFAULT_BIRDS; i++)
        {
            frame.add(sparrows.GetBird(i).BirdGraphic());
        }

        LoadUI();
    }

    private static void LoadUI()
    {
        addBird = new JButton("+");
        addBird.setBounds(50, 50, 50, 50);
        removeBird = new JButton("-");
        removeBird.setSize(48, 48);
        removeBird.setBounds(50, 50, 50, 50);
        frame.add(addBird);
        frame.add(removeBird);
    }

    private static void UpdateUI()
    {
        frame.setTitle(SIMULATOR_NAME + " - Number Of Birds: " + sparrows.GetMaximumBirds());
    }

    private static void GameLoop()
    {
        while (true)
        {
            //Change the directions of the birds
            sparrows.UpdateDirections();

            //Move the birds before updating directions of the birds again
            for (int i = 0; i < MOVEMENTS_UNTIL_NEXT_UPDATE; i++)
            {
                Utils.pause(MOVEMENT_DELAY); //Pause allowing program to not crash in an infinate loop
                sparrows.ProcessMovement(MOVEMENT_DELAY); //Move the birds each interval
                UpdateUI(); //Update the simulators UI
            }
        }
    }
}

As you can see, the dimensions and location of the buttons are incorrect

1 个答案:

答案 0 :(得分:0)

使用GridLayout(最简单的方法)或SpringLayout。

一个例子:

GridLayout layout = new GridLayout(/*Number of rows*/ , /*Number of columns*/);

在框架中添加此布局:

myFrame.setlayout(layout);

在GridLayout中添加组件:

layout.add(myComponent);
layout.add(mySecondComponent);

等...

GridLayout有一个完整的指南:

How to use GridLayout

SpringLayout的指南(很难使用SpringLayout,但试试):

How to use SpringLayout

SpringLayout比GridLayout好!