簡體   English   中英

添加時不顯示 JButton

[英]JButtons not appearing when added

Jbutton 不會顯示在屏幕上,如果我嘗試從主框架添加,我會收到 null 指針異常。

我已經按照其他示例和問題的步驟進行操作,但似乎沒有顯示 JButton,我嘗試使用 Display.getFrame().add(buttons.得到(身份證)); 但這只是出於某種原因給了我一個空指針異常

這是我的顯示器 class

https://pastebin.com/Bq0VVL9v我認為這可能是我無法正確添加按鈕的原因 v

private void createDisplay() {

    frame = new JFrame(title);

    frame.setSize(width, height);

    frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);

    frame.setResizable(false);

    frame.setLocationRelativeTo(null);

    frame.setVisible(true);

    canvas = new Canvas();

    canvas.setPreferredSize(new Dimension(width, height));

    canvas.setMaximumSize(new Dimension(width, height));

    canvas.setMinimumSize(new Dimension(width, height));

    canvas.setFocusable(false);
    
    frame.add(canvas);
    frame.pack();
}

這是我正在嘗試添加按鈕的 class,按鈕管理器由我的一個菜單類調用

https://pastebin.com/bUMvnmFf

public ButtonManager(Icon image,Icon image2, int positionX, int positionY,int width, int height, int id, String name) {

    buttons.add(id, new JButton(name, image));

    buttons.get(id).setRolloverIcon(image2);

    buttons.get(id).setLocation(positionX, positionY);

    buttons.get(id).setSize(width, height);

    System.out.println(buttons.get(0));

    add(buttons.get(id));
}

我原以為 Jbutton 會顯示在屏幕上,但這並沒有發生,如果我 add() 到顯示 class 中的主要 JFrame 中,最煩人的就是空指針。

編輯:另一個主要問題是 canvas 被呈現在按鈕上,所以不會出現

ButtonManager 從不初始化Display ,所以: display.getFrame().add(buttons.get(id)); 將 NPE 作為顯示是 null。

看來 ButtonManager 不需要對 Display 的引用。

在另一個層面上,將按鈕添加到框架與 Canvas object 沖突。

我編寫了這個主要方法,它同時顯示了 canvas 和按鈕:

  public static void main(String[] args) {
    Display display = new Display("title", 200, 200);

    ButtonManager buttonManager = new ButtonManager(... , 0, 0, 100, 100, 0, "name");

    display.getFrame().getContentPane().add(buttonManager, BorderLayout.SOUTH);
    display.getFrame().pack();
  }

並將 Canvas 添加代碼修改為(注意最后兩行):

    canvas = new Canvas();
    canvas.setPreferredSize(new Dimension(width, height));
    canvas.setMaximumSize(new Dimension(width, height));
    canvas.setMinimumSize(new Dimension(width, height));
    canvas.setFocusable(false);

    frame.getContentPane().setLayout(new BorderLayout());
    frame.getContentPane().add(canvas, BorderLayout.NORTH);

在作為主框架的 class Display中,您似乎沒有添加面板實例,即ButtonManager class。 還是在此處未包含的另一個單獨的 class 中完成?

這是為您提供的解決方案。 我只編寫了示例的基礎知識,您可以根據需要繼續使用該程序。

/* Button Manager Class */
package mainpackage.display;    

import java.util.ArrayList;    

import javax.swing.JButton;
import javax.swing.JPanel;    

public class ButtonManager extends JPanel {
    private static final long serialVersionUID = 1L;    

    public ArrayList<JButton> buttons = new ArrayList<JButton>();
    Display display;    

    public static JButton getJButton(String name) {
        //Put all your stuff of images and ids here
        JButton aButton = new JButton(name);
        return aButton;
    }    

    public static void putButton(JPanel panel, JButton button, int posX, int posY) {
        button.setLocation(posX, posY);
        panel.add(button);
    }    

    public void remove(int id) {
        buttons.remove(id);
        display.getFrame().remove(buttons.get(id));
    }    

    public void tick() {    

    }    

    public void render() {    

    }    

}

顯示 class:

package mainpackage.display;
import java.awt.Canvas;    

import java.awt.Component;
import java.awt.Dimension;    

import javax.swing.JButton;
import javax.swing.JFrame;
import javax.swing.JPanel;    

import static mainpackage.display.ButtonManager.*;

public class Display {

    private JFrame frame;
    private Canvas canvas;

    private String title;
    private int width, height;

    public Display(String title, int width, int height) {
        this.title = title;
        this.width = width;
        this.height = height;
        createDisplay();
    }

    private void createDisplay() {
        frame = new JFrame(title);
        frame.setSize(width, height);
        frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        frame.setResizable(false);
        frame.setLocationRelativeTo(null);
        frame.setVisible(true);
        canvas = new Canvas();

        canvas.setPreferredSize(new Dimension(width, height));
        canvas.setMaximumSize(new Dimension(width, height));
        canvas.setMinimumSize(new Dimension(width, height));
        canvas.setFocusable(false);
        frame.add(canvas);

        JPanel panel = new JPanel();
        //You can add many buttons as you need
        putButton(panel, getJButton("Button 1"), 100, 200);
        putButton(panel, getJButton("Button 2"), 800, 800);

        frame.setContentPane(panel);

        frame.pack();
    }

    public void postCreate(Component a) {
        frame.add(a);
    }
    public void postCreate(JButton j) {
        frame.add(j);
    }
    public Canvas getCanvas() {
        return canvas;
    }
    public JFrame getFrame() {
        return frame;
    }

    public static void main(String[] args) {
        Display display = new Display("Hello", 1000, 1000);
    }
}

Output:

在此處輸入圖像描述

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM