【问题标题】:Adding a new JLabel through method called from a different class通过从不同类调用的方法添加新的 JLabel
【发布时间】:2019-02-26 01:23:40
【问题描述】:

我正在尝试通过在另一个类中调用的方法将新的 JLabel 添加到 JPanel。

第 1 类:

public class AppFrame extends JFrame {
// CardGame
//Making private objects to access?\
private MainPanel mainPanel = new MainPanel();

public AppFrame() {
    super("BlackJack Cardgame");
    setBounds(100, 100, 640, 640);
    setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
    setLayout(new BorderLayout());
    add(new StatusBar(), BorderLayout.SOUTH);
    add(new MainPanel(), BorderLayout.CENTER);
    add(new StatusBar(), BorderLayout.NORTH);
    setVisible(true);
    //Does not correctly add label
    mainPanel.testMethod();
}
public MainPanel getMainPanel() {
    return mainPanel;
}

第 2 类:

public class MainPanel extends JPanel {
Border blackBorder = BorderFactory.createLineBorder(Color.BLACK);
GridBagConstraints gbc = new GridBagConstraints();  

public void testMethod() {
    System.out.println("test method");
    this.add(new JLabel("test"));
}

public MainPanel() {
    setLayout(new GridBagLayout());
    ImageIcon icon = new ImageIcon(getClass().getResource("/images/ACE_CLUBS.jpg"));
    gbc.gridx = 0;
    gbc.gridy = 0;
    add(new JLabel(icon),gbc);
    ImageIcon icon2 = new ImageIcon(getClass().getResource("/images/TWO_CLUBS.jpg"));
    gbc.gridx = 1;
    gbc.gridy = 0;
    add(new JLabel(icon2),gbc);
    gbc.gridx=0;
    gbc.gridy=1;
    //correctly  adds label.
    testMethod();

}

如果从第 2 类(我想从中添加内容的框架)调用该方法,它将按预期工作。但是,如果我尝试从类 1 调用该方法,它将不会添加标签。 我确信该方法在 sysout 发生时被调用。我对添加东西的理解不正确吗?

【问题讨论】:

    标签: java swing awt jlabel


    【解决方案1】:

    在第一种情况下,您将标签添加到面板,然后将面板添加到框架,然后使框架可见。当框架可见时,布局管理器被调用,框架上的所有组件都根据布局管理器的规则指定大小和位置。

    但是,在第二种情况下,您尝试将标签添加到可见的 GUI。

    setVisible(true);
    //Does not correctly add label
    mainPanel.testMethod();
    

    您永远不会调用布局管理器,因此组件的大小为 (0, 0),因此没有可绘制的内容。

    每当您从可见 GUI 添加(或删除)组件时,基本逻辑将是:

    panel.add(...);
    panel.revalidate(); // invokes the layout manager.
    panel.repaint();
    

    所以在 testMethod() 中你都需要添加 revalidate() 和 repaint()。

    。我确定在 sysout 发生时正在调用该方法

    另一个问题是您的 getMainPanel() 方法不起作用,因为您有两个对 MainPanel 类的引用:

    private MainPanel mainPanel = new MainPanel(); // this is just sitting in memory
    
    public AppFrame() {
        ...
        add(new MainPanel(), BorderLayout.CENTER); // this is added to the frame.
    

    因此,您正在一个面板上调用 testMethod() 方法,该面板只是位于内存中并且尚未添加到框架中。

    摆脱你的类的第二个实例。你应该做的是:

    private MainPanel mainPanel = new MainPanel();
    
    public AppFrame() {
        ...
        add(mainPanel, BorderLayout.CENTER);
    

    它将按预期工作。

    我觉得这很令人惊讶,因为您的面板使用的是 GridBagLayout,但您在添加标签时从未指定 GridBagConstraint

    【讨论】:

      猜你喜欢
      • 2016-10-22
      • 1970-01-01
      • 1970-01-01
      • 2021-02-26
      • 2013-02-24
      • 1970-01-01
      • 1970-01-01
      • 2013-05-05
      • 2013-02-17
      相关资源
      最近更新 更多