当前位置: 首页 > 知识库问答 >
问题:

获取swing组件的位置

沈运恒
2023-03-14

我把一些JPanel放到另一个JPanel中,它的布局是长方体布局和Y轴。在我放置了所有面板之后,我需要从JPanel容器面板获取每个添加的JPanel的Y位置。当我每次都得到零的时候。请告诉我如何从Jpanel容器Jpanel获取每个Jpanel的Y位置。

这就是我所做的,

JPanel panelHolder = new JPanel(new BoxLayout(this, BoxLayout.Y_AXIS));
for(int i = 0; i< 10; i++){
   JPanel p = new JPanel(); 
   panelHolder.add(p);
}

int componentCount = panelHolder.getComponentCount();

for (int j = 0; i < componentCount ; j++) {

  Component c = pnlRowHolder.getComponent(i);
  JPanel p = (JPanel)c;
  System.out.println(p.getY());//I get zero for all
}

共有3个答案

艾星河
2023-03-14

在确定位置之前,先将框架打包。似乎从原点(0,0)开始,直到打包,所有内容都相互重叠。

下面是一个工作代码:

import java.awt.Component;
import java.awt.Dimension;
import javax.swing.BoxLayout;
import javax.swing.JFrame;
import javax.swing.JPanel;

public class TestBoxLayout {

    public static void main(String[] args) {
        JFrame frame = new JFrame();

        JPanel panelHolder = new JPanel();
        panelHolder.setLayout(new BoxLayout(panelHolder, BoxLayout.Y_AXIS));

        for (int i = 0; i < 10; i++) {
            JPanel p = new JPanel();
            p.setPreferredSize(new Dimension(100, 13)); //I set the height just to make sure.
            panelHolder.add(p);
        }
        frame.add(panelHolder);

        /**
         * Pack before you get the position.
         */
        frame.pack();

        int componentCount = panelHolder.getComponentCount();
        for (int j = 0; j < componentCount; j++) {
            Component c = panelHolder.getComponent(j);
            JPanel p = (JPanel) c;
            System.out.println(p.getY());//I get 0, 13, 26, 39, .....
        }

        frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        frame.setVisible(true);
    }
}

结果:

0
13
26
39
52
65
78
91
104
117

注意:BoxLayout的签名是BoxLayout(容器目标,int轴)目标是您设置布局的目标。因此,如果要使用BoxLayout,应始终首先创建面板。然后使用组件。setLayout(),以便目标已经存在。JPanel构造函数中的this指的是其他内容,而不是panelHolder。我猜你在其中创建这个函数的类也是Container的一个子类,这就是为什么你没有得到一个错误。

柳胜
2023-03-14

将您的JPanel添加到JFrame的内容窗格,从而允许您使用getX()get()获取X和Y坐标,尽管我建议首先添加所有组件,因为点可能随着更多的组件被添加而改变,然后如垃圾上帝所说,只需在框架实例上调用pack()

我做了一个简短的例子来演示:

import java.awt.BorderLayout;
import javax.swing.JFrame;
import javax.swing.JLabel;
import javax.swing.JPanel;
import javax.swing.SwingUtilities;

public class Test {

    public static void main(String[] args) {
        SwingUtilities.invokeLater(new Runnable() {

            @Override
            public void run() {
                new Test().createAndShowUI();
            }
        });
    }

    private void createAndShowUI() {
        JFrame frame = new JFrame("Test");
        frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        frame.setResizable(false);
        initComponents(frame);
        
        frame.pack();//call pack 
        
        printPanelCompPoints(mainPanel);//produces correct coords
        
        frame.setVisible(true);
    }
    
    private JPanel mainPanel;

    private void initComponents(JFrame frame) {
        mainPanel = new JPanel(new BorderLayout());
        JPanel centerPanel = new JPanel();
        JPanel northPanel = new JPanel();
        JPanel southPanel = new JPanel();
        JPanel westPanel = new JPanel();
        JPanel eastPanel = new JPanel();

        centerPanel.add(new JLabel("CENTER"));
        northPanel.add(new JLabel("NORTH"));
        eastPanel.add(new JLabel("EAST"));
        southPanel.add(new JLabel("SOUTH"));
        westPanel.add(new JLabel("WEST"));

        mainPanel.add(centerPanel, BorderLayout.CENTER);
        mainPanel.add(northPanel, BorderLayout.NORTH);
        mainPanel.add(southPanel, BorderLayout.SOUTH);
        mainPanel.add(eastPanel, BorderLayout.EAST);
        mainPanel.add(westPanel, BorderLayout.WEST);

       frame.getContentPane().add(mainPanel);
    
       printPanelCompPoints(mainPanel);//produces all 0's
    }

    private void printPanelCompPoints(JPanel mainPanel) {
        for (int i = 0; i < mainPanel.getComponentCount(); i++) {
            System.out.println(mainPanel.getComponent(i).getX() + ", " + mainPanel.getComponent(i).getY());
        }
    }
}

如您所见,调用printPanelCompPoints(主面板) initComponents(JFrame frame)中的code>生成所有0(因为它们已添加到帧中,但尚未调用'pack())。

0,0

0,0

0,0

0,0

0,0

但是在JFrames实例调用printPanelCompPoints(主面板)上调用pack()之后,在createAndShowUI()中 生成正确的代码

44,26

0,0

0,52

99, 26

0, 26

童冠玉
2023-03-14

坐标是相对于其父坐标的。在您的示例中,所有子组件都是沿着父容器的顶部添加的,使得y位置为0(相对于其父容器)。

尝试向父容器添加一个空边框,您应该会看到y位置发生变化。

您可以使用SwingUtilities.convertPoint在坐标系统之间进行转换

 类似资料:
  • 问题内容: 我已经将一些JPanels放到另一个JPanel中,它的布局是Box Layout和Y轴。在放置所有面板之后,我需要从JPanel容器面板中获取每个添加的JPanel的Y位置。但是,当我尝试获得该值时,每个JPanel的Y位置总会得到零。请告诉我如何从JPanel容器JPanel获取每个Jpanel的Y位置。 这就是我所做的 问题答案: 将您的内容添加到s的 contentPane中,

  • 问题内容: 我如何获取元素(例如按钮)的实际屏幕位置?如果我使用getBounds,我将获得相对于父容器而不是屏幕的位置。 问题答案: 你试过了吗?

  • 问题内容: 我需要获取Swing中组合框的整数值。 我已经为combobox设置了一个整数值作为id。我尝试了combobox.getSelectedItem()和combobox.getSelectedIndex(),但是它无法获取int值。 下面是我的代码: 任何帮助表示赞赏。 问题答案: 方法返回一个按类型包装的值,因此您必须进行相应的转换。 句法:

  • 我正在尝试获取运行Runnable JAR文件的位置 但结果是: 而JAR文件位于 我也试过 但结果是: 所以基本上我想要的是JAR文件的路径,而不是类路径,而不是文件名。 有办法吗?

  • 如何获取el-table组件内的Scrollbar组件的当前滑动位置 能获取到table下面的scrollBarRef对象,但是获取不到scrollLeft或scrollTop

  • 问题内容: 假设我在目录 e中 有一个python文件,如下所示: /a/b/c/d/e/file.py 在目录 e下, 我有几个文件夹要访问,但是如果从其他任何地方而不是从文件夹 e 执行file.py,则相对路径对我来说不起作用。另外,文件夹 e 可以位于任何位置,但总是与一组子文件夹一起使用,因此绝对路径将不起作用。 首先,有什么功能可以获取相对于源文件位置的绝对路径? 如果没有,有什么想法