java - 无法将动态创建的复选框添加到 jPanel

标签 java swing

我想向 jFrame 上的 jpanel 添加复选框。 UI 是在 netbeans 上制作的,我已经复制了代码以在 eclipse 上使用其功能。 我无法让我的复选框出现在 Jpanel 上。

代码

    import java.awt.event.ItemEvent;
import java.awt.event.ItemListener;
import java.util.List;

import javax.swing.BorderFactory;
import javax.swing.DefaultComboBoxModel;
import javax.swing.JCheckBox;
import javax.swing.border.Border;

public class QueryBuilderUI extends javax.swing.JFrame {

QueryBuilderMethods objQBM = new QueryBuilderMethods();

DefaultComboBoxModel<String> repoModel = new DefaultComboBoxModel<String>();
public QueryBuilderUI() {
    getRepositoryListing();
    initComponents();
}
private void getRepositoryListing()
{
    repoModel = new QueryBuilderMethods().getAllRepositoryName();
}
@SuppressWarnings("unchecked")
// <editor-fold defaultstate="collapsed" desc="Generated Code">                          
private void initComponents() {

    jLabel1 = new javax.swing.JLabel();
    jComboBox1 = new javax.swing.JComboBox();
    jLabel2 = new javax.swing.JLabel();
    jComboBox2 = new javax.swing.JComboBox();
    jLabel3 = new javax.swing.JLabel();
    jPanel1 = new javax.swing.JPanel();
    jTextField1 = new javax.swing.JTextField();
    jLabel4 = new javax.swing.JLabel();

    setDefaultCloseOperation(javax.swing.WindowConstants.EXIT_ON_CLOSE);

    jLabel1.setText("Choose Repository");

    jComboBox1.setModel(repoModel);
    jComboBox1.addItemListener(new java.awt.event.ItemListener() {
        public void itemStateChanged(java.awt.event.ItemEvent evt) {
            jComboBox1ItemStateChanged(evt);
        }
    });

    jLabel2.setText("Choose Table");

    //jComboBox2.setModel(new javax.swing.DefaultComboBoxModel(new String[] { "Item 1", "Item 2", "Item 3", "Item 4" }));

    jComboBox2.addItemListener(new java.awt.event.ItemListener() {
        public void itemStateChanged(java.awt.event.ItemEvent evt) {
            jComboBox2ItemStateChanged(evt);
        }
    });


    jLabel3.setText("Choose Columns");

    javax.swing.GroupLayout jPanel1Layout = new javax.swing.GroupLayout(jPanel1);
    jPanel1.setLayout(jPanel1Layout);
    Border border = BorderFactory.createTitledBorder("Select Columns");
    jPanel1.setBorder(border);
    jPanel1Layout.setHorizontalGroup(
        jPanel1Layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
        .addGap(0, 459, Short.MAX_VALUE)
    );
    jPanel1Layout.setVerticalGroup(
        jPanel1Layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
        .addGap(0, 124, Short.MAX_VALUE)
    );

    jTextField1.setText("jTextField1");

    jLabel4.setText("Generated Query");

    javax.swing.GroupLayout layout = new javax.swing.GroupLayout(getContentPane());
    getContentPane().setLayout(layout);
    layout.setHorizontalGroup(
        layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
        .addGroup(layout.createSequentialGroup()
            .addContainerGap()
            .addGroup(layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
                .addGroup(layout.createSequentialGroup()
                    .addGroup(layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
                        .addComponent(jLabel1)
                        .addComponent(jLabel2))
                    .addGap(57, 57, 57)
                    .addGroup(layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
                        .addComponent(jComboBox1, javax.swing.GroupLayout.PREFERRED_SIZE, 106, javax.swing.GroupLayout.PREFERRED_SIZE)
                        .addComponent(jComboBox2, javax.swing.GroupLayout.PREFERRED_SIZE, 106, javax.swing.GroupLayout.PREFERRED_SIZE)))
                .addComponent(jLabel3)
                .addComponent(jLabel4)
                .addComponent(jPanel1, javax.swing.GroupLayout.PREFERRED_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.PREFERRED_SIZE)
                .addComponent(jTextField1, javax.swing.GroupLayout.PREFERRED_SIZE, 412, javax.swing.GroupLayout.PREFERRED_SIZE))
            .addContainerGap(65, Short.MAX_VALUE))
    );
    layout.setVerticalGroup(
        layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
        .addGroup(layout.createSequentialGroup()
            .addGap(18, 18, 18)
            .addGroup(layout.createParallelGroup(javax.swing.GroupLayout.Alignment.BASELINE)
                .addComponent(jLabel1)
                .addComponent(jComboBox1, javax.swing.GroupLayout.PREFERRED_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.PREFERRED_SIZE))
            .addGap(18, 18, 18)
            .addGroup(layout.createParallelGroup(javax.swing.GroupLayout.Alignment.BASELINE)
                .addComponent(jLabel2)
                .addComponent(jComboBox2, javax.swing.GroupLayout.PREFERRED_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.PREFERRED_SIZE))
            .addGap(18, 18, 18)
            .addComponent(jLabel3)
            .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED)
            .addComponent(jPanel1, javax.swing.GroupLayout.PREFERRED_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.PREFERRED_SIZE)
            .addGap(44, 44, 44)
            .addComponent(jLabel4)
            .addGap(18, 18, 18)
            .addComponent(jTextField1, javax.swing.GroupLayout.PREFERRED_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.PREFERRED_SIZE)
            .addContainerGap(92, Short.MAX_VALUE))
    );

    pack();
}// </editor-fold>                        

private void jComboBox1ItemStateChanged(java.awt.event.ItemEvent evt) {                                            
    // TODO add your handling code here:
    if(evt.getStateChange()== ItemEvent.SELECTED){
        Object item = evt.getItem();
        DefaultComboBoxModel<String> modelTable = objQBM.getAllTablesForRepo(item.toString());
        jComboBox2.setModel(modelTable);
    }
}    

private void jComboBox2ItemStateChanged(java.awt.event.ItemEvent evt) {                                            
    // TODO add your handling code here:
    if(evt.getStateChange()== ItemEvent.SELECTED){
        Object item = evt.getItem();
       String RepoName =  jComboBox1.getSelectedItem().toString();
       List<String> columnNames = objQBM.getAllColumnsForTable(item.toString());
        addCheckBox(columnNames);
    }
}    

   private void addCheckBox(List<String> columnNames)
  {
   int numberCheckBox = columnNames.size();
           JCheckBox[] checkBoxList = new JCheckBox[numberCheckBox];

           for(int i = 0; i < numberCheckBox; i++) {
               checkBoxList[i] = new JCheckBox("hi"+i);
               jPanel1.add(checkBoxList[i]);


           }

           jPanel1.revalidate();
   }



public static void main(String args[]) {



   // java.awt.EventQueue.invokeLater(new Runnable() {
   //     public void run() {
            new QueryBuilderUI().setVisible(true);


    //    }
   // });
    }

// Variables declaration - do not modify                     
private javax.swing.JComboBox jComboBox1;
private javax.swing.JComboBox jComboBox2;
private javax.swing.JLabel jLabel1;
private javax.swing.JLabel jLabel2;
private javax.swing.JLabel jLabel3;
private javax.swing.JLabel jLabel4;
private javax.swing.JPanel jPanel1;
private javax.swing.JTextField jTextField1;
// End of variables declaration                   
}

用户界面看起来像这样 Swng UI

需要根据 jComboBox2 上的选择动态创建复选框。

最佳答案

您的 jPanel1 JPanel 受到其布局 GroupLayout 的限制,如果没有对难以编写的代码进行大量添加,它不会友好地添加新组件,因为 GroupLayout 不是为了用于手动编码而构建的用于 GUI 构建器编码。我建议您使用对编码器更友好的布局来构建 GUI,或者更好的是,每个使用更简单的布局的嵌套 JPanel 的组合,更有利于添加新组件,然后您的问题将更容易已解决。

如果您愿意,您甚至仍然可以将 GroupLayout 用于 GUI 的主要部分,但不能用于 jPanel1。我建议您考虑使用 GridLayout 或 GridBagLayout 添加 JCheckBoxes 网格。甚至是 FlowLayout。例如,以下代码使用默认的 JPanel 的 FlowLayout:

import java.awt.Dimension;
import java.awt.event.ItemEvent;
import java.awt.event.ItemListener;
import java.util.ArrayList;
import java.util.List;

import javax.swing.BorderFactory;
import javax.swing.DefaultComboBoxModel;
import javax.swing.JCheckBox;
import javax.swing.border.Border;

public class QueryBuilderUI extends javax.swing.JFrame {

   protected static final int PREF_W = 400;

   protected static final int PREF_H = 200;

   QueryBuilderMethods objQBM = new QueryBuilderMethods();

   DefaultComboBoxModel<String> repoModel = new DefaultComboBoxModel<String>();

   public QueryBuilderUI() {
      getRepositoryListing();
      initComponents();
   }

   private void getRepositoryListing() {
      repoModel = new QueryBuilderMethods().getAllRepositoryName();
   }

   @SuppressWarnings("unchecked")
   // <editor-fold defaultstate="collapsed" desc="Generated Code">
   private void initComponents() {

      jLabel1 = new javax.swing.JLabel();
      jComboBox1 = new javax.swing.JComboBox();
      jLabel2 = new javax.swing.JLabel();
      jComboBox2 = new javax.swing.JComboBox();
      jLabel3 = new javax.swing.JLabel();
      jPanel1 = new javax.swing.JPanel() {
         @Override 
         // !! so the JPanel has some size. This is a shameless kludge *****
         public Dimension getPreferredSize() {
            if (isPreferredSizeSet()) {
               return super.getPreferredSize();
            }
            return new Dimension(PREF_W, PREF_H);
         }
      };
      jTextField1 = new javax.swing.JTextField();
      jLabel4 = new javax.swing.JLabel();

      setDefaultCloseOperation(javax.swing.WindowConstants.EXIT_ON_CLOSE);

      jLabel1.setText("Choose Repository");

      jComboBox1.setModel(repoModel);
      jComboBox1.addItemListener(new java.awt.event.ItemListener() {
         public void itemStateChanged(java.awt.event.ItemEvent evt) {
            jComboBox1ItemStateChanged(evt);
         }
      });

      jLabel2.setText("Choose Table");

      // jComboBox2.setModel(new javax.swing.DefaultComboBoxModel(new String[] {
      // "Item 1", "Item 2", "Item 3", "Item 4" }));

      jComboBox2.addItemListener(new java.awt.event.ItemListener() {
         public void itemStateChanged(java.awt.event.ItemEvent evt) {
            jComboBox2ItemStateChanged(evt);
         }
      });

      jLabel3.setText("Choose Columns");

      // *************** Note Changes Below ****************

      // !! javax.swing.GroupLayout jPanel1Layout = new javax.swing.GroupLayout(
      // !! jPanel1);
      // !! jPanel1.setLayout(jPanel1Layout);

      // !! jPanel1 now uses JPanel's default FlowLayout

      Border border = BorderFactory.createTitledBorder("Select Columns");
      jPanel1.setBorder(border);

      jTextField1.setText("jTextField1");

      jLabel4.setText("Generated Query");

      javax.swing.GroupLayout layout = new javax.swing.GroupLayout(
            getContentPane());
      getContentPane().setLayout(layout);
      layout.setHorizontalGroup(layout
            .createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
            .addGroup(
                  layout.createSequentialGroup()
                        .addContainerGap()
                        .addGroup(
                              layout.createParallelGroup(
                                    javax.swing.GroupLayout.Alignment.LEADING)
                                    .addGroup(
                                          layout.createSequentialGroup()
                                                .addGroup(
                                                      layout.createParallelGroup(
                                                            javax.swing.GroupLayout.Alignment.LEADING)
                                                            .addComponent(
                                                                  jLabel1)
                                                            .addComponent(
                                                                  jLabel2))
                                                .addGap(57, 57, 57)
                                                .addGroup(
                                                      layout.createParallelGroup(
                                                            javax.swing.GroupLayout.Alignment.LEADING)
                                                            .addComponent(
                                                                  jComboBox1,
                                                                  javax.swing.GroupLayout.PREFERRED_SIZE,
                                                                  106,
                                                                  javax.swing.GroupLayout.PREFERRED_SIZE)
                                                            .addComponent(
                                                                  jComboBox2,
                                                                  javax.swing.GroupLayout.PREFERRED_SIZE,
                                                                  106,
                                                                  javax.swing.GroupLayout.PREFERRED_SIZE)))
                                    .addComponent(jLabel3)
                                    .addComponent(jLabel4)
                                    .addComponent(
                                          jPanel1,
                                          javax.swing.GroupLayout.PREFERRED_SIZE,
                                          javax.swing.GroupLayout.DEFAULT_SIZE,
                                          javax.swing.GroupLayout.PREFERRED_SIZE)
                                    .addComponent(
                                          jTextField1,
                                          javax.swing.GroupLayout.PREFERRED_SIZE,
                                          412,
                                          javax.swing.GroupLayout.PREFERRED_SIZE))
                        .addContainerGap(65, Short.MAX_VALUE)));
      layout.setVerticalGroup(layout.createParallelGroup(
            javax.swing.GroupLayout.Alignment.LEADING).addGroup(
            layout.createSequentialGroup()
                  .addGap(18, 18, 18)
                  .addGroup(
                        layout.createParallelGroup(
                              javax.swing.GroupLayout.Alignment.BASELINE)
                              .addComponent(jLabel1)
                              .addComponent(jComboBox1,
                                    javax.swing.GroupLayout.PREFERRED_SIZE,
                                    javax.swing.GroupLayout.DEFAULT_SIZE,
                                    javax.swing.GroupLayout.PREFERRED_SIZE))
                  .addGap(18, 18, 18)
                  .addGroup(
                        layout.createParallelGroup(
                              javax.swing.GroupLayout.Alignment.BASELINE)
                              .addComponent(jLabel2)
                              .addComponent(jComboBox2,
                                    javax.swing.GroupLayout.PREFERRED_SIZE,
                                    javax.swing.GroupLayout.DEFAULT_SIZE,
                                    javax.swing.GroupLayout.PREFERRED_SIZE))
                  .addGap(18, 18, 18)
                  .addComponent(jLabel3)
                  .addPreferredGap(
                        javax.swing.LayoutStyle.ComponentPlacement.RELATED)
                  .addComponent(jPanel1,
                        javax.swing.GroupLayout.PREFERRED_SIZE,
                        javax.swing.GroupLayout.DEFAULT_SIZE,
                        javax.swing.GroupLayout.PREFERRED_SIZE)
                  .addGap(44, 44, 44)
                  .addComponent(jLabel4)
                  .addGap(18, 18, 18)
                  .addComponent(jTextField1,
                        javax.swing.GroupLayout.PREFERRED_SIZE,
                        javax.swing.GroupLayout.DEFAULT_SIZE,
                        javax.swing.GroupLayout.PREFERRED_SIZE)
                  .addContainerGap(92, Short.MAX_VALUE)));

      pack();
   }// </editor-fold>

   private void jComboBox1ItemStateChanged(java.awt.event.ItemEvent evt) {
      // TODO add your handling code here:
      if (evt.getStateChange() == ItemEvent.SELECTED) {
         Object item = evt.getItem();
         DefaultComboBoxModel<String> modelTable = objQBM
               .getAllTablesForRepo(item.toString());
         jComboBox2.setModel(modelTable);
      }
   }

   private void jComboBox2ItemStateChanged(java.awt.event.ItemEvent evt) {
      // TODO add your handling code here:
      if (evt.getStateChange() == ItemEvent.SELECTED) {
         Object item = evt.getItem();
         String RepoName = jComboBox1.getSelectedItem().toString();
         List<String> columnNames = objQBM.getAllColumnsForTable(item
               .toString());
         addCheckBox(columnNames);
      }
   }

   private void addCheckBox(List<String> columnNames) {
      int numberCheckBox = columnNames.size();
      JCheckBox[] checkBoxList = new JCheckBox[numberCheckBox];

      System.out.println("numberCheckBox = " + numberCheckBox);
      for (int i = 0; i < numberCheckBox; i++) {
         checkBoxList[i] = new JCheckBox("hi" + i);
         jPanel1.add(checkBoxList[i]);

      }

      jPanel1.revalidate();
      jPanel1.repaint();
      System.out.println("check boxes added");
   }

   public static void main(String args[]) {

      // java.awt.EventQueue.invokeLater(new Runnable() {
      // public void run() {
      new QueryBuilderUI().setVisible(true);

      // }
      // });
   }

   // Variables declaration - do not modify
   private javax.swing.JComboBox jComboBox1;
   private javax.swing.JComboBox jComboBox2;
   private javax.swing.JLabel jLabel1;
   private javax.swing.JLabel jLabel2;
   private javax.swing.JLabel jLabel3;
   private javax.swing.JLabel jLabel4;
   private javax.swing.JPanel jPanel1;
   private javax.swing.JTextField jTextField1;
   // End of variables declaration
}

// mock code added so that the above code will compile and run
// because you didn't give us this code
class QueryBuilderMethods {

   public DefaultComboBoxModel<String> getAllRepositoryName() {
      DefaultComboBoxModel<String> cModel = new DefaultComboBoxModel<>();
      for (String item : new String[] { "one", "two", "three", "four", "five" }) {
         cModel.addElement(item);
      }
      return cModel;
   }

   public List<String> getAllColumnsForTable(String string) {
      List<String> columns = new ArrayList<>();
      for (String item : new String[] { "col 1", "col 2", "col 3", "col 4" }) {
         columns.add(item);
      }
      return columns;
   }

   public DefaultComboBoxModel<String> getAllTablesForRepo(String string) {
      DefaultComboBoxModel<String> cModel = new DefaultComboBoxModel<>();
      for (String item : new String[] { "repo one", "repo two", "repo three",
            "repo four", "repo five" }) {
         cModel.addElement(item);
      }
      return cModel;
   }

}

关于java - 无法将动态创建的复选框添加到 jPanel,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/31579126/

相关文章:

Java ServerSocket OutputStream 不刷新

java - 一旦请求被分派(dispatch)到 JSP,后端会发生什么

java - 通过用户输入绘制 Swing 线

java - 在 Java 中停止 MouseMoved 事件

java - 如何在 Mac OS 上设置 JButton 的背景颜色

java - hibernate 插入错误: ids for this class must be manually assigned before calling save():

java - 在使用 JNI 将 c++ unordered_map 返回到 java 之前将其转换为 java hashMap

java - 使 JScrollPane 自动向下滚动

java - JTextPane - 获取组件值

java - 如何使用 Gradle 的 Java API 定义过滤后的 FileTree?