有 Java 编程相关的问题?

你可以在下面搜索框中键入要查询的问题!

java如何使用给定参数动态创建JPanel?

我的项目中有主要的JFrame。以及一个带有Y-AXIS BoxLayout的主JPanel,用于包含其中的另一个面板。这是我默认使用JFrame来显示JPanel的方式(我不太确定这是否正确):

public static void main(String args[]) {

    java.awt.EventQueue.invokeLater(new Runnable() {
        public void run() {
           mainPanel = new MainScreenPanel();
            MainFrame mainFrame = new MainFrame();
            mainFrame.setContentPane(mainPanel);
            mainFrame.invalidate();
            mainFrame.validate();
            mainFrame.setVisible(true);
        }
    });
}

接下来,我将两个JPanel添加到mainPanel中,如下所示:

public class MainScreenPanel extends javax.swing.JPanel {

    public MainScreenPanel() {
        StatusPanel sPanel = new StatusPanel();
        LogPanel lPanel = new LogPanel();
        add(sPanel);
        add(lPanel);
    }

}

lPanel上有不同的gui元素。其中一个按钮打开另一个面板(addConnectionPanel),并替换jFrame中的mainPanel。我的方法如下:

private void addCnctButtonActionPerformed(java.awt.event.ActionEvent evt) {                                              
    JFrame topFrame = (JFrame) SwingUtilities.getWindowAncestor(this);
    topFrame.setContentPane(new AddConnectionPanel());
    topFrame.invalidate();
    topFrame.validate();
}   

AddConectionPanel有一些标签和输入文本框。它有两个按钮okcancel。以下是cancel按钮的代码:

private void cancelCnctBtnActionPerformed(java.awt.event.ActionEvent evt) {                                              
    JFrame topFrame = (JFrame) SwingUtilities.getWindowAncestor(this);
    topFrame.setContentPane(new MainScreenPanel());
    topFrame.invalidate();
    topFrame.validate();
}

sPanel为空。在AddConnectionPanel上的输入框未填满且未按下“确定”按钮之前,该字段必须为空。执行这些操作时,我想动态创建JLabels,它从sPanel上的输入获取参数。标签应该分组,所以当第二次执行操作时,必须创建新的组。有人能给我一些建议吗?让我看看我的错误?请记住,我正在使用NetBeans


共 (1) 个答案

  1. # 1 楼答案

    这就是我的方法:

    public interface ConnectionPanelListener{
        void onOkButtonClicked(String... options);
    
        void onCancelButtonClicked();
    }
    
    
    public class AddConnectionPanel extends JPanel {
    
        private static final long serialVersionUID = 1L;
    
        private ConnectionPanelListener listener;
    
    
        public AddConnectionPanel(){
            final Map<ConnectionOptions, JTextField> components = new HashMap<>(ConnectionOptions.values().length);
    
            for(ConnectionOptions option:ConnectionOptions.values()){
                this.add(new JLabel(option.labelCaption));
    
                JTextField textField = new JTextField();
                //setup textField;
                this.add(textField);
    
                components.put(option, textField);
            }
            JButton button = new JButton("OK");
            button.addMouseListener(new MouseAdapter() {
                @Override
                public void mouseClicked(final MouseEvent pE) {
                    super.mouseClicked(pE);
                    //TODO validate TextFields
    
                    Collection<String> inputs = new Stack<>();
    
                    for(Entry<?,JTextField> e : components.entrySet()){
                        String text = e.getValue().getText();
    
                        if(text==null || text.trim().isEmpty()){
                            //TODO improve input validation
                            System.out.println("Input text is empty for: "+e.getKey());
                        } else {
                            inputs.add(e.getKey() + ": " + text);
                        }
                    }
                    listener.onOkButtonClicked(inputs.toArray(new String[inputs.size()]));
                }
            });
            this.add(button);
            button = new JButton("cancel");
            button.addMouseListener(new MouseAdapter() {
                @Override
                public void mouseClicked(final MouseEvent pE) {
                    super.mouseClicked(pE);
    
                    listener.onCancelButtonClicked();
                }
            });
            this.add(button);
        }
    
        public void setConnectionPanelListener(final ConnectionPanelListener l){
            listener = l;
        }
    
        private enum ConnectionOptions{
            IP_ADDRESS("IP-Address:"), PORT("Port:"), WHATEVER_ATTRIBUTE_YOU_NEED("Extras:"); 
    
            private String labelCaption;
    
            private ConnectionOptions(final String caption) {
                labelCaption = caption;
            }
        }
    }
    

    如您所见,AddConnectionPanel希望侦听器注册案例,单击“确定”或“取消”。因此,调整后的实现可能如下所示:

    private void addCnctButtonActionPerformed(java.awt.event.ActionEvent evt) {                                              
        JFrame topFrame = (JFrame) SwingUtilities.getWindowAncestor(this);
    
        AddConnectionPanel panel = new AddConnectionPanel();
        panel.setConnectionPanelListener(new ConnectionPanelListener(){
    
            @Override
            void onOkButtonClicked(String... options){ TODO: fill sPanel using the given Strings }
    
            @Override
            void onCancelButtonClicked(){ TODO }
        });
    
        topFrame.setContentPane(panel);
        topFrame.invalidate();
        topFrame.validate();
    }