【发布时间】:2017-05-26 15:23:43
【问题描述】:
我有一个 JFrame,顶部有一个名为“coloredLabel”的 JLabel,它所在的类的一个实例正在它们两者上运行。随机数量的对象在框架和标签上移动,并且不直接与它们交互。 唯一的问题是标签上方有一些可见的框架,我想要的是标签与框架完全对齐,而不粘贴对象(使用覆盖绘制方法绘制并被称为“游戏.newBall”和“game.moveBall”。“test”是类的名称。 这是我的主线程的外观,其中声明了框架和标签:
public static void main(String[] args) throws InterruptedException {
JFrame frame = new JFrame("Bounce 2.0");
JLabel coloredLabel = new JLabel("");
test game = new test();
frame.add(game);
frame.setSize(300, 400);
frame.setVisible(true);
frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
coloredLabel.setOpaque(true);
coloredLabel.setBackground(game.backgroundColor);
coloredLabel.setPreferredSize(new Dimension(1000000,1000000));
frame.getContentPane().add(coloredLabel,BorderLayout.LINE_START);
game.add(coloredLabel);
for(int a = randInt(0,9); a<10; a++)
game.newBall(randInt(0,300),randInt(0,400));
while (true) {
double height = frame.getContentPane().getSize().getHeight();
double width = frame.getContentPane().getSize().getWidth();
int n = 0;
while(game.exists(n)==true){
game.moveBall(n,width,height);
n++;
}
game.repaint();
Thread.sleep(10);
}
}
所以我的问题是: 如何将 JLabel 与 JFrame 对齐?所以 JLabel 和框架之间没有空间。
我在这个网站上搜索了这个,但找不到相同的问题或足够相似的东西,所以我可以解决这个问题。
- 已解决 - game.setBackground(...);
【问题讨论】:
-
你能用
JLabel和JFrame重现这个问题吗? -
1) “使用覆盖绘制方法绘制” 您应该覆盖
paintComponent(...),而不是paint(...)。 2)while(true) {那条线会伤害你,而不是和Thread.sleep(10);一起帮助你,而是使用Swing Timer 或者你可能会阻塞 EDT(你可能会因为你没有正确初始化你的应用程序)(做如本文末尾所示answer) -
3) 在您完成向其中添加所有元素之前,您已经让您的
JFrame可见。它也可能导致奇怪的行为,这一行frame.setVisible(true);应该是你程序中的最后一行。 4)你到底为什么要创造这么大的JLabel???coloredLabel.setPreferredSize(new Dimension(1000000,1000000));5) 与最后一点有关,见Should I avoid the use of setPreferred|Maximum|MinimumSize()? 普遍共识说是... -
...并改写
getPreferred|Maximum|MinimumSize()方法。 6)为什么每次都计算这个变量?为什么不将它们作为成员变量?double height = frame.getContentPane().getSize().getHeight(); double width = frame.getContentPane().getSize().getWidth();, 7) 这个while(game.exists(n)==true){可以简化为:while(game.exists(n))。为了获得更好的帮助,请尽快发布一个有效的 minimal reproducible example 来证明您的问题。 -
而您将
coloredLabel添加到 2 个位置:frame.getContentPane().add(coloredLabel,BorderLayout.LINE_START);和game.add(coloredLabel);这是不正确的,Swing 只会将其添加到最后添加的位置,因此,第一行那么就不需要了……
标签: java swing jframe jlabel paint