簡體   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