您好,我是新编程,对我来说很光。
我正在处理一个小项目的问题。我正在尝试按住鼠标按钮创建一个可移动的消息面板,但我卡在一个部分上。
我想放置一个尺寸为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);
}
}
}
答案 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
方法绘制消息。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 API,setStroke
。