Java 单击按钮更改面板大小

Java 单击按钮更改面板大小,java,swing,validation,repaint,cardlayout,Java,Swing,Validation,Repaint,Cardlayout,我有以下代码: package in.res.num.tapb.ui; import java.awt.BorderLayout; import java.awt.CardLayout; import java.awt.Dimension; import java.awt.GridLayout; import java.awt.event.ActionEvent; import java.awt.event.ActionListener; import javax.swing.BorderF

我有以下代码:

package in.res.num.tapb.ui;

import java.awt.BorderLayout;
import java.awt.CardLayout;
import java.awt.Dimension;
import java.awt.GridLayout;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;

import javax.swing.BorderFactory;
import javax.swing.JButton;
import javax.swing.JFrame;
import javax.swing.JLabel;
import javax.swing.JPanel;

class MainClass extends JPanel {
    public MainClass() {
        Registration registration = new Registration();
        ButtonPanel buttonPanel = new ButtonPanel();
        buttonPanel.setRegistration(registration);

        buttonPanel.setBorder(BorderFactory.createTitledBorder("Button Panel"));
        registration.setBorder(BorderFactory.createTitledBorder("Registration Panel"));

        setLayout(new BorderLayout());
        add(registration, BorderLayout.CENTER);
        add(buttonPanel, BorderLayout.SOUTH);
    }

    private static void createAndShowUI() {
        JFrame frame = new JFrame("Registration");
        frame.getContentPane().add(new MainClass());
        frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        frame.pack();
        frame.setResizable(false);
        frame.setLocationRelativeTo(null);
        frame.setVisible(true);
    }

    public static void main(String[] args) {
        java.awt.EventQueue.invokeLater(new Runnable() {
            public void run() {
                createAndShowUI();
            }
        });
    }

    @SuppressWarnings("serial")
    private class ButtonPanel extends JPanel {
        private Registration registration;

        public ButtonPanel() {
            setLayout(new GridLayout(1, 0, 10, 0));     
            for (final String keyText : Registration.KEY_TEXTS) {
                JButton btn = new JButton(keyText);
                btn.addActionListener(new ActionListener() {
                    public void actionPerformed(ActionEvent e) {
                        if (registration != null) {
                            registration.swapView(keyText);
                        }
                    }
                });
                add(btn);
            }
        }

        public void setRegistration(Registration registration) {
            this.registration = registration;
        }
    }

    private static class Registration extends JPanel {
        private static final Dimension PREF_SIZE = new Dimension(450, 300);
        public static final String USER_AGREEMENT = "User Agreement";
        public static final String USER_INFO = "User Information";
        public static final String ENROLLMENT = "Enrollment";
        public static final String[] KEY_TEXTS = { USER_AGREEMENT, USER_INFO, ENROLLMENT };
        private CardLayout cardlayout = new CardLayout();
        private JPanel cards = new JPanel(cardlayout);

        public Registration() {
            cards.add(createUserAgreePanel(), USER_AGREEMENT);
            cards.add(createUserInfoPanel(), USER_INFO);
            cards.add(createEnrollmentPanel(), ENROLLMENT);
            setLayout(new BorderLayout());
            add(cards, BorderLayout.CENTER);
        }



        private JPanel createEnrollmentPanel() {
            JPanel enrol = new JPanel();
            enrol.setSize(new Dimension(400, 200));
            enrol.add(new JLabel("Enrollment"));
            return enrol;
        }

        private JPanel createUserAgreePanel() {
            JPanel userAgree = new JPanel();
            userAgree.setSize(new Dimension(200, 300));
            userAgree.add(new JLabel("User Agreement"));
            return userAgree;
        }

        private JPanel createUserInfoPanel() {
            JPanel userInfo = new JPanel();
            userInfo.setSize(new Dimension(300, 400));
            userInfo.add(new JLabel("User Information"));
            return userInfo;
        }

        public void swapView(String key) {
            cardlayout.show(cards, key);
        }

    }

}
正如你所看到的,我想在点击按钮时改变尺寸。可能吗?上面的代码不起作用,我的意思是大小没有改变。如何在飞行中更改尺寸

谢谢和问候。 编辑:

在选择一行JList时交换面板

    getChoicesList().addListSelectionListener(new ListSelectionListener() {

        @Override
        public void valueChanged(ListSelectionEvent listSelectionEvent) {
            getViewPanel().changeView(getChoicesList().getSelectedIndex());
            getChoicePanel().changeView(Constants.PanelInfo.valueOf(getEngine().getChoiceList().get(getChoicesList().getSelectedIndex()).getEnumName()).getDimensionForScrollPaneOfChoicePanel());
            ((MainFrame) getTopLevelAncestor()).pack();
        }
    });
ViewPanel#changeView(),这将交换面板:

public void changeView(int index) {
    removeAll();
    getPanels().get(index).setPreferredSize(Constants.PanelInfo.valueOf(getEngine().getChoiceList().get(index).getEnumName()).getDimensionForViewPanel());
    add(getPanels().get(index));
}

调整JFrame的大小后,请使用:
yourframe.validate()

在使用布局管理器时,不应使用setSize()。布局管理器的工作是确定尺寸。您可以通过设置指定或最小或最大尺寸,向布局管理器提供提示。但是,不建议您这样做,因为零部件和配电盘应按其首选尺寸显示,该尺寸将由您使用的布局管理器确定。如果确实覆盖了尺寸,则代码应为:

// enrol.setSize(new Dimension(400, 200));
enrol.setPreferredSize(new Dimension(400, 200));
但是,这仍然无法按您希望的方式工作,因为CardLayout的任务是确定使用CardLayout添加到面板的所有面板的最大尺寸。因此,当您从一个面板切换到另一个面板时,无法获得每个面板的大小。这对用户来说是一种更好的体验,因为用户不希望每次按下按钮时看到帧大小不断变化

如果您确实希望在每次单击按钮时更改帧大小,则基本代码为:

mainPanel.remove(oldPanel);
mainPanel.add(newPanel);
frame.pack();

然后,主面板的布局管理器将观察newlay添加面板的首选尺寸。

作为camickr的一个具体示例,下面的程序显示了如何在通过
pack()调整框架尺寸时依赖组件的首选尺寸。
。人造内容是一系列标签,但任何
JComponent
都可以。当动态重新创建内容时,它可以根据程序中的其他条件进行更改

import java.awt.BorderLayout;
import java.awt.EventQueue;
import java.awt.GridLayout;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import javax.swing.BorderFactory;
import javax.swing.JButton;
import javax.swing.JFrame;
import javax.swing.JLabel;
import javax.swing.JPanel;

/** @see https://stackoverflow.com/questions/7059278 */
class MainPanel extends JPanel {

    private static final String title = "Registration Panel";
    private JFrame frame = new JFrame(title);
    private JPanel registration = new JPanel();

    public MainPanel() {
        this.setLayout(new BorderLayout());
        registration.setBorder(BorderFactory.createTitledBorder(title));
        registration.add(PanelType.USER_AGREEMENT.panel);
        ButtonPanel buttonPanel = new ButtonPanel();
        buttonPanel.setBorder(BorderFactory.createTitledBorder("Button Panel"));
        add(registration, BorderLayout.CENTER);
        add(buttonPanel, BorderLayout.SOUTH);
    }

    private void display() {
        frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        frame.add(new MainPanel());
        frame.pack();
        frame.setLocationRelativeTo(null);
        frame.setVisible(true);
    }

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

            @Override
            public void run() {
                new MainPanel().display();
            }
        });
    }

    private class ButtonPanel extends JPanel {

        public ButtonPanel() {
            for (final PanelType panel : PanelType.values()) {
                final JButton button = panel.button;
                this.add(button);
                button.addActionListener(new ActionListener() {

                    @Override
                    public void actionPerformed(ActionEvent e) {
                        registration.removeAll();
                        registration.add(panel.create());
                        frame.pack();
                        frame.setLocationRelativeTo(null);
                    }
                });
            }
        }
    }

    private enum PanelType {

        USER_AGREEMENT("User Agreement", 2),
        USER_INFO("User Information", 4),
        ENROLLMENT("Enrollment Form", 6);
        private String name;
        private int count;
        private JButton button;
        private JPanel panel;

        private PanelType(String name, int count) {
            this.name = name;
            this.count= count;
            this.button = new JButton(name);
            this.panel = create();
        }

        private JPanel create() {
            this.panel = new JPanel(new GridLayout(0, 1));
            this.panel.add(new JLabel(name));
            this.panel.add(new JLabel(" "));
            for (int i = 0; i < count; i++) {
                this.panel.add(new JLabel("Label " + String.valueOf(i + 1)));
                            }
            return panel;
        }
    }
}

导入java.awt.BorderLayout;
导入java.awt.EventQueue;
导入java.awt.GridLayout;
导入java.awt.event.ActionEvent;
导入java.awt.event.ActionListener;
导入javax.swing.BorderFactory;
导入javax.swing.JButton;
导入javax.swing.JFrame;
导入javax.swing.JLabel;
导入javax.swing.JPanel;
/**@见https://stackoverflow.com/questions/7059278 */
类主面板扩展了JPanel{
私有静态最终字符串title=“注册面板”;
私有JFrame=新JFrame(标题);
私有JPanel注册=新JPanel();
公共主面板(){
此.setLayout(新的BorderLayout());
注册.setboorder(BorderFactory.createTitledBorder(title));
注册.add(PanelType.USER\u AGREEMENT.panel);
ButtonPanel ButtonPanel=新ButtonPanel();
buttonPanel.setOrder(BorderFactory.createTitledBorder(“按钮面板”));
添加(注册、边界布局、中心);
添加(按钮面板,边界布局。南部);
}
专用void display(){
frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
frame.add(新的主面板());
frame.pack();
frame.setLocationRelativeTo(空);
frame.setVisible(true);
}
公共静态void main(字符串[]args){
invokeLater(新的Runnable(){
@凌驾
公开募捐{
新建主面板().display();
}
});
}
私有类ButtonPanel扩展了JPanel{
公共按钮面板(){
对于(最终PanelType面板:PanelType.values()){
最终JButton按钮=panel.button;
这个。添加(按钮);
addActionListener(新建ActionListener()){
@凌驾
已执行的公共无效操作(操作事件e){
registration.removeAll();
registration.add(panel.create());
frame.pack();
frame.setLocationRelativeTo(空);
}
});
}
}
}
私有枚举面板类型{
用户协议(“用户协议”,2),
用户信息(“用户信息”,4),
报名(“报名表”,第6页);
私有字符串名称;
私人整数计数;
私人按钮;
私人JPanel小组;
专用面板类型(字符串名称、整数计数){
this.name=名称;
这个.count=count;
this.button=新的JButton(名称);
this.panel=create();
}
私有JPanel create(){
this.panel=newjpanel(newgridlayout(0,1));
此.panel.add(新JLabel(名称));
此.panel.add(新JLabel(“”);
for(int i=0;i
这可能对+1有帮助。@Tapas Bose,我在你接受答案前4小时给了你答案。我花时间解释了这个问题,并用几行演示代码解释了解决方案。我的答案怎么了?或者你希望人们每次都为你写代码吗?@camickr我相信那是因为垃圾神发布了一个完整的example@Eng这是我的观点。不需要发布完整的示例。给出了解释和解决方案。人们通过自己尝试和解决问题来学习,不应该期望我们为他们编写代码。发布工作代码不会解释原始问题是什么,也不会突出显示实际的解决方案。论坛是关于回答一个问题还是关于谁能发布最好的工作代码的竞争?调整框架的大小将导致框架被验证。