在JPanel中动态添加JLabel(重新验证没有工作)

时间:2016-05-02 16:47:25

标签: java swing jpanel jlabel

我有一个方法试图在PackingByVolDialog类的JPanel中动态添加标签:

public static void addContent( String content, String container) {

        contentPanel = new JPanel();
        changingLabel = new JLabel(); 
        changingLabel.setText(container+"\n"+content);
        contentPanel.add(changingLabel);
        contentPanel.revalidate();
        contentPanel.repaint();
        dialog.add(contentPanel);
    }

在另一个班级中,我按如下方式调用addContent方法:

for (int u=0; u<containers.size()-1; u++) {

          PackingByVolDialog.addContent(content, container);

                 } //end for

这是我被要求制作的MCVE(?)(我希望它是正确和有用的)

public class VolDialog extends JDialog {

    private static JLabel label = new JLabel() ;
    private static JPanel contentPanel = new JPanel();
    private static VolDialog dialog = new VolDialog(); 


  public static void main(String[] args) {
        try {
             dialog.setDefaultCloseOperation(JDialog.DISPOSE_ON_CLOSE);
             dialog.add(contentPanel);
             dialog.revalidate();
             dialog.repaint();
            dialog.setVisible(true);
    } catch (Exception e) {
        e.printStackTrace();
    }
}


 public static void addContent( String text) {

    contentPanel = new JPanel();
    changingLabel = new JLabel(); 
    changingLabel.setText(text);
    contentPanel.add(changingLabel);
    }


 public class content {

       for (int u=0; u<N; u++) {

               VolDialog.addContent("text");

             } //end for
          }

即使使用JPanel的repaintrevalidate,也只会在窗口中显示最后一个输出。

有谁知道问题出在哪里?

1 个答案:

答案 0 :(得分:0)

  

我正在做的项目太大而复杂

这就是为什么你总是需要在提问时创建和发布MCVE。我们没有时间查看和了解您的整个项目。您可以自行了解所询问的问题,然后简化代码以复制问题。很多时候,当你这样做时,你会发现你的问题。如果没有,那么你可以发布一段简单的代码。

  

这不是一件容易的事。

一旦你做了几次,就像生活中的任何事情一样,它变得更容易,更容易。

  

我很急,因为我没有时间编写新代码

那么你仍然应该生成结构良好且设计良好的代码。使用正常的Swing编码约定不再需要时间来创建MVCE。

例如:

  1. 您不应该扩展JDialog。您所做的只是向对话框添加组件,因此在main()方法中您只需创建对话框。

  2. 您不应该使用静态变量和方法。这表明代码设计不佳。

  3. 班级名称应以大写字母

  4. 开头
  5. 您的代码无法编译。

  6. 您永远不会创建“content”类的新实例,因此永远不会调用addContent(...)方法。所以这意味着你甚至都没有测试过你发布的代码。

  7. 当您提出问题时,您需要花时间正确地做事并向我们提供解决问题所需的信息。

      

    只有最后一个输出显示在窗口中。

    Swing框架和对话框的默认布局管理器是BorderLayout。您只能将单个组件添加到BorderLayout的“CENTER”(当您未指定约束时,这是默认设置)。

    所以基本上你需要更改对话框的布局管理器。尝试更改:

    dialog.setDefaultCloseOperation(JDialog.DISPOSE_ON_CLOSE);
    dialog.setLayout( new FlowLayout() );
    

    看到差异。

    如果您需要更多帮助,请发布适当的MCVE。一个实际编译并且设计得很好的。