获取挥杆组件的位置

Har*_*sha 6 java swing jpanel layout-manager

我把一些JPanel放到另一个JPanel中,它的布局是Box Layout和Y-Axis.在我放置所有面板后,我需要从JPanel容器面板中获取每个添加的JPanel的Y位置.但是,当我试图得到它时,每个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
}
Run Code Online (Sandbox Code Playgroud)

Dav*_*amp 3

将您的内容添加JPanelJFrames contentPanegetX()中,从而允许您使用来获取 X 和 Y 坐标get(),尽管我建议首先添加所有组件,因为随着添加更多组件,这些点可能会发生变化,然后正如 Trashgod 所说,只需调用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());
        }
    }
}
Run Code Online (Sandbox Code Playgroud)

正如您所看到的,调用printPanelCompPoints(mainPanel);initComponents(JFrame frame)产生全 0(因为它们已被添加到帧中,但尚未调用“pack()”)。

0, 0

0, 0

0, 0

0, 0

0, 0

然而,在createAndShowUI()调用 s 实例之后,pack()调用JFrameprintPanelCompPoints(mainPanel);产生正确的坐标:

44, 26

0, 0

0, 52

99, 26

0, 26