【问题标题】:Issue with resolving components - scope解决组件的问题 - 范围
【发布时间】:2013-05-12 16:25:36
【问题描述】:
private void initialize() {
    frame = new JFrame();
    frame.setBounds(100, 100, 450, 300);
    frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
    frame.getContentPane().setLayout(null);

    JPanel panel = new JPanel();
    panel.setBounds(0, 0, 434, 261);
    frame.getContentPane().add(panel);
    panel.setLayout(null);

    JCheckBox chckbxCheckbox = new JCheckBox("checkbox");
    chckbxCheckbox.setBounds(44, 41, 97, 23);
    panel.add(chckbxCheckbox);

    JCheckBox chckbxCheckbox_1 = new JCheckBox("checkbox 2");
    chckbxCheckbox_1.setBounds(197, 41, 97, 23);
    panel.add(chckbxCheckbox_1);
}

基本上,我希望chckbxCheckbox 改变chckbxCheckbox_1 的状态。修改后的代码部分如下:

JCheckBox chckbxCheckbox = new JCheckBox("checkbox");
    chckbxCheckbox.addActionListener(new ActionListener() {
        public void actionPerformed(ActionEvent arg0) {
            chckbxCheckbox_1.setEnabled(false);
        }
    });
    chckbxCheckbox.setBounds(44, 41, 97, 23);

    panel.add(chckbxCheckbox);

    JCheckBox chckbxCheckbox_1 = new JCheckBox("checkbox 2");
    chckbxCheckbox_1.setBounds(197, 41, 97, 23);
    panel.add(chckbxCheckbox_1);

我得到以下信息:

Exception in thread "AWT-EventQueue-0" java.lang.Error: Unresolved compilation problem: 
chckbxCheckbox_1 cannot be resolved

问题变成了,我如何使用在代码中显示较低的组件?同样,这只是一个示例代码。我正在处理的代码有更多的组件相互交互,这些交互方式最终会阻止我移动代码以避免这个问题。

【问题讨论】:

  • chckbxCheckbox_1.setBounds(197, 41, 97, 23); Java GUI 可能必须在多个平台、不同的屏幕分辨率和使用不同的 PLAF 上工作。因此,它们不利于组件的精确放置。对于强大的 GUI,请改用布局管理器或它们的组合,以及布局填充和空白边框来组织组件。
  • 删除 JCheckBox chckbxCheckbox_1 = new JCheckBox("checkbox 2");从初始化块和 make 是实例变量,然后尝试在更改后的块中使用此实例变量。不要在更改块后创建新复选框。
  • 谢谢您,您的帮助非常宝贵。

标签: java swing user-interface scope absolutelayout


【解决方案1】:

您正在隐藏 chckbxCheckbox_1 变量。您需要在类中声明它,而不是在方法或构造函数中。

所以,而不是,

private void initialize() {
    frame = new JFrame();
    frame.setBounds(100, 100, 450, 300);
    frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
    frame.getContentPane().setLayout(null);

    JPanel panel = new JPanel();
    panel.setBounds(0, 0, 434, 261);
    frame.getContentPane().add(panel);
    panel.setLayout(null);

    JCheckBox chckbxCheckbox = new JCheckBox("checkbox");
    chckbxCheckbox.setBounds(44, 41, 97, 23);
    panel.add(chckbxCheckbox);

    JCheckBox chckbxCheckbox_1 = new JCheckBox("checkbox 2");
    chckbxCheckbox_1.setBounds(197, 41, 97, 23);
    panel.add(chckbxCheckbox_1);
}

做:

public MyClass {
    // declared in class
    private JCheckBox chckbxCheckbox_1;

    private void initialize() {
        frame = new JFrame();
        frame.setBounds(100, 100, 450, 300);
        frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        frame.getContentPane().setLayout(null);

        JPanel panel = new JPanel();
        panel.setBounds(0, 0, 434, 261);
        frame.getContentPane().add(panel);
        panel.setLayout(null);

        JCheckBox chckbxCheckbox = new JCheckBox("checkbox");
        chckbxCheckbox.setBounds(44, 41, 97, 23);
        panel.add(chckbxCheckbox);

        // declare this variable in the class
        chckbxCheckbox_1 = new JCheckBox("checkbox 2");
        chckbxCheckbox_1.setBounds(197, 41, 97, 23);
        panel.add(chckbxCheckbox_1);
    }

接下来,您需要继续阅读并学习使用 Swing 布局管理器。

【讨论】:

  • 谢谢你,一如既往,Stack Overflow 弥补了我在这件事上的无知(或许是我对编码的无知)。我会更多地研究 Swing 布局,并超越我对绝对的偏好。这不是我第一次被告知。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2016-12-04
  • 1970-01-01
  • 1970-01-01
  • 2014-11-11
  • 1970-01-01
  • 1970-01-01
  • 2022-11-26
相关资源
最近更新 更多