簡體   English   中英

獲取揮桿組件的位置

[英]Get location of a swing component

我把一些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
}

坐標是相對於其父級的。 在您的示例中,所有子組件都沿着父容器的頂部添加,使得位置0(相對於其父級)。

嘗試向父容器添加空邊框,您應該看到y位置更改。

您可以使用SwingUtilities.convertPoint在坐標系之間進行轉換

將你的JPanel添加到JFramecontentPane,這樣你就可以使用getX()get()獲得X和Y坐標,雖然我建議先添加所有組件,因為隨着更多組件的添加,這些點可能會發生變化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());
        }
    }
}

正如你所看到的,調用printPanelCompPoints(mainPanel); initComponents(JFrame frame)產生全0,(因為它們已添加到框架中,但尚未調用`pack())。

0,0

0,0

0,0

0,0

0,0

但是在調用printPanelCompPoints(mainPanel);JFrame實例上調用pack() createAndShowUI()之后的createAndShowUI() printPanelCompPoints(mainPanel); 產生正確的共同作用:

44,26

0,0

0,52

99,26

0,26

在獲得位置之前打包框架。 似乎一切都從起點(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(Container target, int axis) target是您要設置布局的內容。 因此,如果要使用BoxLayout,則應始終先創建面板。 然后使用component.setLayout()以便目標已經存在。 你的JPanel構造函數中的this是指其他東西,而不是panelHolder 我猜你創建這個函數的類也是Container的子類,這就是你沒有得到錯誤的原因。

請告訴我如何從JPanel容器JPanel獲取每個Jpanel的Y位置。

  • BoxLayout接受返回其子XxxSize (在這種情況下為Preferred ),

  • JPanel返回(0,0)這是正確的值

  • 這或simlair結果,你可以從所有獲得LayoutManager ,例如BUILT_IN FlowLayoutJPanel (僅接受PreferredSiz E),返回相同的坐標(0, 0)

  • 除了BorderLayout那么生成10 10pixels (對於W,E,N,S區域),並且僅在CENTER area用於某些JComponent的情況下有效

  • JPanelContainer ,由空的JPanel by defualt在屏幕上返回零大小,

  • 如果有任何JComponent JPanel可以返回正確的坐標,或者在JPanel構造函數中覆蓋XxxSize

假設你有一個包含JPanel子的Jpanel父親。 如果cx是兒子相對於父親的坐標x而cy是兒子相對於父親的坐標y,那么:

cx = son.getLocationOnScreen()。getX() - father.getLocationOnScreen()。getX()

cy = son.getLocationOnScreen()。getY() - father.getLocationOnScreen()。getY()

我認為這是最簡單的方法......

問題通常是布局或繪圖僅在返回整個方法后完成。 在這種情況下, getXgetY返回0。

在框架窗口上調用pack()或在正在處理的JPanel上調用doLayout()validate()可能會有所幫助。 但通常它沒有幫助,因為你對內部調度幾乎沒有影響: http//www.oracle.com/technetwork/java/painting-140037.html

在這種情況下,幫助我的是將我需要X和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();

SwingUtilities.invokeLater(new Runnable() {         
    @Override
    public void run() {
        for (int j = 0; i < componentCount; j++) {    
            Component c = pnlRowHolder.getComponent(i);
            JPanel p = (JPanel) c;
            System.out.println(p.getY());
        }
    }
});

這樣,獲取X和Y將被推遲,直到布局完成。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM