JavaSwing—获取其他元素所包含的元素的大小

JavaSwing—获取其他元素所包含的元素的大小,java,swing,user-interface,Java,Swing,User Interface,正如标题所说——假设我有一个jPanel,它包含在一个jScrollPane中。如何从jPanel内部找到它所包含的jScrollPane的大小 这是一个相当简单的问题,我觉得我应该可以轻松地用谷歌搜索,但我还没有找到答案。你可以打电话给它,它会给你这个组件的直接父级,然后你可以查询它的维度 这里有一个例子,虽然公平地说,这是我在这里检查的首选尺寸。如果您运行它,您将看到“200.0”被打印到控制台,正如您所期望的那样 可能使用getWidth()也会得到实际的宽度,尽管这需要更多地了解Swin

正如标题所说——假设我有一个jPanel,它包含在一个jScrollPane中。如何从jPanel内部找到它所包含的jScrollPane的大小

这是一个相当简单的问题,我觉得我应该可以轻松地用谷歌搜索,但我还没有找到答案。

你可以打电话给它,它会给你这个组件的直接父级,然后你可以查询它的维度

这里有一个例子,虽然公平地说,这是我在这里检查的首选尺寸。如果您运行它,您将看到“200.0”被打印到控制台,正如您所期望的那样

可能使用getWidth()也会得到实际的宽度,尽管这需要更多地了解Swing的内部工作以确保,因为用户无法直接控制渲染面板的实际大小

public class SomeJFrame extends JFrame {
   public SomeJFrame() {
      setLayout(new BorderLayout());

      JPanel parent = new JPanel(new BorderLayout());
      parent.setPreferredSize(new Dimension(200, 201));
      JPanel child = new JPanel(new BorderLayout());
      parent.add(child);
      System.out.println(child.getParent().getPreferredSize().getWidth());

      add(parent, BorderLayout.CENTER);
      setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
      pack();
      setVisible(true);
   }

   public static void main(String[] args) {
      javax.swing.SwingUtilities.invokeLater(new Runnable() {
         @Override
         public void run() {
            new SomeJFrame();
         }
      });
   }

}
您可以调用它,它将为您提供此组件的直接父级,然后您可以查询其维度

这里有一个例子,虽然公平地说,这是我在这里检查的首选尺寸。如果您运行它,您将看到“200.0”被打印到控制台,正如您所期望的那样

可能使用getWidth()也会得到实际的宽度,尽管这需要更多地了解Swing的内部工作以确保,因为用户无法直接控制渲染面板的实际大小

public class SomeJFrame extends JFrame {
   public SomeJFrame() {
      setLayout(new BorderLayout());

      JPanel parent = new JPanel(new BorderLayout());
      parent.setPreferredSize(new Dimension(200, 201));
      JPanel child = new JPanel(new BorderLayout());
      parent.add(child);
      System.out.println(child.getParent().getPreferredSize().getWidth());

      add(parent, BorderLayout.CENTER);
      setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
      pack();
      setVisible(true);
   }

   public static void main(String[] args) {
      javax.swing.SwingUtilities.invokeLater(new Runnable() {
         @Override
         public void run() {
            new SomeJFrame();
         }
      });
   }

}

在给定的
组件周围查找
JScrollPane
有点特殊, 因为它的直接父对象实际上是一个
JViewport
, 而
JViewport
的父对象是
JScrollPane

您可以通过使用


在给定的
组件周围查找
JScrollPane
有点特殊, 因为它的直接父对象实际上是一个
JViewport
, 而
JViewport
的父对象是
JScrollPane

您可以通过使用


是的,成功了!在发布这个问题之前,我曾一度使用过getParent(),但出于某种原因,我认为它没有达到我认为的效果。。。哦,好吧!谢谢是的,成功了!在发布这个问题之前,我曾一度使用过getParent(),但出于某种原因,我认为它没有达到我认为的效果。。。哦,好吧!谢谢