gpt4 book ai didi

java - JViewport 是不是定位了它的 View ?

转载 作者:行者123 更新时间:2023-11-29 03:34:55 25 4
gpt4 key购买 nike

我正在为我的应用程序使用 Java Swing,我想利用 JViewport 在端口“后面”显示一些类似 Canvas 的面板的片段。但不知何故视口(viewport)永远不会定位它的观点,所以一定有我在做的事情。我做错了什么,为什么这段代码不起作用?

以下是我在更大、更复杂的范围内所做工作的示例。

public class MyApp
{
// THIS IS A TEMPORARY TEST TO GET VIEWPORT WORKING
public static void main(String[] args)
{
JFrame frame = new JFrame();
JViewport viewport = new JViewport();
viewport.setOpaque(true);
viewport.setBackground(Color.GRAY);
frame.add(viewport, BorderLayout.CENTER);
JPanel canvas = new JPanel(null);
canvas.setBackground(Color.CYAN);
viewport.setView(canvas);
viewport.setViewSize(new Dimension(500, 500));
viewport.setExtentSize(new Dimension(300, 300));
viewport.setPreferredSize(new Dimension(300, 300));

// item one
JLabel label = new JLabel("This is a 32x32 box");
label.setOpaque(true);
label.setBackground(Color.GREEN);
label.setIcon(Sprites.BOX2.getSprite());
label.setBounds(0, 0, 200, 32); // position upper left, 200 wide
label.setHorizontalAlignment(SwingConstants.LEFT);
canvas.add(label);

// item two
JLabel label2 = new JLabel("This is a 32x32 wall");
label2.setOpaque(true);
label2.setBackground(Color.ORANGE);
label2.setIcon(Sprites.WALL1.getSprite());
label2.setBounds(300, 468, 200, 32); // position lower right, 200 wide
label2.setHorizontalAlignment(SwingConstants.RIGHT);
label2.setHorizontalTextPosition(SwingConstants.LEFT);
canvas.add(label2);

// this should scroll the canvas to the left and up, so the box becomes invisible and the wall visible
viewport.setViewPosition(new Point(200, 200));

frame.pack();
frame.setLocationRelativeTo(null);
frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
frame.setVisible(true);
}
}

结果是“ Canvas ”只是停留在 0,0,它永远不会像我使用 setViewPostition() 那样移动到 200,200。无论空布局管理器如何,它的内容都完美定位。为了简单起见,我只是将 Canvas 写成 JPanel,但它实际上是一个复杂的 JLayeredPane。

最佳答案

你的情况有几个问题:

  • 你使用了null-layout/absolute positioning:停止这样做......永远。这是一种糟糕的做法,一种非常糟糕和令人讨厌的习惯,它总是导致同一个问题:成堆的问题。
  • 不要调用 setPreferredSize():使用适当的 LayoutManager 或覆盖 getPreferredSize()
  • 考虑为您的 Canvas 实现 Scrollable 并且 getPreferredScrollableViewportSize() 将返回 new Dimension(300, 300)(目标视口(viewport)范围大小)
  • 调用 setSize()/setExtentSize() 几乎没有用,因为它会被 LayoutManager 覆盖。

关于java - JViewport 是不是定位了它的 View ?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/16083285/

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