2016-11-12 6 views
0

Я пытаюсь создать JFrame, в котором у меня есть JPanel (который содержит круг), и он ограничен четырьмя кнопками (север, юг, восток, запад). Круг будет двигаться в направлении, указанном нажатой кнопкой.
Моя проблема заключается в том, что я не могу управлять, чтобы положить мои JPanel в центре:Как добавить JPanel в центр JFrame?

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

класс фрейму выглядит следующим образом:

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; 
} 
} 
+0

[много дубликатов] (https://www.google.com/webhp?sourceid=chrome-instant&ion=1&espv=2&ie=UTF-8#q=site:stackoverflow.com+java+swing+center+jpanel+ in + jframe) –

+0

@HovercraftFullOfEels, пожалуйста, посмотрите изображение и код (прежде чем вы будете закрывать вопросы как дубликаты). Почему панель пурпурного цвета должна быть окрашена над другими компонентами, когда используется простой BorderLayout? Панель пурпурного цвета должна быть посередине. Проблема заключается в коде, который мы не видим. – camickr

+0

Этот вопрос был первоначально закрыт как дубликат: http://stackoverflow.com/questions/7223530/how-can-i-properly-center-a-jpanel-fixed -size-внутри-а-JFrame. Я открыл его, потому что я не верю, что это дубликат. Если вы замените «MyPanel» на «JPanel», панель будет выложена в центре. Поэтому проблема заключается в обычном классе «MyPanel», и у нас нет доступа к этому коду, поэтому мы не можем помочь. – camickr

ответ

1

не перегружайте getX() и getY() методы пользовательских панель. Эти методы используются Swing для определения местоположения компонента.

Вместо этого у вас должны быть такие методы, как setCirleX(...), setCircleY(...), getCircleX() и getCircleY().

+0

Большое спасибо! – Barbi