Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/reporting-services/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
java swing GroupLayout-如何交换组件的位置_Java_Swing_Layout Manager_Grouplayout - Fatal编程技术网

java swing GroupLayout-如何交换组件的位置

java swing GroupLayout-如何交换组件的位置,java,swing,layout-manager,grouplayout,Java,Swing,Layout Manager,Grouplayout,我有一个JFrame布局在GroupLayout中。当用户单击按钮时,我想交换这个JFrame中两个组件的位置。我使用GroupLayout中的replace方法将一个替换为另一个。下面是我想交换两个按钮位置的代码:按钮[0]和按钮[1]: 然而,当我运行这个程序时,程序thorws NullPointerException。例外情况不提供任何有用的信息: Exception in thread "AWT-EventQueue-0" java.lang.NullPointerException

我有一个JFrame布局在GroupLayout中。当用户单击按钮时,我想交换这个JFrame中两个组件的位置。我使用GroupLayout中的replace方法将一个替换为另一个。下面是我想交换两个按钮位置的代码:按钮[0]和按钮[1]:

然而,当我运行这个程序时,程序thorws NullPointerException。例外情况不提供任何有用的信息:

Exception in thread "AWT-EventQueue-0" java.lang.NullPointerException
    at javax.swing.GroupLayout$ComponentInfo.setBounds(Unknown Source)
    at javax.swing.GroupLayout.layoutContainer(Unknown Source)
    at java.awt.Container.layout(Unknown Source)
    at java.awt.Container.doLayout(Unknown Source)
    at java.awt.Container.validateTree(Unknown Source)
    at java.awt.Container.validateTree(Unknown Source)
    at java.awt.Container.validateTree(Unknown Source)
    at java.awt.Container.validate(Unknown Source)
    at javax.swing.RepaintManager$2.run(Unknown Source)
    at javax.swing.RepaintManager$2.run(Unknown Source)
    at java.security.AccessController.doPrivileged(Native Method)
    at java.security.ProtectionDomain$1.doIntersectionPrivilege(Unknown Source)
    at javax.swing.RepaintManager.validateInvalidComponents(Unknown Source)
    at javax.swing.RepaintManager$ProcessingRunnable.run(Unknown Source)
    at java.awt.event.InvocationEvent.dispatch(Unknown Source)
    at java.awt.EventQueue.dispatchEventImpl(Unknown Source)
    at java.awt.EventQueue.access$200(Unknown Source)
    at java.awt.EventQueue$3.run(Unknown Source)
    at java.awt.EventQueue$3.run(Unknown Source)
    at java.security.AccessController.doPrivileged(Native Method)
    at java.security.ProtectionDomain$1.doIntersectionPrivilege(Unknown Source)
    at java.awt.EventQueue.dispatchEvent(Unknown Source)
    at java.awt.EventDispatchThread.pumpOneEventForFilters(Unknown Source)
    at java.awt.EventDispatchThread.pumpEventsForFilter(Unknown Source)
    at java.awt.EventDispatchThread.pumpEventsForHierarchy(Unknown Source)
    at java.awt.EventDispatchThread.pumpEvents(Unknown Source)
    at java.awt.EventDispatchThread.pumpEvents(Unknown Source)
    at java.awt.EventDispatchThread.run(Unknown Source)
起初,我认为这是因为按钮[2]已经被移除。但当我尝试替换按钮[1],按钮[3],其中按钮[3]以前没有添加到groupLayout中时,没有出现任何问题。所以我还是不知道发生了什么问题

然后,我想出了一个主意,维护一个对组的引用,该组只包含我想要更改的组件,以便以后对其进行操作。这是我的密码:

if(count % 2 == 1) {
    groupLayout.replace(buttons[1], buttons[2]);
    button2HorizontalGroup.addComponent(buttons[1]);
    button2VerticalGroup.addComponent(buttons[1]);
}else {
    groupLayout.replace(buttons[2], buttons[1]);
    button2HorizontalGroup.addComponent(buttons[2]);
    button2VerticalGroup.addComponent(buttons[2]);
}
但这与其说是一个解决方案,不如说是一种黑客手段。此外,如果要交换大量组件,可能会很麻烦。在GroupLayout中是否有更好的组件交换解决方案?也欢迎使用其他布局中的解决方案:

谢谢

更新:

@用户1803551: 下面是我的代码GroupLayoutTest是一个扩展JFrame的类:

public GroupLayoutTest() {
    // Allow group layout to automatically creat the gap between components and containers.
    groupLayout.setAutoCreateGaps(true);
    groupLayout.setAutoCreateContainerGaps(true);
    setLayout(groupLayout);


    buttons = new JButton[4];
    buttons[0] = new JButton("small 1");
    buttons[1] = new JButton("medium 2");
    buttons[2] = new JButton("big 3");

    buttons[1].addActionListener(replaceHandler);
    buttons[2].addActionListener(replaceHandler);

    button1HorizontalGroup.addComponent(buttons[1]);
    button1VerticalGroup.addComponent(buttons[1]);
    button2HorizontalGroup.addComponent(buttons[2]);
    button2VerticalGroup.addComponent(buttons[2]);

    groupLayout.setHorizontalGroup(
            groupLayout.createParallelGroup()
            .addGroup(groupLayout.createSequentialGroup()
                    .addGap(39)
                    .addComponent(buttons[0])
                    // Make it like a Spring
                    .addPreferredGap(LayoutStyle.ComponentPlacement.RELATED, GroupLayout.DEFAULT_SIZE, Short.MAX_VALUE)
                    .addGap(10)
                    .addGroup(button1HorizontalGroup)
                    .addGap(52))
            .addGroup(groupLayout.createSequentialGroup()
                    .addPreferredGap(LayoutStyle.ComponentPlacement.RELATED, GroupLayout.DEFAULT_SIZE, Short.MAX_VALUE)
                    .addGap(0)
                    .addGroup(button2HorizontalGroup)
                    .addContainerGap(GroupLayout.DEFAULT_SIZE, 160))
    );
    groupLayout.setVerticalGroup(
            groupLayout.createSequentialGroup()
            .addContainerGap(50, 50)
            .addGroup(groupLayout.createParallelGroup()
                    .addComponent(buttons[0])
                    .addGroup(button1VerticalGroup) )
            .addGap(10)
            .addPreferredGap(LayoutStyle.ComponentPlacement.RELATED, GroupLayout.DEFAULT_SIZE, Short.MAX_VALUE)
            .addGroup(button2VerticalGroup)
            .addContainerGap(168, 168));

    groupLayout.linkSize(SwingConstants.HORIZONTAL, buttons[1],buttons[2]);
    pack();
    setLocationRelativeTo(null);
    setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
}

private class ReplaceHandler implements ActionListener {

    private int count = 0;
    @Override
    public void actionPerformed(ActionEvent e) {
        count += 1;
        if(count % 2 == 1) {
            groupLayout.replace(buttons[1], buttons[2]);
            button2HorizontalGroup.addComponent(buttons[1]);
            button2VerticalGroup.addComponent(buttons[1]);
        }else {
            groupLayout.replace(buttons[2], buttons[1]);
            button2HorizontalGroup.addComponent(buttons[2]);
            button2VerticalGroup.addComponent(buttons[2]);
        }
        groupLayout.linkSize(SwingConstants.HORIZONTAL, buttons[1],buttons[2]);
    }

}
@camickr:正如您从上面的代码中所看到的,我只是在享受我第一次体验GroupLayout的乐趣。我希望有一个按钮,当我点击它时,中小型按钮可以互相交换。毕竟,谢谢你的建议

我第一次体验GroupLayout时很开心

那么,您应该先学习其他布局管理器

我希望有一个按钮,当我点击它时,中小型按钮可以互相交换

创建一个包含两个按钮的JPanel,并将面板添加到布局中


使一个按钮可见,另一个按钮不可见。单击按钮后,可以切换两个按钮的可见性状态。

不要使用GroupLayout。这种布局是为IDE设计的,不容易手动编码,尤其是在进行动态更改时。通过学习手动创建GUI,并且不依赖IDE,您将受益匪浅。@camickr I手动使用GroupLayout编写的代码很多,其复杂性被高估了,这只是习惯的问题。而且,关键是:您可以在许多布局中交换组件的位置,您到底拥有什么以及希望实现什么?1。呃,我在使用其他组件时有一些困难。在大多数布局管理器中,总是很难固定某些东西,尤其是大小,不是吗。所以我尝试了分组布局。2.切换按钮的可见性不会更改其位置。此外,我的两个按钮位于两个不同的位置。很难将它们全部放在一个JPanel中。@我们逐渐变细,当你说“相互交换”时,我觉得这两个按钮占据了相同的位置,但一次只能看到一个按钮,这就是我提出建议的原因。如果按钮位于面板上的不同位置,则应能够切换可见性。当然,这假设GroupLayout确实尊重组件的可见性。谢谢。我可以问你为什么在我的第一个例子中有这样一个NullPointerException吗?没有提供有用的信息。我甚至无法捕获我尝试过但失败的异常。我猜不出为什么你有一个基于几行代码的NPE。当你问一个问题时,你应该总是包括一个能说明问题的例子。然而,由于我对GroupLayout一无所知,我将无法提供帮助。
public GroupLayoutTest() {
    // Allow group layout to automatically creat the gap between components and containers.
    groupLayout.setAutoCreateGaps(true);
    groupLayout.setAutoCreateContainerGaps(true);
    setLayout(groupLayout);


    buttons = new JButton[4];
    buttons[0] = new JButton("small 1");
    buttons[1] = new JButton("medium 2");
    buttons[2] = new JButton("big 3");

    buttons[1].addActionListener(replaceHandler);
    buttons[2].addActionListener(replaceHandler);

    button1HorizontalGroup.addComponent(buttons[1]);
    button1VerticalGroup.addComponent(buttons[1]);
    button2HorizontalGroup.addComponent(buttons[2]);
    button2VerticalGroup.addComponent(buttons[2]);

    groupLayout.setHorizontalGroup(
            groupLayout.createParallelGroup()
            .addGroup(groupLayout.createSequentialGroup()
                    .addGap(39)
                    .addComponent(buttons[0])
                    // Make it like a Spring
                    .addPreferredGap(LayoutStyle.ComponentPlacement.RELATED, GroupLayout.DEFAULT_SIZE, Short.MAX_VALUE)
                    .addGap(10)
                    .addGroup(button1HorizontalGroup)
                    .addGap(52))
            .addGroup(groupLayout.createSequentialGroup()
                    .addPreferredGap(LayoutStyle.ComponentPlacement.RELATED, GroupLayout.DEFAULT_SIZE, Short.MAX_VALUE)
                    .addGap(0)
                    .addGroup(button2HorizontalGroup)
                    .addContainerGap(GroupLayout.DEFAULT_SIZE, 160))
    );
    groupLayout.setVerticalGroup(
            groupLayout.createSequentialGroup()
            .addContainerGap(50, 50)
            .addGroup(groupLayout.createParallelGroup()
                    .addComponent(buttons[0])
                    .addGroup(button1VerticalGroup) )
            .addGap(10)
            .addPreferredGap(LayoutStyle.ComponentPlacement.RELATED, GroupLayout.DEFAULT_SIZE, Short.MAX_VALUE)
            .addGroup(button2VerticalGroup)
            .addContainerGap(168, 168));

    groupLayout.linkSize(SwingConstants.HORIZONTAL, buttons[1],buttons[2]);
    pack();
    setLocationRelativeTo(null);
    setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
}

private class ReplaceHandler implements ActionListener {

    private int count = 0;
    @Override
    public void actionPerformed(ActionEvent e) {
        count += 1;
        if(count % 2 == 1) {
            groupLayout.replace(buttons[1], buttons[2]);
            button2HorizontalGroup.addComponent(buttons[1]);
            button2VerticalGroup.addComponent(buttons[1]);
        }else {
            groupLayout.replace(buttons[2], buttons[1]);
            button2HorizontalGroup.addComponent(buttons[2]);
            button2VerticalGroup.addComponent(buttons[2]);
        }
        groupLayout.linkSize(SwingConstants.HORIZONTAL, buttons[1],buttons[2]);
    }

}