【问题标题】:JPanel displaying in bottom right quarter of JFrameJPanel 显示在 JFrame 的右下角
【发布时间】:2015-02-15 19:32:16
【问题描述】:

我正在尝试添加一个将 JPanel 扩展为 JFrame 的 MessagePanel,以便它简单地位于中心并占据整个事情,我以前做过很多次但现在由于某种原因它出现在右下角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();
    }
}

【问题讨论】:

    标签: java swing


    【解决方案1】:

    不要覆盖 getX()、setX(...)、getY() 和 setY(...)。

    这些是 Component 类的方法,用于控制组件的位置。

    如果要控制文本的位置,请使用不同的变量。

    【讨论】:

      猜你喜欢
      • 2011-07-18
      • 2014-10-02
      • 2014-03-16
      • 1970-01-01
      • 2014-08-15
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多