【问题标题】:JButton twice setText to JLabel after JPanel revalidate()JButton 在 JPanel revalidate() 之后两次 setText 到 JLabel
【发布时间】:2013-02-11 20:20:14
【问题描述】:

当我单击按钮时,我想向面板添加一个按钮,我做到了,但我的程序不像以前那样工作。这是我之前的程序:

带有粉红色按钮的南面板是卡片布局面板。当我点击东边的灰色按钮时,卡片面板发生了变化。当我点击粉色按钮时,发生了这种情况:

一个粉色按钮 setText 到一个标签。在我向卡片面板“TOPLI NAPICI”添加一个按钮后,发生了这种情况:

如您所见,一个按钮“moka”添加到面板中,这是我想要的,但是当我单击一个按钮时,它 setText 两次,只有新按钮(在本例中为“MOKA”)setText 一次。卡片面板中的其他面板也发生了这种情况:

这是我单击按钮添加新按钮时代码的一部分

    if (enter == JOptionPane.OK_OPTION) {
    try{
    Double price1=Double.parseDouble(priceField.getText());

    String name1= productField.getText();


        Product name = new Product(name1, price1);
        Application .manu.add(name);


        if (field.getSelectedItem().equals("TOPLI  NAPICI")){

            for(Controller c:Controller) {
            c.tnp.add(new JButton(name1));//c is panel , holds all panels

         c.tn.revalidate();//c.tn is panel which is changed( adding one button), cardpanel
         c.removeAll();
         c.panels();//create all panels which is removed
             c.revalidate();


    System.out.print( c.tnp.size());//tnp is a list with buttons, shows that add one more button, that is correct

        }

喜欢它复制面板,或者当我click button 它点击了两次。可能吗?虽然我只更改了卡片布局中的一个面板(“TOPLI NAPICI”),但它在卡片布局中的所有面板中都发生了变化(“SOKOVI”和“ALKOHOL”) 怎么了?

感谢您的帮助。

【问题讨论】:

  • 您所针对的事件是什么?如果确实与您注册点击的次数有关,那么我建议使用 mouseUp 事件。
  • 我认为您的 GUI 应该完全重新设计。而不是这个会导致很多问题的 GUI,您可以:使用带有 3 个选项卡的 JTabbedPane(在 SOUTH 上设置)并在每个选项卡中设置 JTable(针对每种类型的饮料)。每个JTable 将包含文章列表。然后您可以添加一些按钮,以便您可以将文章添加到您的帐单中。此外,一个JTable 可以替换所有JLabels 和JComboBoxes。顺便说一句,如何打印报告?
  • 你是对的。当我从这个开始时,我有想法,但没有经验。我可以将表格设置为空并通过单击按钮来填充它。我的程序可以用表格而不是标签、组合框看起来一样吗?

标签: java swing jpanel duplicate-removal cardlayout


【解决方案1】:
  • 不知道什么 LayoutManager 被使用,什么都不在谈论 CardLayout,为了更好的帮助,尽快发布一个 SSCCE,简短,可运行,可编译,只是关于带有 CardLayout 的 JPanel 和一个用于此处发布的代码的 JButton,

  • 在此处发布的没有代码的图像没有帮助

  • 默认情况下,CardLayout 不需要调用 revalidate() & repaint(),所有这些通知程序默认在 API 中实现

  • 这不是正确的方法

.

c.tn.revalidate();//c.tn is panel which is changed( adding one button), cardpanel
c.removeAll();
c.panels();//create all panels which is removed
c.revalidate();
  • 将所有更改应用到已经可见的 GUI(删除、添加、修改、重新布局),然后最后两行代码应为 revalidate() & repaint(),第一行。容器在哪里进行了更改,或者如果更改了几个容器,则调用它们的 1.st 加入容器

  • 需要到Java7才能使用validate() & repaint()JFrameJDialogJWindow,在Java7中实现revalidate()Top Level Containers也是,与@987654330相同@(例如)

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2017-07-18
    • 1970-01-01
    • 1970-01-01
    • 2013-02-04
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多