gpt4 book ai didi

java - setVisible 的问题 (true)

转载 作者:行者123 更新时间:2023-11-30 09:56:18 24 4
gpt4 key购买 nike

下面显示的两个示例是相同的。两者都应该产生相同的结果,例如生成显示在 JPanel 上的图像的坐标。示例 1 完美运行(打印图像的坐标),但是示例 2 返回 0 作为坐标。

我想知道为什么,因为在两个示例中,我都在添加面板后设置了 setvisible (true)。唯一的区别是示例 1 使用了 extends JPanel 而示例 2 使用了 extends JFrame

示例 1:

    public class Grid extends JPanel{
public static void main(String[] args){
JFrame jf=new JFrame();
jf.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
final Grid grid = new Grid();
jf.add(grid);
jf.pack();

Component[] components = grid.getComponents();
for (Component component : components) {
System.out.println("Coordinate: "+ component.getBounds());
}

jf.setVisible(true);
}
}

示例 2:

public class Grid extends JFrame {

public Grid () {
setLayout(new GridBagLayout());
GridBagLayout m = new GridBagLayout();
Container c = getContentPane();
c.setLayout (m);
GridBagConstraints con = new GridBagConstraints();

//construct the JPanel
pDraw = new JPanel();
...
m.setConstraints(pDraw, con);
pDraw.add (new GetCoordinate ()); // call new class to generate the coordinate
c.add(pDraw);

pack();
setVisible(true);
}

public static void main(String[] args) {
new Grid();
}
}

最佳答案

问题在于,在第二个示例中,您试图在组件添加到其容器(通过调用 add())之前以及框架的边界之前打印组件的边界内容已布置(通过调用 pack())。

这是我重现示例 1 的尝试。...

这是我尝试重现示例 2 的尝试。我添加了 SwingUtilities 调用以将内容放入正确的线程中,并在 GetCoordiates 构造函数中填充了内容从您的评论中获得帮助:

class GetCoordinate extends JLabel {
public GetCoordinate() {
setText("Foo!");
System.out.println("Coordinate: " + this.getBounds());
}
}

public class Grid extends JFrame {
public Grid() {
setLayout(new GridBagLayout());
GridBagLayout m = new GridBagLayout();
Container c = getContentPane();
c.setLayout(m);
GridBagConstraints con = new GridBagConstraints();

// construct the JPanel
final JPanel pDraw = new JPanel();
m.setConstraints(pDraw, con);
pDraw.add(new GetCoordinate()); // call new class to generate the
// coordinate
c.add(pDraw);

pack();
setVisible(true);
}

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

正如您所描述的,它打印出大小为零:

Coordinate: java.awt.Rectangle[x=0,y=0,width=0,height=0]

但是,如果在添加组件并打包框架后打印出尺寸,它应该可以工作。这是我的示例 2 的修改版本,我在其中添加了一个方法 GetCoordinate.printBounds() 并调用该方法,所有内容都已添加和布局:

class GetCoordinate extends JLabel {
public GetCoordinate() {
setText("Foo!");
// Let's not try to do this here anymore...
// System.out.println("Coordinate: " + this.getBounds());
}

public void printBounds() // <-- Added this method
{
System.out.println("Coordinate: " + this.getBounds());
}
}

public class Grid extends JFrame {
public Grid() {
setLayout(new GridBagLayout());
GridBagLayout m = new GridBagLayout();
Container c = getContentPane();
c.setLayout(m);
GridBagConstraints con = new GridBagConstraints();

// construct the JPanel
final JPanel pDraw = new JPanel();
m.setConstraints(pDraw, con);
final GetCoordinate content = new GetCoordinate();
pDraw.add(content);
c.add(pDraw);

pack();
setVisible(true);
content.printBounds(); // <-- Added this
}

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

通过这些更改,我得到以下控制台输出,包括我的内容的非零大小:

Coordinate: java.awt.Rectangle[x=5,y=5,width=23,height=16]

关于java - setVisible 的问题 (true),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/2406147/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com