当前位置: 首页 > 知识库问答 >
问题:

Java:运行后将面板添加到现有面板

邹麻雀
2023-03-14

我试图通过点击JButton将一张新卡添加到现有的JPanel(cardLayout)中,然后转到该新卡,但由于新卡未注册,我得到了空异常。

我试着在谷歌上搜索,但找不到和示例,我试着用

.validate();
.refresh();
.repaint();

但什么都不管用,这是可能的吗?如果是的话,有人知道任何例子吗?

代码如下,jPanelSliding1。NextSlidePanel只需移动到CardLayout中选定的JPanel。此处创建的新面板由于找不到面板而导致空错误。谢谢:)

/*
* To change this template, choose Tools | Templates
* and open the template in the editor.
*/
package partnerships;

import components.ColorScheme;
import components.Utilities;
import java.awt.BorderLayout;
import java.awt.Color;
import java.awt.GridLayout;
import java.beans.PropertyChangeEvent;
import java.beans.PropertyChangeListener;
import java.beans.PropertyChangeSupport;
import javax.swing.JButton;
import javax.swing.JFrame;
import javax.swing.JPanel;

public class JSlidingPanel extends javax.swing.JPanel implements PropertyChangeListener {

    public PropertyChangeSupport pcs = new PropertyChangeSupport(this);
    private ColorScheme scheme;

    public JSlidingPanel() {
        initComponents();
        pcs.addPropertyChangeListener(this);
        scheme = new ColorScheme();
        Object[][] object = {
            {pcs, "Offered", "BT details", scheme.green()},
            {pcs, "Sold", "BT details", scheme.pink()},
            {pcs, "Other", "BT details", scheme.purple()}
        };

        jPanelSliding1.add(makePanels(object));
    }

    private void setupGUI() {
    }

    private JPanel makePanels(Object[][] objects) {
        JPanel panel = new JPanel();
        panel.setLayout(new GridLayout(0, objects.length));
        for (Object[] properties : objects) {
            panel.add(new ObjectPanel((PropertyChangeSupport) properties[0], properties[1].toString(), properties[2].toString(), (Color) properties[3]));
        }
        return panel;
    }

    private void newPanel(String str) {
        JPanel panel = new JPanel();
        panel.setLayout(new BorderLayout());
        panel.add(new JButton());
        jPanelSliding1.add(panel);

        jPanelSliding1.refresh();
        jPanelSliding1.validate();
        jPanelSliding1.repaint();

        validate();
        repaint();
        Utilities.getTopFrame().pack();
        jPanelSliding1.NextSlidPanel(10, panel);
        jPanelSliding1.refresh();
    }

    @Override
    public void propertyChange(PropertyChangeEvent evt) {
        if (this.isVisible() == true) {
//            makePanels();
            newPanel(evt.getPropertyName());
        }
    }

    public static void main(String args[]) {
        java.awt.EventQueue.invokeLater(new Runnable() {
            @Override
            public void run() {
                JFrame frame = new JFrame();
                JPanel panel = new JPanel();
                JSlidingPanel app = new JSlidingPanel();

                panel.add(app);
                frame.add(panel);
                frame.setDefaultCloseOperation(javax.swing.WindowConstants.DISPOSE_ON_CLOSE);
                frame.setVisible(true);
                frame.pack();
            }
        });
    }

    /**
     * This method is called from within the constructor to initialize the form.
     * WARNING: Do NOT modify this code. The content of this method is always
     * regenerated by the Form Editor.
     */
    @SuppressWarnings("unchecked")
    // <editor-fold defaultstate="collapsed" desc="Generated Code">                         
    private void initComponents() {

        jPanelSliding1 = new apps.JPanelSliding();

        setPreferredSize(new java.awt.Dimension(900, 600));
        setLayout(new java.awt.BorderLayout());

        jPanelSliding1.setLayout(new java.awt.CardLayout());
        add(jPanelSliding1, java.awt.BorderLayout.CENTER);
    }// </editor-fold>                       
    // Variables declaration - do not modify                    
    private apps.JPanelSliding jPanelSliding1;
    // End of variables declaration                  
}

共有3个答案

荆城
2023-03-14

找到了我的问题的答案,出于某种原因,我必须在创建面板后命名,否则就永远找不到它。谢谢你的帮助。

     JPanel panel = new JPanel();
**panel.setName("abc");**
        panel.setLayout(new BorderLayout());
严宇
2023-03-14

我不确定这是否可行,但:

我看到的是,您正在尝试“刷新/重新绘制/验证”jPanelSliding值。相反,你应该修改的是你试图点击的面板。正在执行,但主面板上可能没有执行。

那么,为什么不尝试对主目录中声明的面板进行“验证”调用呢?

你能试试看它是否管用吗?

易星纬
2023-03-14

如果你只是在处理一些事件中更改窗口的卡片,以下内容可能会有所帮助。

Oracle教程示例

 类似资料:
  • 我正在构建一个Java程序。该程序的核心在JFrame中可视化,其中包含一个JMenuBar和各种JMenuItem和JMenu。关键是我在所有框架中添加了一个centralPanel,但是如果我在centralPanel中添加了一些内容,那么只有在调整主框架的大小、缩小或放大它时,它才会显示出来!代码如下: 这是构造函数: 在这里,我添加了中央面板,在这里,在ActionListener中,我试

  • 下面是表类: 我尝试了几种方法,比如在ActionEvent上使用repaint,或者直接在table类中使用repaint.......如果我添加直接进入主jframe构造函数工作,但从操作上它就不工作了,所以我有点没有选择了,所以有人能帮我一把吗?

  • 我添加了一个名为MyEditorPanel的自定义面板,它将JPanel扩展到JTabbedPanel,并希望在每个选项卡上都有一个关闭按钮,为此,我使用了以下代码并使用了ButtonTabbedComponent.java的ButtonTabbedComponent.java 但是我想在关闭之前保存MyEditorPane中的文本,我怎么知道单击关闭按钮时哪个MyEditorPane将要关闭 当

  • 我有网格面板。我想将树面板添加到该网格面板中的列中。 网格面板 树商店 例如,如果我想把这个树存储在下,也就是说,当我们点击Lisa时,树会扩展。我们怎么能做到呢。 谢谢你。

  • 问题内容: 我有3个JPanels,我想将它们全部放在一个JPanel中。我将GridBagLayout用于主面板。但是只添加了一个面板。为什么会这样呢? 定制程序方法是将项目添加到这些面板中的方法。 问题答案: 我不确定,但是我认为您需要在GridBagLayout中添加一个GridBagConstraints。尝试查看此站点,以获取有关如何使用GridBagLayout的想法: 链接 或者也许

  • 我目前正在尝试对我的实现一个操作侦听器,以便在选择它时,它将打开一个供用户选择他们希望GUI使用的文件。对于初学者,我如何让控制台打印出“框单击!”当用户选中该框时? 它已经有一段时间,因为我已经在摇摆编程,所以任何建议都有帮助!