如何将JPanel添加到JFrame的中心?

时间:2016-11-12 21:26:53

标签: java swing jframe jpanel awt

我尝试制作一个JFrame,其中我有一个JPanel(包含一个圆圈),它有四个按钮(北,南,东,西)。圆圈将按下按钮指示的方向移动 我的问题是我无法将我的JPanel放在中心位置:

https://i.stack.imgur.com/Cv12Q.png

JFrame的课程如下所示:

import java.awt.BorderLayout;
import java.awt.Color;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;

import javax.swing.JButton;
import javax.swing.JFrame;

@SuppressWarnings("serial")
public class Frame extends JFrame implements ActionListener {

JButton north, south, east, west;
int x = 10, y = 10;
MyPanel panel;

public Frame() {
    setLayout(new BorderLayout());
    panel = new MyPanel();
    panel.setBackground(Color.MAGENTA);

    north = new JButton("NORTH");
    south = new JButton("SOUTH");
    east = new JButton("EAST");
    west = new JButton("WEST");

    add(panel, BorderLayout.CENTER);
    add(north, BorderLayout.NORTH);
    add(south, BorderLayout.SOUTH);
    add(east, BorderLayout.EAST);
    add(west, BorderLayout.WEST);

    north.addActionListener(this);
    south.addActionListener(this);
    east.addActionListener(this);
    west.addActionListener(this);

    setBounds(100, 100, 300, 300);
    setVisible(true);
}

@Override
public void actionPerformed(ActionEvent e) {
    if (e.getSource() == north) {
        y -= 3;
        panel.setY(y);
        panel.repaint();
    }

    if (e.getSource() == south) {
        y += 3;
        panel.setY(y);
        panel.repaint();
    }

    if (e.getSource() == east) {
        x += 3;
        panel.setX(x);
        panel.repaint();
    }

    if (e.getSource() == west) {
        x -= 3;
        panel.setX(x);
        panel.repaint();
    }
}
}

MyPanel类看起来像这样:

import java.awt.Color;
import java.awt.Graphics;

import javax.swing.JPanel;

@SuppressWarnings("serial")
public class MyPanel extends JPanel {
private Color color = Color.CYAN;
private int x = 10, y = 10;

public void paint(Graphics g) {
    super.paintComponent(g);
    g.setColor(color);
    g.fillOval(x, y, 20, 20);
}

public int getX() {
    return x;
}

public void setX(int x) {
    this.x = x;
}

public int getY() {
    return y;
}

public void setY(int y) {
    this.y = y;
}
}

1 个答案:

答案 0 :(得分:1)

不要覆盖自定义面板的getX()getY()方法。 Swing使用这些方法来确定组件的位置。

相反,您应该拥有setCirleX(...)setCircleY(...)getCircleX()getCircleY()等方法。