Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/319.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 如何查找匿名jtextfield的文本_Java_Swing_Actionlistener - Fatal编程技术网

Java 如何查找匿名jtextfield的文本

Java 如何查找匿名jtextfield的文本,java,swing,actionlistener,Java,Swing,Actionlistener,因此,我正在制作一个带有gui的商店系统。我有一个菜单项,当我按下它时,会打开另一个jframe来输入jtextfield中出售的每个项目的编号,如下所示: public void actionPerformed(ActionEvent e) { JPanel panel = (JPanel)((JButton) e.getSource()).getParent().getParent(); Component[] componen

因此,我正在制作一个带有gui的商店系统。我有一个菜单项,当我按下它时,会打开另一个jframe来输入jtextfield中出售的每个项目的编号,如下所示:

        public void actionPerformed(ActionEvent e) {
            JPanel panel = (JPanel)((JButton) e.getSource()).getParent().getParent();
            Component[] components = panel.getComponents();
            for (Component c : components) {
                if (c instanceof ProductPanel) {
                    ((ProductPanel)c).setNewQty();
                }
            }
        }
    });
JPanel-salesPanel=newjpanel();
设置尺寸(新尺寸(520270));
可设置大小(假);
设定位置(200200);
标题=新的JLabel(“填写售出的产品数量”);
salesPanel.setSize(新尺寸(230,30*sw.getProductList().size());
setLayout(新的GridLayout(sw.getProductList().size()+1,3));
...
sw.getProductList().forEach(n->{
添加(新的JLabel(Integer.toString(n.getProductID())+“:”));
添加(新的JLabel(Integer.toString(n.getQuantity()));
添加(新的JLabel(n.getName());
添加(新的JTextField());
});
这就是它的样子

请注意,
sw
是主类的对象,该类具有包含每个产品信息的product类型的
ArrayList

有没有办法从这些
JTextField
s中发送文本?如果不是的话,我还有什么办法可以做到这一点

编辑: 在主ShopWindow类中,我有一个ArrayList

private ArrayList<Product> productList = new ArrayList<Product>();
这是一个模拟解决方案(仅用于显示如何使用操作侦听器更新数量标签和清除字段)

此模拟解决方案的要点:

  • 使用
    JPanel
    封装产品线项目。这将使您在需要删除和/或添加产品行时更加容易
  • 产品面板包含更新数量或清除框架按钮(取决于单击哪个按钮)将调用的字段的方法
  • 设计简单-为产品创建一个通用面板,消除重复代码
  • 显然,您必须对此进行修改,以便使用适当的布局管理器或使用绝对定位来根据自己的喜好正确对齐零部件。此外,您还需要为表头创建一个面板,并添加剩余的产品。此外,您可能希望将其划分为公共类,甚至可能为您的框架创建一个单独的类

    动作监听器还可以有一个“for each”循环来更新每个
    ProductPanel
    ,而不是单独对每个面板进行硬编码。应该是这样的:

            public void actionPerformed(ActionEvent e) {
                JPanel panel = (JPanel)((JButton) e.getSource()).getParent().getParent();
                Component[] components = panel.getComponents();
                for (Component c : components) {
                    if (c instanceof ProductPanel) {
                        ((ProductPanel)c).setNewQty();
                    }
                }
            }
        });
    
    显然,您的解决方案将取决于您决定如何将组件封装在容器中。对于此模拟,产品面板位于框架面板内,框架面板包含放置按钮的面板。因此,我需要为update和cancel按钮获取“祖父母”容器,以利用调用适当的方法以更动态的方式进行更新和清除

    最后,您可能想做一些更优雅的事情来创建产品面板。例如,您可能希望添加一些工厂方法来创建产品面板,而不是像我的模拟解决方案那样使用硬编码的产品面板。不管怎样,我想我展示了你想要的解决方案


    更新:如果您不遵循Andrew Thompson不使用文本字段作为数值的建议,面板的
    GetNewQuantity
    方法将需要验证获取的文本,以确保其包含有效的数值(这是他的观点)。我强烈建议你听从他的建议。

    为什么不简单地创建一个包含适当字段和getter的类,包括JTextField字段和getter来获取文本?你似乎把事情复杂化了。另外,子窗口应该是一个JDialog,而不是一个JFrame,模态对话框,如果需要的话……好吧,我把它改成了JDialog,但是有什么区别呢?另外,我可以创建一个包含jtextfield的类,并将其添加到面板?,在获取文本时如何识别它们?抱歉,这是我的第一个大型java swing程序。1)不要使用文本字段作为数字!相反,将
    SpinnerNumberModel
    实例声明为类的属性(可能作为数组或数组列表),并在微调器中显示这些数字模型(a
    JSpinner
    )。这使得用户很容易,代码也很容易,因为不需要进行“数字验证”。查找数字时,只需调用
    numberModel.getNumber().getInteger()
    。2) 为了更快地获得更好的帮助,请添加或。从两个项目开始。如果你能为2解决这个问题,剩下的应该很简单。3)请看(是的)(以防万一……)4)Java GUI必须在不同的操作系统、屏幕大小、屏幕分辨率等上工作,在不同的地区使用不同的PLAF。因此,它们不利于像素完美布局。请改用布局管理器,或与布局填充和边框一起使用。@hfontanez我的声誉不足15,无法提升对不起……您还应该遵循Andrew Thompson的建议,不要对数字字段使用
    JTextField
            public void actionPerformed(ActionEvent e) {
                JPanel panel = (JPanel)((JButton) e.getSource()).getParent().getParent();
                Component[] components = panel.getComponents();
                for (Component c : components) {
                    if (c instanceof ProductPanel) {
                        ((ProductPanel)c).setNewQty();
                    }
                }
            }
        });