JViewport没有定位它的视图



我正在为我的应用程序使用Java Swing,并且我想利用JViewport来显示端口后面的一些画布状面板的片段。但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);
  }
}

结果是,"画布"只是坚持在0,0,它永远不会移动到200,200像我做setviewposition()。它的内容是完美的定位好,不管空布局管理器。为了简单起见,我只是将画布写为JPanel,但它实际上是一个复杂的JLayeredPane。

你的情况有几个问题:

  • 你使用null -layout/绝对定位:停止这样做…直到永远。这是一种糟糕的做法,一种非常糟糕和讨厌的习惯,总是导致同样的问题:大量的问题。
  • 不调用setPreferredSize():使用合适的LayoutManager或覆盖getPreferredSize()
  • 考虑为你的画布实现Scrollable,而getPreferredScrollableViewportSize()将返回new Dimension(300, 300)(目标视口范围大小)
  • 调用setSize()/settextentsize()是非常无用的,因为这将被LayoutManager覆盖。

相关内容

  • 没有找到相关文章

最新更新