Форма не появится, когда я добавлю JButton в JPanel

Я пытаюсь сделать панель, которая содержит форму и кнопку. Проблема в том, что когда я добавляю кнопку в JPanel, форма не появляется. Это просто показывает кнопку в верхней части моего экрана. Квадрат отображается только при добавлении квадрата к рамке вместо панели, но кнопка не появится.

public static void main(String[] args)
{
    JFrame frame = new JFrame();
    JPanel panel = new JPanel(); 
    //Replace FRAME_WIDTH/HEIGHT with a number greater than 100
    frame.setSize(FRAME_WIDTH, FRAME_HEIGHT);
    frame.setTitle("Square Game");
    frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);

    //Creates a Red Square from RedSquare 
    final RedSquare red = new RedSquare();
    panel.add(red);

    JButton button = new JButton();
    button.setText("Red");
    panel.add(button);

    frame.add(panel);

    frame.setVisible(true);

}

public class RedSquare extends JComponent
{
private Square sq;
private int x = 100;
private int y = 0;
private Graphics2D g2;

public RedSquare()
{
    sq = new Square(x,y,Color.red);
}

public void paintComponent(Graphics g)
{
    Graphics2D g2 = (Graphics2D) g;
    sq.draw(g2);
}

public int getX()
{
    return x;
}

public int getY()
{
    return y;
}

public void moveBy()
{
    y++;
    sq = new Square(x,y,Color.red);
    repaint();
}
}

public class Square
{
private int x;
private int y;
private Color color;

public Square(int x, int y, Color color)
{
    this.x = x;
    this.y = y;
    this.color = color;
}

public void draw(Graphics2D g2)
{
    Rectangle body = new Rectangle(x, y, 40, 40);
    g2.draw(body);
    g2.setPaint(color);
    g2.fill(body);
    g2.draw(body);
}
}

Нужно ли делать что-то еще, чтобы сделать эту работу? Я что-то пропустил? Я новичок в этом, и любая помощь очень ценится.

3 ответа

Необычно, что вы расширяете JComponent, который является абстрактным, хотя и не запрещенным.

Одним из решений является использование JPanel вместо JComponent.

А также установив координату x на x=0, вы увидите квадрат.

Помимо этого вы можете использовать макет и т. Д.:

panel.setLayout(new BorderLayout());

....


panel.add("Center", red);


.......

panel.add("South", button);

Я думаю, что вы должны установить макет на панели, используя panel.setLayout(new FlowLayout()); перед добавлением чего-либо в панель, чтобы она показала обе ваши фигуры. Как это переопределяет прямо сейчас.

При добавлении компонентов в JFrame попробуйте использовать setContentPane, а не add. Итак, из вашего примера выше, удалите frame.add(panel); и использовать frame.setContentPane(panel);

Другие вопросы по тегам