gpt4 book ai didi

java - 绘制还是使用 JLabel 更好

转载 作者:塔克拉玛干 更新时间:2023-11-01 22:47:54 26 4
gpt4 key购买 nike

我正在开发一个将在后台显示一些图像的 Swing 应用程序。我想知道以下哪种方式更有效(或更好),或者您是否有其他建议:
getGraphics().drawImage(t.getImage().getImage(), i * 16, j * 16, this);
或者

JLabel tile = new JLabel(t.getImage());
tile.setBounds(i * 16, j * 16, t.getImage().getIconWidth(), t.getImage().getIconHeight());
add(tile);

编辑:

这是事情将发生的地方:
for (int j = 0; j < 3; j++) {
for (int i = 0; i < 3; i++) {
Tile t = map.getTiles()[j][i];
if (t != null) {
// Draw it somehow.
}
}
}

最佳答案

关于:

getGraphics().drawImage(t.getImage().getImage(), i * 16, j * 16, this);

您永远不应该使用通过调用 getGraphics() 获得的 Graphics 对象进行绘制。在组件上,因为这样获得的 Graphics 对象将是短暂的,并且您的绘图可能会变得不稳定。要明白我的意思,请尝试使用您的技术,然后在创建 GUI 后,最小化并恢复它,您可能会看到部分或全部图像消失了。相反,您应该在 JPanel(或其他 JComponent 派生类)的 paintComponent(...) 内部进行绘制。使用给定的 Graphics 对象的方法。

也不要每次要绘制图像时都读入图像,因为这样做会导致程序不必要的减慢。相反,如果图像不是很大,请在程序启动时读取它们,将它们放入 BufferedImage 或 ImageIcon 变量(取决于需要),并在应用程序中需要的时间和地点使用它们。

关于:
JLabel tile = new JLabel(t.getImage());
tile.setBounds(i * 16, j * 16, t.getImage().getIconWidth(), t.getImage().getIconHeight());
add(tile);

这很好,除了 setBounds(...)这部分表明该程序没有适本地使用布局管理器。让 JLabel 及其 ImageIcon 设置自己的首选大小,并让布局管理器在设置组件和调整 GUI 大小时使用它。

请注意,您可以提供 JLabel 的布局管理器并向它们添加组件,就像它们是 JPanel 一样。主要区别在于 JLabel 默认不是不透明的。

关于哪个更好,使用 JLabel 在 paintComponent(...) 中保存图像或绘图:通常取决于图像是否必须调整大小以适合组件。如果是这样,请在 JPanel 的 paintComponent(...) 中绘制.否则使用 JLabel。

编辑
根据您的评论:

Regarding part two, I am not using a layout manager.



然后,您的 GUI 在不同的操作系统上可能会变得丑陋,并且可能无法很好地扩展。布局管理器是 Swing 编程最强大的方面之一,如果您使用它们,您的 GUI 将更容易编码、更新、增强以及在其他系统上运行良好。

Regarding part two, what Graphics object am I passing to paintComponent()?



您没有将任何 Graphics 对象传递给 JPanel 的 paintComponent(Graphics g) .这是一种由 JVM 的重绘管理器根据您的建议(通过调用 repaint() )或操作系统的建议调用的方法。

Finally, are you saying that it doesn't really matter which of the two options I use?



不,我没有那样说。请重新阅读我在此编辑上方的建议。

编辑 2
主要链接:
  • Lesson: Performing Custom Painting : 用于螺母和 bolt
  • Painting in AWT and Swing : 对于血腥的细节。


  • 编辑 3
    对于平铺 map ,我将使用 ImageIcons 作为平铺图像,然后将它们显示在 JLabels 网格中。这样,交换磁贴就像调用 setIcon(nextIcon) 一样简单。在感兴趣的 JLabel 上。

    例如,请参阅 TrashGod 和我对这个问题的回答: jlabel images array .

    关于:

    As far as the layout manager, I have a good reason. I've made many GUIs with layout managers, but this one is special ;).



    这样做的风险由您自己承担,我愿意打赌,您对此的推理是不正确的。

    编辑 4

    The reason why I am not using a layout manager is because I am trying to make a small RPG game in Swing.



    然后最好将图块保存在使用 GridLayout 的容器中,并且该容器可能保存在 JScrollPane 中,以便您可以向任何方向滚动。然后,您可以让您的 Sprite 位于 JLabel 中(通过为其提供适当的布局),或者使用 JLayeredPane 将其置于顶部。

    I don't want any comments telling me I can't or I shouldn't because if it is impossible, I'll find out on my own.


  • 当然,我们不是要告诉你你不能做任何事情,否则你不能规定我们应该或不应该告诉你什么。您来到这里寻求我们的建议,我们有义务告诉您我们认为最有效的方法。你有权利听从我们的建议,因为这是你的程序,但同样,你不能规定我们可以或不能告诉你什么,除了你不应该容忍或允许粗鲁或冒犯性的言论(标记版主如果你看到这个,他们会处理的)。
  • 关于java - 绘制还是使用 JLabel 更好,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/19621322/

    26 4 0
    Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
    广告合作:1813099741@qq.com 6ren.com