繁体   English   中英

无法将旧的JPane更新为Panel

[英]Can't update the old JPane to Panel

我的小型应用程序的主要目的是通过按键盘上的“ Enter”按钮来更新唯一一帧中的面板。

这些是类: Main-启动应用程序; MainFrame-是带有更新方法的Frame; PanelWithNoThreads-是Panel的类,它是在Frame初始化时创建的; PanelWithNoFramesContr-控制与PanelWithNoThreads一起发生的一切。 PanelWithThreadPanelWithThreadContr-是屏幕,它是控制器,与先前的操作完全相同。

我将把代码放在这篇文章的结尾。

因此,问题是...

  1. 当我们启动应用程序时,一切正常,然后出现PanelWithNoThreads
  2. 我按ENTER键,然后我的相框向我显示白屏...

那么,如何解决这个问题。

主班

    public class Main {
        static MainFrame mainFrame;
        /**
         * @param args the command line arguments
         */
        public static void main(String[] args) {
            // TODO code application logic here
            mainFrame = new MainFrame();
        }  
    }

class MainFrame:
public class MainFrame extends JFrame implements KeyListener{

    JPanel theMainPanel = new JPanel();
    PanelWithThreadContr pwntContr;
    static String idOfPanel = "empty_panel";


    public MainFrame(){
        setSize(800,600);
        setExtendedState(MAXIMIZED_BOTH);
        setDefaultCloseOperation(EXIT_ON_CLOSE);
        setVisible(true);
        theMainPanel.setBackground(Color.BLACK);
        theMainPanel.setForeground(Color.WHITE);
        add(theMainPanel);
        System.out.println("LOG/MainFrame : added the empty Panel");
        //default change to the Panel with no Threads
        PanelWithNoFramesContr ntpc = new PanelWithNoFramesContr();
        changeThePane(ntpc.pwnt, ntpc.getId(), ntpc);
    }

    private void changeThePane(JPanel inputPanel, String id, KeyListener keyListener){
        SwingUtilities.invokeLater(new Runnable() {

            @Override
            public void run() {
                remove(theMainPanel);

                theMainPanel = inputPanel;
                add(theMainPanel);
                addKeyListener(keyListener);
                repaint();
                theMainPanel.validate();
                theMainPanel.repaint();
                theMainPanel.setVisible(true);
            }
        });


    }

    public void implementThePane(String id){
        if(id.contains("one_thread")){
            pwntContr = new PanelWithThreadContr();
            changeThePane(pwntContr.pwt, pwntContr.id, pwntContr);
        }
    }

    @Override
    public void keyTyped(KeyEvent e) {
    }

    @Override
    public void keyPressed(KeyEvent e) {
    }

    @Override
    public void keyReleased(KeyEvent e) {
    }
}

PanelWithNoThreads类:

public class PanelWithNoThreads extends javax.swing.JPanel {

    /**
     * Creates new form PanelWithNoThreads
     */
    public PanelWithNoThreads() {
        initComponents();
    }

    /**
     * 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() {

        HelloLabel = new javax.swing.JLabel();

        HelloLabel.setFont(new java.awt.Font("Osaka", 0, 48)); // NOI18N
        HelloLabel.setText("Hello!!!");

        javax.swing.GroupLayout layout = new javax.swing.GroupLayout(this);
        this.setLayout(layout);
        layout.setHorizontalGroup(
            layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
            .addGroup(layout.createSequentialGroup()
                .addContainerGap()
                .addComponent(HelloLabel, javax.swing.GroupLayout.DEFAULT_SIZE, 532, Short.MAX_VALUE)
                .addContainerGap())
        );
        layout.setVerticalGroup(
            layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
            .addGroup(layout.createSequentialGroup()
                .addGap(158, 158, 158)
                .addComponent(HelloLabel)
                .addContainerGap(164, Short.MAX_VALUE))
        );
    }// </editor-fold>                        


    // Variables declaration - do not modify                     
    private javax.swing.JLabel HelloLabel;
    // End of variables declaration                   
    public void setColorsToHelloLabel(Color backColor, Color foreColor){
        HelloLabel.setBackground(backColor);
        HelloLabel.setForeground(foreColor);
    }
}

PanelWithNoThreadsContr类:

public class PanelWithNoThreadsContr extends Controller implements KeyListener{

    PanelWithNoThreads pwnt = new PanelWithNoThreads();
    private String id = "no_threads";

    public PanelWithNoThreadsContr() {
        //settings
        pwnt.setBackground(Color.BLACK);
        pwnt.setForeground(Color.WHITE);
        pwnt.setColorsToHelloLabel(Color.BLACK, Color.GREEN);

    }



    @Override
    public void keyTyped(KeyEvent e) {
    }

    @Override
    public void keyPressed(KeyEvent e) {
        System.out.println("LOG/no_thread : Pressed 'ENTER'");
        if(e.getKeyCode() == KeyEvent.VK_ENTER){
            Main.mainFrame.implementThePane("one_thread");
        }
    }

    @Override
    public void keyReleased(KeyEvent e) {
    }

    /**
     * @return the id
     */
    public String getId() {
        return id;
    }

    /**
     * @param id the id to set
     */
    public void setId(String id) {
        this.id = id;
    }   
}

PanelWithThread类:

public class PanelWithThread extends javax.swing.JPanel {

    /**
     * Creates new form PanelWithThread
     */
    public PanelWithThread() {
        initComponents();
    }

    /**
     * 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() {

        threadedLabel = new javax.swing.JLabel();

        threadedLabel.setFont(new java.awt.Font("ArcadeClassic", 0, 36)); // NOI18N
        threadedLabel.setHorizontalAlignment(javax.swing.SwingConstants.CENTER);
        threadedLabel.setText("NO_TEXT");

        javax.swing.GroupLayout layout = new javax.swing.GroupLayout(this);
        this.setLayout(layout);
        layout.setHorizontalGroup(
            layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
            .addGroup(layout.createSequentialGroup()
                .addContainerGap()
                .addComponent(threadedLabel, javax.swing.GroupLayout.DEFAULT_SIZE, 376, Short.MAX_VALUE)
                .addContainerGap())
        );
        layout.setVerticalGroup(
            layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
            .addGroup(layout.createSequentialGroup()
                .addContainerGap()
                .addComponent(threadedLabel, javax.swing.GroupLayout.DEFAULT_SIZE, 276, Short.MAX_VALUE)
                .addContainerGap())
        );
    }// </editor-fold>                        


    // Variables declaration - do not modify                     
    public javax.swing.JLabel threadedLabel;
    // End of variables declaration                   
}

PanelWithThreadContr类:

public class PanelWithThreadContr extends Controller implements KeyListener{

    PanelWithThread pwt = new PanelWithThread();
    String id = "one_thread";

    public PanelWithThreadContr() {
        System.out.println("LOG/one_thread : creating");
        pwt.setBackground(Color.BLACK);
        pwt.setForeground(Color.WHITE);
        pwt.threadedLabel.setText("*****");
        pwt.threadedLabel.setForeground(Color.GREEN);
        pwt.threadedLabel.setBackground(Color.BLACK);
    }

    @Override
    public void keyTyped(KeyEvent e) {
    }

    @Override
    public void keyPressed(KeyEvent e) {
    }

    @Override
    public void keyReleased(KeyEvent e) {
        if(e.getKeyCode() == KeyEvent.VK_ENTER){

        }
    }

}

您需要在每个自定义JPanel的构造函数中调用super()。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM