【问题标题】:JPanel.add does not work when called from Listener从 Listener 调用时 JPanel.add 不起作用
【发布时间】:2015-05-19 14:00:34
【问题描述】:

我正在尝试在单击对象时添加到我的 leftPanel。该对象在打印出预定义的刺痛时确实会听到点击。它不会抛出错误或异常。

public void AddToEventList(Event event) {

    JPanel panel = new JPanel();
    panel.setBorder(new LineBorder(Color.BLACK));
    JLabel act = new JLabel(event.getAct());
    JLabel session = new JLabel("Session: " + event.getSession());
    JLabel venue = new JLabel("Venue: " + event.getVenue());

    panel.setLayout(new BoxLayout(panel, BoxLayout.Y_AXIS));
    panel.setPreferredSize(new Dimension(260,50));
    panel.add(act);
    panel.add(session);
    panel.add(venue);

    panel.addMouseListener(new MouseAdapter() {
         @Override
         public void mousePressed(MouseEvent e) {
             AddToPlan(event);
             System.out.println(event.getAct()+";"+event.getSession()+";"+event.getVenue());
         }
      });

    rightPanel.add(panel,"West");
}

这是为添加面板而调用的函数。事件虽然我正在创建一个新的 JPanel,但它并未将其添加到左侧面板。

public void AddToPlan( Event event) {

    JPanel panelL = new JPanel();
    panelL.setBorder(new LineBorder(Color.BLACK));
    JLabel act = new JLabel(event.getAct());
    JLabel session = new JLabel("Session: " + event.getSession());
    JLabel venue = new JLabel("Venue: " + event.getVenue());

    panelL.setLayout(new BoxLayout(panelL, BoxLayout.Y_AXIS));
    panelL.setPreferredSize(new Dimension(260,50));
    panelL.add(act);
    panelL.add(session);
    panelL.add(venue);

    leftPanel.add(panelL,"West");
}

    rightPanel.add(panel,"West");
} 

【问题讨论】:

  • 您正在尝试将面板添加到另一个面板 (leftPanel) 中,而该面板已存在于 rightPanel 中。我不确定我会期望做什么,但这听起来不是一个好主意。
  • @JonSkeet 对我来说听起来不错。操作,简单的破解方法:尝试删除最后一行,如果它不起作用,这不是问题。
  • 1) 为了尽快获得更好的帮助,请发布MCVE(最小完整可验证示例)或SSCCE(简短、自包含、正确示例)。 2) 请学习常见的 Java 命名法(命名约定 - 例如EachWordUpperCaseClassfirstWordLowerCaseMethod()firstWordLowerCaseAttribute,除非它是 UPPER_CASE_CONSTANT)并始终如一地使用它。 3)见Should I avoid the use of set(Preferred|Maximum|Minimum)Size methods in Java Swing?(是的。)..
  • .. 4) 当任务定义了常量时,不要使用“幻数”。常量将受益于编译时检查,并且通常更具人类可读性。
  • 我猜想打电话给revalidaterepaint 可能是合适的

标签: java swing jpanel layout-manager


【解决方案1】:

@Jhonskeet 和 @MadProgrammer 给出的答案

添加同一对象的多个实例会导致冲突。添加到 JPanel 后应始终使用 revalidate 和 repaint。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2013-10-17
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多