2015-02-15 2 views
1

Я пытаюсь добавить MessagePanel, который расширяет JPanel в JFrame, так что он просто находится в центре и занимает все, что я делал много раз раньше, но теперь для некоторых Причина, по которой она появляется в нижней правой четверти JFrame, и я не могу понять, почему. Я добавил границу вокруг нее, чтобы я мог видеть, где она находится. Кто-нибудь знает, что случилось?JPanel отображается в нижнем правом квартале JFrame

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

public class Book extends JFrame{ 

    public Book(){ 
     setLayout(new BorderLayout()); 
     add(new MessagePanel("My Message"), BorderLayout.CENTER); 
    } 

    public static void main(String[] args){ 
     Book f = new Book(); 
     f.setDefaultCloseOperation(Book.EXIT_ON_CLOSE); 
     f.setTitle("Title"); 
     f.setSize(500, 500); 
     f.setLocationRelativeTo(null); 
     f.setVisible(true); 
    } 
} 

//

import java.awt.Color; 
import java.awt.Font; 
import java.awt.FontMetrics; 
import java.awt.Graphics; 
import javax.swing.JPanel; 
import javax.swing.border.LineBorder; 


public class MessagePanel extends JPanel{ 
    private String message = ""; 
    private boolean centered; 
    private int x = 20; 
    private int y = 20; 
    private int interval = 10; 

    public MessagePanel(){ 
    } 

    public MessagePanel(String message){ 
     this.message = message; 
     this.centered = true; 
     setBorder(new LineBorder(Color.BLACK, 2)); 
    } 

    public void setMessage(String message){ 
     this.message = message; 
     repaint(); 
    } 

    public void setCentered(boolean centered){ 
     this.centered = centered; 
     repaint(); 
    } 

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

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

    public int getX(){ 
     return x; 
    } 

    public int getY(){ 
     return y; 
    } 

    public void setInterval(int interval){ 
     this.interval = interval; 
     repaint(); 
    } 

    @Override 
    protected void paintComponent(Graphics g){ 
     super.paintComponent(g); 

     if(centered){ 
      FontMetrics fontMetrics = g.getFontMetrics(); 
      x = (getWidth()/2) - (fontMetrics.stringWidth(message)/2); 
      y = (getHeight()/2) + (fontMetrics.getAscent()/2); 

     } 
     g.drawString(message, x, y); 

    } 

    public void moveUp(){ 
     this.y -= interval; 
     repaint(); 
    } 

    public void moveDown(){ 
     this.y += interval; 
     repaint(); 
    } 

    public void moveLeft(){ 
     this.x -= interval; 
     repaint(); 
    } 

    public void moveRight(){ 
     this.x += interval; 
     repaint(); 
    } 
} 

ответ

2

Не перегружайте GetX(), Setx (...), GetY() и сеты (...).

Это методы класса Component и используются для управления расположением компонента.

Если вы хотите управлять расположением текста, используйте разные переменные.

Смежные вопросы