Java按钮单击后消失



我正在尝试在另一个按钮中使用joptionpane添加一个按钮,但是在我单击原始按钮后,我一直在消失。

我尝试手动添加jpanel,而不是通过通过handpanel.buttons迭代而不是使用" handpanelnpc.gethandpanel((",但它无法使用。我已经检查了阵列列表的大小,并且已经正确插入了。

layouttesting.java

public class LayoutTesting extends JFrame{
    HandPanel handPanelNPC = new HandPanel();
    public LayoutTesting(HandPanel handPanel, int type){
        Container pane = getContentPane();
        if (type==1){
            handPanelNPC = handPanel;
        }
        pane.setLayout(new BorderLayout());
        pane.add(handPanelNPC.getHandPanel(), BorderLayout.NORTH);
        validate();
        repaint();
    }
    public LayoutTesting(){
        Container pane = getContentPane();
        pane.setLayout(new BorderLayout());
        pane.add(handPanelNPC.getHandPanel(), BorderLayout.NORTH);
    }
}

handpanel.java

public class HandPanel implements ActionListener{   
    JFrame frame = null;
    JPanel panel = new JPanel();
    ArrayList<JButton> buttons = new ArrayList<JButton>();
    public HandPanel(){
        addNewButton();
        panel.setLayout(new FlowLayout());
        panel.add(buttons.get(0));
    }
    public JComponent getHandPanel(){
        panel = new JPanel();
        for(int i=0; i<buttons.size(); i++){
            JButton button = buttons.get(i);
            panel.add(button);
        }
        return panel;
    }
    public void addNewButton(){
        JButton button = new JButton();
        button.setPreferredSize(new Dimension(40,58));
        button.addActionListener(this);
        buttons.add(button);
    }
    public void actionPerformed(ActionEvent e) {
      String[] options = {"Summon", "Set", "Add Card"}; 
      int messageType = JOptionPane.QUESTION_MESSAGE;
      int code = JOptionPane.showOptionDialog(
        frame, 
        "What would you like to do?", 
        "Card Name", 
        0, messageType, null, 
        options, options[1]);
      if (code==2){
        addNewButton();
        LayoutTesting frame = new LayoutTesting(this, 1);
      } 
    }
}

main.java

public class Main extends JFrame{
    public static void main(String[] args){
         LayoutTesting frame = new LayoutTesting();
         frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
         frame.setSize(400, 300);
         frame.setVisible(true);
     }
}

您在代码中发生了太多奇怪的事情,以给出一个简单的答案。

尝试通过在handpanel.java中查看此行来调试自己的代码:

LayoutTesting frame = new LayoutTesting(this, 1);

它真正做什么?现在删除该行,该按钮不会消失。现在尝试确定该线路在做什么,以及为什么按钮消失了。

还'panel.add(buttons.get(0((;'什么都不做,因为拨打该调用时,数组中永远不会有按钮(以后在另一种方法中添加按钮(。

这是一个粗糙的工作演示,可让您添加与第一帧一样多的新卡,并且每张卡都有一个按钮,可以让您召唤一张新卡。

public class LayoutTesting extends JFrame{
    Container pane;
    //Add card when button is pressed:
    public void addCard(){
        Container card = new JPanel();
        card.setBackground(Color.red);
        JButton newButton = addNewButton();
        newButton.setBackground(Color.red);
        card.add(newButton);
        pane.add(card);
        revalidate();
        repaint();
    }
    //Setup window and add button:
    public LayoutTesting(){
        setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        setSize(400, 300);
        setVisible(true);
        setLayout(new FlowLayout());
        pane = new JPanel();
        pane.setLayout(new GridBagLayout());
        JButton firstButton = addNewButton();
        firstButton.setBackground(Color.green);
        add(pane);
        add(firstButton);   
    }
    //Create button and action listener:
    public JButton addNewButton(){
        JButton button = new JButton();
        button.setPreferredSize(new Dimension(40, 58));
        button.addActionListener(new java.awt.event.ActionListener(){
        @Override
        public void actionPerformed(java.awt.event.ActionEvent evt){
            buttonAction(evt);
        }
        });
        return button;
    }
    //Action fer each button:
    public void buttonAction(ActionEvent e) {
        String[] options = {"Summon", "Set", "Add Card"};
        int messageType = JOptionPane.QUESTION_MESSAGE;
        int code = JOptionPane.showOptionDialog(
        this, 
        "What would you like to do?", 
        "Card Name", 
        0, messageType, null, 
        options, options[1]);
        if (code==2){
        addCard();
        }
    }
}

最新更新