动态创建 jCheckBox 并添加到 jScrollPane

2024-03-30

编辑:使用下面提供的解决方案,我更改了代码以在 JScrollPane 中包含 JPanel。使用 JButton,我将 JCheckBox 添加到 JScrollPane 内的 JPanel。这是一个已解决的问题,因为 JScrollPane 只能采用一个 JComponent。其余问题已通过在 JScrollPane 内的 JPanel 设置网格布局来解决。为了后代,我将原来的问题保留在这里:

原始问题:我正在尝试动态创建 JCheckBox 并将它们添加到 JScrollPane 中,但可惜我收效甚微。我已将其简化为单个概念验证实现。

我在 JFrame 内有一个 JScrollPaneon 和 JPanel。另外,在 JPanel 上,我添加了一个按钮,单击该按钮应该将 JCheckBox 添加到 JScrollPane 中。应该很简单。按钮内部的代码如下:

 private void addCheckBoxActionPerformed(java.awt.event.ActionEvent evt) {

    JCheckBox cb = new JCheckBox("New CheckBox");        

    jScrollPaneCheckBoxes.add(cb);
    jScrollPaneCheckBoxes.revalidate();
 }

代码运行起来似乎没有错误。我没有例外,使用调试器显示 JCheckBox 实际上已添加到 JScrollPane 中。不幸的是,应用程序中没有显示任何内容。我需要指导去哪里寻找问题。

这是一段您可以直接运行的快速代码。不幸的是,我使用 Netbeans 及其 GUI 设计器将其组合在一起,因此它比所需的长度要长一些,尤其是生成的代码。重点关注方法 jButton1ActionPerformed,上面的代码就取自该方法。

编辑:这段代码现在可以满足我的需要。 :-)

package dynamiccheckboxsscce;

import javax.swing.JCheckBox;

public class Main extends javax.swing.JFrame {

    /**
     * Creates new form Main
     */
    public Main() {
        initComponents();
    }

    @SuppressWarnings("unchecked")
    private void initComponents() {

        jScrollPane1 = new javax.swing.JScrollPane();
        jPanel1 = new javax.swing.JPanel();
        jButton1 = new javax.swing.JButton();

        setDefaultCloseOperation(javax.swing.WindowConstants.EXIT_ON_CLOSE);

        jScrollPane1.setHorizontalScrollBarPolicy(javax.swing.ScrollPaneConstants.HORIZONTAL_SCROLLBAR_NEVER);
        jScrollPane1.setPreferredSize(new java.awt.Dimension(250, 250));

        jPanel1.setPreferredSize(new java.awt.Dimension(300, 250));
        jPanel1.setLayout(new java.awt.GridLayout(0, 2, 10, 10));
        jScrollPane1.setViewportView(jPanel1);

        jButton1.setText("Add Checkbox");
        jButton1.addActionListener(new java.awt.event.ActionListener() {
            public void actionPerformed(java.awt.event.ActionEvent evt) {
                jButton1ActionPerformed(evt);
            }
        });

        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()
                .addComponent(jScrollPane1, javax.swing.GroupLayout.DEFAULT_SIZE, 309, Short.MAX_VALUE)
                .addContainerGap())
                .addGroup(javax.swing.GroupLayout.Alignment.TRAILING, layout.createSequentialGroup()
                .addGap(0, 0, Short.MAX_VALUE)
                .addComponent(jButton1)
                .addGap(112, 112, 112)))));
        layout.setVerticalGroup(
                layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
                .addGroup(javax.swing.GroupLayout.Alignment.TRAILING, layout.createSequentialGroup()
                .addContainerGap()
                .addComponent(jScrollPane1, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, Short.MAX_VALUE)
                .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED, 11, Short.MAX_VALUE)
                .addComponent(jButton1)
                .addContainerGap()));

        pack();
    }

    private void jButton1ActionPerformed(java.awt.event.ActionEvent evt) {
        JCheckBox cb = new JCheckBox("New CheckBox");

        jPanel1.add(cb);
        jPanel1.revalidate();
        jPanel1.repaint();
    }

    /**
     * @param args the command line arguments
     */
    public static void main(String args[]) {
        /*
         * Set the Nimbus look and feel
         */
        try {
            for (javax.swing.UIManager.LookAndFeelInfo info : javax.swing.UIManager.getInstalledLookAndFeels()) {
                if ("Nimbus".equals(info.getName())) {
                    javax.swing.UIManager.setLookAndFeel(info.getClassName());
                    break;
                }
            }
        } catch (ClassNotFoundException ex) {
            java.util.logging.Logger.getLogger(Main.class.getName()).log(java.util.logging.Level.SEVERE, null, ex);
        } catch (InstantiationException ex) {
            java.util.logging.Logger.getLogger(Main.class.getName()).log(java.util.logging.Level.SEVERE, null, ex);
        } catch (IllegalAccessException ex) {
            java.util.logging.Logger.getLogger(Main.class.getName()).log(java.util.logging.Level.SEVERE, null, ex);
        } catch (javax.swing.UnsupportedLookAndFeelException ex) {
            java.util.logging.Logger.getLogger(Main.class.getName()).log(java.util.logging.Level.SEVERE, null, ex);
        }

        /*
         * Create and display the form
         */
        java.awt.EventQueue.invokeLater(new Runnable() {
            public void run() {
                new Main().setVisible(true);
            }
        });
    }
    private javax.swing.JButton jButton1;
    private javax.swing.JPanel jPanel1;
    private javax.swing.JScrollPane jScrollPane1;
}

提前致谢。


  • 没有发布SSCCE http://sscce.org/你必须接受这一点JScrollPane http://docs.oracle.com/javase/tutorial/uiswing/components/scrollpane.html被指定只嵌套一个JComponent,

  • 如果您想添加更多JComponent to the JScrollPane,放在那里JPanel http://docs.oracle.com/javase/tutorial/uiswing/components/panel.html然后添加一个新的JComponent to the JPanel代替JScrollPane

  • 去检查如何动态添加/删除JComponent https://stackoverflow.com/a/6989230/714968

EDIT

  • 您必须为 JPanel 设置正确的 LayoutManager

  • 您必须将 JPanel 添加到 JScrollPane

  • 例如(不使用内置设计器,即使是安全时间......,也需要有关使用的 SwingFramework 和 Swing 的最佳知识,我对普通 Swing 感到满意)

code

import java.awt.BorderLayout;
import java.awt.GridLayout;
import javax.swing.JButton;
import javax.swing.JCheckBox;
import javax.swing.JFrame;
import javax.swing.JPanel;
import javax.swing.JScrollPane;

public class AddJCheckBoxToJScrollPane {

    private static final long serialVersionUID = 1L;
    private JFrame frame = new JFrame();
    private JButton jButton1;
    private JPanel jPanel1;
    private JScrollPane jScrollPane1;

    public AddJCheckBoxToJScrollPane() {
        jPanel1 = new JPanel();
        jPanel1.setLayout(new GridLayout(0, 2, 10, 10));
        jScrollPane1 = new JScrollPane(jPanel1);
        jButton1 = new JButton("Add Checkbox");
        jButton1.addActionListener(new java.awt.event.ActionListener() {

            public void actionPerformed(java.awt.event.ActionEvent evt) {
                JCheckBox cb = new JCheckBox("New CheckBox");
                jPanel1.add(cb);
                jPanel1.revalidate();
                jPanel1.repaint();
            }
        });
        frame.add(jScrollPane1);
        frame.add(jButton1, BorderLayout.SOUTH);
        frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        frame.setSize(300, 200);
        //frame.pack();
        frame.setLocationRelativeTo(null);
        frame.setVisible(true);
    }

    public static void main(String args[]) {

        try {
            for (javax.swing.UIManager.LookAndFeelInfo info : javax.swing.UIManager.getInstalledLookAndFeels()) {
                if ("Nimbus".equals(info.getName())) {
                    javax.swing.UIManager.setLookAndFeel(info.getClassName());
                    break;
                }
            }
        } catch (ClassNotFoundException ex) {
        } catch (InstantiationException ex) {
        } catch (IllegalAccessException ex) {
        } catch (javax.swing.UnsupportedLookAndFeelException ex) {
        }
        java.awt.EventQueue.invokeLater(new Runnable() {

            public void run() {
                new AddJCheckBoxToJScrollPane();
            }
        });
    }
}
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

动态创建 jCheckBox 并添加到 jScrollPane 的相关文章

随机推荐

  • iOS 10 问题:即使设置了 ContentSize,UIScrollView 也不滚动

    UPDATE 这是 iOS 10 的问题 这在 iOS 9 中仍然像以前一样有效 当你设置时它就会起作用contentSize在主线程上并将此代码放入 void viewDidLayoutSubviews void viewDidLayou
  • Excel COUNTIF 特殊字符

    是否可以计算整列中的特定特殊字符 我正在尝试数所有逗号 在一个专栏中 这就是我正在使用的 COUNTIF D3 D45 问题是这仅计算单元格中单独的逗号 如果我在单元格中添加任何其他内容 在逗号之前或之后 则不会计数 我正在计数的细胞示例
  • Datanode 在单机上的 Hadoop 中失败

    我使用以下教程在 ubuntu 12 04 LTS 上设置并配置了 sudo 节点 hadoop 环境http www michael noll com tutorials running hadoop on ubuntu linux mu
  • 哪些事件附加到元素?

    如何接收附加到元素的所有事件dojo http dojotoolkit org dojo query mydiv which events does mydiv has 获取 DOM 元素上的所有事件 Get my div myDiv do
  • 复制时谁负责释放数组中的对象?

    在 Objective C 中 如果使用 mutableCopy 将 array1 复制到 array2 并且假设代码在 main 中完成 那么谁负责释放数组中包含的对象 是main 还是array2 我觉得前面的回答都没有抓住重点 或者说
  • 困惑:SQLiteOpenHelper onUpgrade() 的行为如何?并与旧数据库备份一起导入?

    假设我有一个包含 2 列的数据库表 test table 以及 SQLiteOpenHelper 中相应的创建脚本 DB VERSION 1 public void onCreate SQLiteDatabase db db execSql
  • Erlang中如何维护状态?

    我见过人们使用口述 命令 记录用于维护我读过的许多博客中的状态 我发现这是一个非常重要的概念 一般来说 我理解维护状态和递归的含义 但是当涉及到 Erlang 时 我对它的处理方式有点模糊 有什么帮助吗 维护状态的最简单方法是使用gen s
  • 在 Python 中迭代 Stern-Brocot 树的部分内容

    我的目标是迭代 a b a 与 b 的互质对并且 a b我的第一个想法是使用 Stern Brocot 树的递归函数 def Stern Brocot n a 0 b 1 c 1 d 1 if a b c d gt n return 0 x
  • Android BOOT_COMPLETED 事件未启动服务

    我正在编写一个小型 Android 应用程序 它在设备启动时启动我的服务 应用程序在所有 Android 版本 4 4 2 Mi Note 4G 必须在其安全应用程序中启用权限 5 0 Lenovo K3 Note 5 1 一加一 6 Ne
  • Windows 上的 qmake 触摸功能

    qmake 手册记录了touch更新文件时间戳的函数 请参阅 触摸 文件名 参考文件名 http doc qt io qt 5 qmake test function reference html touchfunction 推荐here
  • 如何使用 Firebase 通过我的 Android 应用程序保持用户持续登录

    我目前正在使用 Android Studios 编写一个使用 Firebase 的应用程序 我的问题是 当我登录时 如何在应用程序的整个生命周期中保持该状态 直到我选择注销 到目前为止我在 MainActivity 中做了什么 IN MAI
  • C++ AMP 目前的状况如何

    我正在使用 C 编写高性能代码 并且一直在使用 CUDA 和 OpenCL 最近还使用我非常喜欢的 C AMP 然而 我有点担心它没有得到发展和扩展 并且会消亡 让我产生这个想法的是 即使是 MS C AMP 博客也已经沉默了大约一年 查看
  • Windows 上 JavaFX 的 Gluon 客户端 Maven 插件无法编译?

    我一直在 Windows 机器上为我的一个项目试验 Gluon 的客户端 Maven 插件 我决定尝试一下他们的 hello world 示例之一 here https github com gluonhq client samples我遵
  • 如何访问变量的原始值

    假设我有这个代码 public static long number public static void main String args String str1 args 0 System out println str1 is str
  • 升级到 Cordova 5.0 + [电子邮件受保护] 后,Ajax 请求失败

    我最近升级到 Cordova 5 0 和 Cordova Android 4 0 从那时起 我的应用程序无法再访问外部资源 我还有
  • 使用 Scala 3 宏重写方法

    我正在尝试使用 Scala 3 宏和 TASTY 重写方法 我想重写任何类型的任何方法 现在我从这个简单的案例开始 我有一个测试基类 class TestClass def func s String base 我想实现这一点 但使用 TA
  • 需要 Django 表单帮助

    我是 django 新手 正在尝试制作一个几乎不需要验证的用户注册表单 除此之外 我还想要一个用户名建议代码 它将告诉用户他尝试注册的用户名是否可用或已在使用中 然后它应该给出一些可供选择的建议 任何可能从事过相同或相似项目的人都可以帮助我
  • 以编程方式将 boxBackgroundMode 设置为 TextInputLayout

    我刚刚迁移自com android support 设计 to com google android material implementation androidx appcompat appcompat 1 1 0 implementa
  • 设计时的 Windows 应用商店应用 ResourceLoader

    我已经开始为 Windows 8 1 创建 Windows 应用商店应用程序 现在遇到了有关本地化的问题 我想在设计时显示 resw 文件中的字符串资源 但每次尝试都失败了 即使它在运行时有效 使用 x Uid 属性时 我仍然必须提供 Te
  • 动态创建 jCheckBox 并添加到 jScrollPane

    编辑 使用下面提供的解决方案 我更改了代码以在 JScrollPane 中包含 JPanel 使用 JButton 我将 JCheckBox 添加到 JScrollPane 内的 JPanel 这是一个已解决的问题 因为 JScrollPa