图形没有显示在调整大小的子面板上?

时间:2013-12-30 23:50:32

标签: java swing graphics

您好,我是新编程,对我来说很光。

我正在处理一个小项目的问题。我正在尝试按住鼠标按钮创建一个可移动的消息面板,但我卡在一个部分上。

我想放置一个尺寸为50x30像素的小面板,其中包含消息“java”,并将这个小面板放在一个更大的面板中,并将该面板放入我的JFrame中。

然而,当我这样做时,消息“java”消失,只有较大面板中的小面板出现。我在面板上添加了边框,以确保我的面板实际可见。请帮忙,这是我的代码:

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

public class MovingPanel extends JFrame {
    private String message;
    private int x = 100;
    private int y = 100;

    public MovingPanel() {
        JPanel panel = new JPanel();
        MessagePanel p1 = new MessagePanel("Java");
        panel.setBorder(new LineBorder(Color.RED, 2));
        panel.setLayout(null);
        p1.setLocation(x, y);
        p1.setSize(50, 30);
        p1.setBorder(new LineBorder(Color.BLACK, 2));
        p1.setLayout(new BorderLayout());
        panel.add(p1);
        add(panel);

     }

public static void main(String[] args) {

    MovingPanel frame = new MovingPanel();

    frame.setSize(500, 500);

    frame.setLocationRelativeTo(null);

    frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);

    frame.setTitle("Test Message Panel");

    frame.setVisible(true);

}

class MessagePanel extends JPanel {

    public MessagePanel(String s) {

        message = s;

    }

    protected void paintComponent(Graphics g) {

        super.paintComponent(g);

        g.drawString(message, x + 20, y + 10);

    }
}

}

2 个答案:

答案 0 :(得分:0)

也许您可以尝试使用简单的JLabel组件而不是“MessagePanel”。

答案 1 :(得分:0)

首先你需要了解的是这个。

  • g.drawString(message, x + 20, y + 10);方法的第二个和第三个参数是面板的x和y位置。

  • 如上所述,您必须记住它是包含面板的x和y位置,即MessagePanel

  • 您的MessagePanel对象的大小设置为50,30,但您正在尝试访问不存在的点120(x + 20)和110(100 + 10)因为你调整了面板的大小。

  • 所以现在已经理解了,假设你想在MessagePanel的左下角绘制消息,所以你试着这样做g.drawString(message, 0, 0);。这仍然会显示任何内容,因为该点从消息的左下角开始,因此消息实际上将位于可见区域的上方。

  • 在绘制字符串时,您需要考虑FontMetrics,它允许您获取您要绘制的字符串的大小,这样您就可以将消息准确定位在您想要的屏幕上它

  • 一个简单的修复只会设置一个x和ya略高于0,0,就像15,15。虽然这可能会让你的信息被绘制,但它不会被居中。您可以继续更改并获取不同的数字以检查它是否在中间对齐,但正确的方法是使用FontMetrics


如上所述简单(但可能不需要)修复只是改变这个

g.drawString(message, x + 20, y + 10);

g.drawString(message, 15, 15);

你会看到这条消息。


不是你在做什么,而是我会这样做。

  • 我不会使用两个面板,而是使用一个 - 正在进行绘画的那个。
  • 不要设置它的大小,而是覆盖该类中的getPrefferedSize,使其与主面板对我的大小无关。
  • 绘制时,只需在指定坐标处绘制所需大小的矩形。
  • 也使用相同的paintComponent方法绘制消息。
  • 在JFrame上调用pack()
  • 如果您执行上述操作,则无需尝试移动MessagePanel的位置。而是在调用重绘时移动x和y坐标,您可以为消息设置偏移量。喜欢

    int boxX = 100;
    int boxY = 100;
    int messageOffset = 15;
    
  • 然后你可以这样画画

    protected void paintComponent(Graphics g){
        super.paintComponent(g);
        g.drawRect(boxX, boxY, 50, 30);
        g.drawString(message, boxX + messageOffset, boxY + messageOffset);
    }
    
  • 现在,在您的操作方法中,只需更改boxX和/或boxY并调用重绘。

  • 此外,如果您想要更粗的一行,请查看Graphics2D APIsetStroke