繁体   English   中英

在Java swing中动态添加复选框

[英]dynamically adding checkboxes in java swing

对给定代码的引用..i可以在for循环(在try-catch块内)的if语句内访问print语句,但是未添加复选框。 我正在使用revalidating和repaint功能,但仍然无法正常工作。 除了添加的jscrollpane,try-catch块中的for循环正在运行。 我哪里错了?

 /*
 * To change this license header, choose License Headers in Project Properties.
 * To change this template file, choose Tools | Templates
 * and open the template in the editor.
 */
package com.anurag;
import com.anurag.HttpURLConnectionExample;
import java.awt.Dimension;
import java.awt.FlowLayout;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.io.File;

import javax.swing.Box;
import javax.swing.JButton;
import javax.swing.JCheckBox;
import javax.swing.JFrame;
import javax.swing.JLabel;
import javax.swing.JOptionPane;
import javax.swing.JScrollPane;
import javax.swing.JTextField;
import jxl.Cell;
import jxl.Sheet;
import jxl.Workbook;

/**
 *
 * @author Anurag
 */
public class MainGui {

   static JFrame frame = new JFrame("Rest Testing");

    public static void main(String args[]) {

frame.setLayout(new FlowLayout());
frame.setSize(500, 500);
frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
  final JTextField path = new JTextField("getresponse.xls");
   frame.add(path);


  JButton upload = new JButton("Upload");
    frame.add(upload);

    upload.addActionListener(new ActionListener(){ 
        @Override
        public void actionPerformed(ActionEvent arg0) {



             JScrollPane jscrlpLabel = new JScrollPane(new JLabel(
             "<HTML>A<br>B<br>C<br>D<br>E<br>F<br>G<br>H<br></HTML>"));
             jscrlpLabel.setPreferredSize(new Dimension(200, 100));
             frame.add(jscrlpLabel);
             frame.revalidate();
             frame.repaint();


       try{    
             System.out.println(path.getText());
             HttpURLConnectionExample http  = new HttpURLConnectionExample();
             int noOfRows = http.setPath(path.getText());

              Workbook workbook = Workbook.getWorkbook(new File(path.getText()));
              Sheet sheet = workbook.getSheet(0);

             Cell cell= sheet.findCell("S. No.");

             int col=cell.getColumn();
             int row=cell.getRow();
             row=row+2;
             //System.out.println("row="+row+"col="+col);
             for(int i=row;i<noOfRows;i++,row++)
             {   
                 int p=http.readFile(col,row);
                 if(p==1){

                      JCheckBox cb = new JCheckBox("CheckBox");
                      JScrollPane jscrlp = new JScrollPane(cb);
                      jscrlp.setPreferredSize(new Dimension(140, 95));
                      frame.add(jscrlp);
                      frame.revalidate();
                     frame.repaint();



                     System.out.println("Checkbox created");
                  }  
                 else if(p==2){
                     JCheckBox cb1 = new JCheckBox("CheckBox ");
                     Box box = Box.createVerticalBox();
                     box.add(cb1);
                     JScrollPane jScrollPane1 = new JScrollPane(box);
                     jScrollPane1.setPreferredSize(new Dimension(140, 95));
                     frame.add(jScrollPane1);
                     frame.revalidate();
                     frame.repaint();

                     System.out.println("Checkbox created with textfield");
                 }
             }
             http.getData();

        }catch(Exception e){System.out.println("Exception is "+e);}

            }
    });









 //JOptionPane.showMessageDialog(null, "Done", "Alert", WIDTH);
 JCheckBox a = new JCheckBox("A");
JCheckBox b = new JCheckBox("B");
JLabel label = new JLabel("Option");

Box box = Box.createVerticalBox();
box.add(label);
box.add(a);
box.add(b);

JScrollPane jscrlpBox = new JScrollPane(box);
jscrlpBox.setPreferredSize(new Dimension(240, 150));
//f.add(jscrlpLabel);
frame.add(jscrlpBox);

frame.setVisible(true);
}

}

首先通读使用JFC / Swing创建GUI在容器中布置组件 ,Swing中的并发以及如何使用滚动窗格。

  • Box并不是真正的“可见”组件,它是与BoxLayout一起使用的功能
  • 您正在向单个视图添加多个JScrollPane ,这让我感觉很奇怪
  • 我应该避免在Java Swing中使用set(Preferred | Maximum | Minimum)Size方法吗?
  • 您正在从事件调度线程中更新UI,但是您做出决定的过程可能需要花一些时间才能运行,这可能会使UI看起来像什么都没做,直到actionPerformed方法存在
  • 一直调用revaldiate没有什么意义,直到您完成整个UI的更新为止,从长远来看,它将提供更好的性能

通过创建一个启动JPanel ,你再包装一个JScrollPane周围,添加JScrollPane的基本UI

根据需要,从此JPanel添加和删​​除组件,例如...

例

public class MainGui {

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

    private JFrame frame = new JFrame("Rest Testing");
    private JPanel checkboxes;

    public MainGui() {
        EventQueue.invokeLater(new Runnable() {
            @Override
            public void run() {
                try {
                    UIManager.setLookAndFeel(UIManager.getSystemLookAndFeelClassName());
                } catch (ClassNotFoundException | InstantiationException | IllegalAccessException | UnsupportedLookAndFeelException ex) {
                    ex.printStackTrace();
                }

                frame.setSize(500, 500);
                frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
                final JTextField path = new JTextField("getresponse.xls");

                JPanel fields = new JPanel();
                fields.add(path);

                JButton upload = new JButton("Upload");
                fields.add(upload);

                frame.add(fields, BorderLayout.NORTH);

                checkboxes = new JPanel(new GridBagLayout());
                JScrollPane scrollPane = new JScrollPane(checkboxes);

                frame.add(scrollPane);

                upload.addActionListener(new ActionListener() {
                    @Override
                    public void actionPerformed(ActionEvent arg0) {

                        GridBagConstraints gbc = new GridBagConstraints();
                        gbc.gridwidth = GridBagConstraints.REMAINDER;
                        gbc.anchor = GridBagConstraints.WEST;
                        gbc.weightx = 1;

                        checkboxes.add(new JLabel("<HTML>A<br>B<br>C<br>D<br>E<br>F<br>G<br>H<br></HTML>"), gbc);

                        try {
                            int noOfRows = 100;
                            for (int row = 0; row < noOfRows; row++, row++) {
                                int p = (int) ((Math.random() * 2) + 1);
                                System.out.println(p);
                                if (p == 1) {

                                    JCheckBox cb = new JCheckBox("CheckBox");
                                    checkboxes.add(cb, gbc);

                                } else if (p == 2) {

                                    JCheckBox cb1 = new JCheckBox("CheckBox ");
                                    JPanel stuff = new JPanel();
                                    stuff.add(cb1);
                                    stuff.add(new JTextField(10));
                                    checkboxes.add(stuff, gbc);

                                }
                            }

                        } catch (Exception e) {
                            System.out.println("Exception is " + e);
                        }

                        checkboxes.revalidate();
                        checkboxes.repaint();
                    }
                });

                //JOptionPane.showMessageDialog(null, "Done", "Alert", WIDTH);
                JCheckBox a = new JCheckBox("A");
                JCheckBox b = new JCheckBox("B");
                JLabel label = new JLabel("Option");

                JPanel stuff = new JPanel();
                stuff.add(label);
                stuff.add(a);
                stuff.add(b);
                GridBagConstraints gbc = new GridBagConstraints();
                gbc.gridwidth = GridBagConstraints.REMAINDER;
                gbc.anchor = GridBagConstraints.WEST;
                gbc.weightx = 1;
                checkboxes.add(stuff, gbc);

                frame.pack();
                frame.setLocationRelativeTo(null);
                frame.setVisible(true);

            }
        });
    }

}

现在,我不确定100%,但是您可能会发现使用JTable会产生您所追求的外观。 如何使用表格

您不能将复选框直接添加到滚动窗格,需要创建列表模型。 您将需要滚动窗格,列表渲染器,模型和自定义JCheckboxList类。 请参阅以下问题:

如何在Java Swing中使用复选框列出列表?

另外,您可能会在JScrollPane的视口所在的位置遇到一个问题:

JList中的组件被White Square Thing隐藏直到被单击

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM