有 Java 编程相关的问题?

你可以在下面搜索框中键入要查询的问题!

不显示对象的java动态JPanel

有人能看一下我的代码的这一部分并告诉我为什么它不会返回JPanel中的对象吗?它肯定进入了循环,因为我试着在循环中打印语句。此外,这个JPanel对象被放在一个选项卡窗格中只是为了澄清。如果需要更详细地解释或显示更多代码以找到解决方案,请告诉我。谢谢

JPanel createTipTailoringPanel(TipCalcModel model)
{

    JPanel content = new JPanel();
    int size = model.getNumOfPeople();
    content.removeAll();
    content.updateUI();
    content.setLayout(new GridLayout(0,4));

    JTextField text[] = new JTextField[size];
    JSlider slider[] = new JSlider[size];
    JLabel label[] = new JLabel[size];
    JLabel cash[] = new JLabel[size];


    if(size == 0)
    {
        return content;
    }
    else
    {
        for(int i=0; i<size; i++)
        {
            text[i] = new JTextField();
            slider[i] = new JSlider();
            label[i] = new JLabel("$");
            cash[i] = new JLabel();
            content.add(text[i]);
            content.add(slider[i]);
            content.add(label[i]);
            content.add(cash[i]);
        }

        return content;
    }


}

以下是我的调用方法和用于传入numberofpeople的actionlistener:

 TipCalcView(TipCalcModel model)
{
    setTitle("Tip Calculator");
    JTabbedPane tabbedPane = new JTabbedPane();
    getContentPane().add(tabbedPane);
    tabbedPane.addTab("Main Menu", createMainPanel());
    tabbedPane.setSelectedIndex(0);
    tabbedPane.addTab("Tip Tailoring", createTipTailoringPanel(model));
    tabbedPane.addTab("Config Panel", createConfigPanel());

}

class GuestsListener implements ActionListener
{
    public void actionPerformed(ActionEvent e)
    {
        int userInput = 0;
        try{
            userInput = m_view.getGuests();
            m_model.setNumOfPeople(userInput);
            m_view.createTipTailoringPanel(m_model);
        }
        catch(NumberFormatException nfex)
        {
            m_view.showError("Bad input: '" + userInput + "'");
        }
    }
}

共 (2) 个答案

  1. # 1 楼答案

    我怀疑你的问题超出了你列出的代码范围。下面是一个简化的工作示例:

    public static void main(String[] args) {
        JFrame frame = new JFrame();
        DynamicJPanel dynamic = new DynamicJPanel();
        frame.add(dynamic.createTipTailoringPanel(3));
        frame.pack();
        frame.setVisible(true);
    }
    
    JPanel createTipTailoringPanel(int size) {
        JPanel content = new JPanel();
        content.setLayout(new GridLayout(0, 4));
    
        for (int i = 0; i < size; i++) {
            content.add(new JTextField());
            content.add(new JSlider());
            content.add(new JLabel("$"));
            content.add(new JLabel());
        }
    
        return content;
    }
    
  2. # 2 楼答案

    首先,由于您不在任何地方使用阵列,因此可以将其缩短为:

    JPanel createTipTailoringPanel(TipCalcModel model)
    {
    
        JPanel content = new JPanel();
        int size = model.getNumOfPeople();
        content.setLayout(new GridLayout(0,4));
    
        if(size == 0)
        {
            return content;
        }
        else
        {
            for(int i=0; i<size; i++)
            {
                content.add(new JTextField());
                content.add(new JSlider());
                content.add(new JLabel("$"));
                content.add(new JLabel());
            }
            return content;
        }
    }
    

    第二,似乎你在面板上添加了一个空组件,也许这就是你真正得到的

    第三,add一旦从上述方法返回content面板,就需要将其添加到JFrame(或其他容器)中