如何重绘 JLabel?

How to repaint a JLabel?

我的计算器有问题,我想在 Java 中制作。 我有一个 JLabel,它应该显示在按钮输入的数字上。我的问题是每次用户按下按钮时,框架都不会重新绘制,但它会打开一个带有更新的 JLabel 文本的新 JFrame。我认为新的 JFrame 属于我的 generateCalculatorFrame() 方法中的新 JFrame,但我不知道如何正确地重新绘制我的 JFrame。我找了大约两个小时的解决方案,问了一个比我更有经验的程序员,但他也找不到解决方案。

这是我的代码:

package com.decase.taschenrechner;

public class 计算器 {

public static void main(String[] args) {

    // Erzeugt das CalculatorFrame
    CalculatorFrame.generateCalculatorFrame();

    // Legt die Funktionen der Buttons fest
    ButtonEvents.generateButtonEvents();
}

}

package com.decase.taschenrechner;

导入javax.swing.JFrame;

public class 计算器框架 {

public static JFrame generateCalculatorFrame ()
{
  JFrame calculatorFrame = new JFrame("Taschenrechner");
  // Legt die Größe des Fensters fest
  calculatorFrame.setSize(450, 600);
  // Schließt das Fenster beim Klick auf "X"
  calculatorFrame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
  // Fügt das calculatorPanel dem calculatorFrame hinzu
  calculatorFrame.add(CalculatorPanel.generateCalculatorPanel());
  // Setzt die Position des Fensters auf Null, also auf die Mitte des Bildschirms
  calculatorFrame.setLocationRelativeTo(null);
  // Setzt die Sichtbarkeit des Fensters auf sichtbar
  calculatorFrame.setVisible(true);
  return calculatorFrame;
}

}

package com.decase.taschenrechner;

进口java.awt.Color; 导入 java.awt.GridLayout;

进口javax.swing.BoxLayout; 导入 javax.swing.JPanel;

public class 计算器面板 {

public static JPanel generateCalculatorPanel ()
{
  // Erzeugt ein JPanel auf dem die anderen beiden Panel dargestellt werden
  JPanel calculatorPanel = new JPanel();
  // Legt das Layout des  JPanels fest
  calculatorPanel.setLayout(new BoxLayout(calculatorPanel, BoxLayout.PAGE_AXIS));
  // Legt die Farbe des JPanels fest
  calculatorPanel.setBackground(Color.DARK_GRAY);
  // Legt das Layout des  JPanels fest
  calculatorPanel.setLayout(new GridLayout(2, 1));
  calculatorPanel.add(CalculatorDisplay.generateCalculatorDisplay());
  calculatorPanel.add(generateButtonPanel());
  return calculatorPanel;       
}

public static JPanel generateButtonPanel ()
{
  // Erzeugt ein neues JPanel auf dem die Buttons dargestellt werden
  JPanel buttonPanel = new JPanel();
  // Legt die Farbe des JPanels fest
  buttonPanel.setBackground(Color.DARK_GRAY);
  // Legt das Layout des  JPanels fest
  buttonPanel.setLayout(new GridLayout(5, 4));
  // Fügt die einzelnen Buttons dem JPanel hinzu
  buttonPanel.add(CalculatorButtons.buttonOne);
  buttonPanel.add(CalculatorButtons.buttonTwo);
  buttonPanel.add(CalculatorButtons.buttonThree);
  buttonPanel.add(CalculatorButtons.buttonDeleteLast);
  buttonPanel.add(CalculatorButtons.buttonFour);
  buttonPanel.add(CalculatorButtons.buttonFive);
  buttonPanel.add(CalculatorButtons.buttonSix);
  buttonPanel.add(CalculatorButtons.buttonPlus);
  buttonPanel.add(CalculatorButtons.buttonSeven);
  buttonPanel.add(CalculatorButtons.buttonEight);
  buttonPanel.add(CalculatorButtons.buttonNine);
  buttonPanel.add(CalculatorButtons.buttonMinus);
  buttonPanel.add(CalculatorButtons.buttonDeleteAll);
  buttonPanel.add(CalculatorButtons.buttonComma);
  buttonPanel.add(CalculatorButtons.buttonNull);
  buttonPanel.add(CalculatorButtons.buttonMultiply);
  buttonPanel.add(CalculatorButtons.buttonBracketRight);
  buttonPanel.add(CalculatorButtons.buttonBracketLeft);
  buttonPanel.add(CalculatorButtons.buttonEqual);
  buttonPanel.add(CalculatorButtons.buttonDivide);
  return buttonPanel;
}       

}

package com.decase.taschenrechner;

进口java.awt.Color;

进口javax.swing.JLabel;

public class 计算器显示 {

public static String displayText = "";

public static JLabel generateCalculatorDisplay ()
{
    // Erstellt ein neues JLabel
    JLabel calculatorDisplay = new JLabel();
    // Legt die Größe des JLabels fest
    calculatorDisplay.setSize(50, 50);
    // Legt die Hintergrundfarbe des JLabels fest
    calculatorDisplay.setOpaque(true);
    calculatorDisplay.setBackground(Color.BLACK);
    // Legt die Schriftgröße des JLabels fest
    calculatorDisplay.setFont(calculatorDisplay.getFont().deriveFont(30f));
    // Legt die Schriftfarbe des JLabels fest
    calculatorDisplay.setForeground(Color.WHITE);
    // Legt den Text des JLabels fest
    calculatorDisplay.setText(displayText);
    // Gibt das JLabel zurück
    return calculatorDisplay;
}

}

package com.decase.taschenrechner;

进口java.awt.event.ActionEvent; 导入 java.awt.event.ActionListener;

public class 按钮事件 {

public static void generateButtonEvents() {

    // Legt die Funktionen von buttonNull fest
    CalculatorButtons.buttonNull.addActionListener(new ActionListener() {
        @Override
        public void actionPerformed(ActionEvent e) {
            CalculatorDisplay.displayText = CalculatorDisplay.displayText + "0";
            CalculatorFrame.generateCalculatorFrame().repaint();
        }
    });

    // Legt die Funktionen von buttonOne fest
    CalculatorButtons.buttonOne.addActionListener(new ActionListener() {
        @Override
        public void actionPerformed(ActionEvent e) {
            CalculatorDisplay.displayText = CalculatorDisplay.displayText + "1";
            CalculatorFrame.generateCalculatorFrame().repaint();
        }
    });

    // Legt die Funktionen von buttonTwo fest
    CalculatorButtons.buttonTwo.addActionListener(new ActionListener() {
        @Override
        public void actionPerformed(ActionEvent e) {
            CalculatorDisplay.displayText = CalculatorDisplay.displayText + "2";
            CalculatorFrame.generateCalculatorFrame().repaint();
        }
    });
    // Legt die Funktionen von buttonThree fest
    CalculatorButtons.buttonThree.addActionListener(new ActionListener() {
        @Override
        public void actionPerformed(ActionEvent e) {
            CalculatorDisplay.displayText = CalculatorDisplay.displayText + "3";
            CalculatorFrame.generateCalculatorFrame().repaint();
        }
    });
    // Legt die Funktionen von buttonFour fest
    CalculatorButtons.buttonFour.addActionListener(new ActionListener() {
        @Override
        public void actionPerformed(ActionEvent e) {
            CalculatorDisplay.displayText = CalculatorDisplay.displayText + "4";
            CalculatorFrame.generateCalculatorFrame().repaint();
        }
    });
    // Legt die Funktionen von buttonFive fest
    CalculatorButtons.buttonFive.addActionListener(new ActionListener() {
        @Override
        public void actionPerformed(ActionEvent e) {
            CalculatorDisplay.displayText = CalculatorDisplay.displayText + "5";
            CalculatorFrame.generateCalculatorFrame().repaint();
        }
    });
    // Legt die Funktionen von buttonSix fest
    CalculatorButtons.buttonSix.addActionListener(new ActionListener() {
        @Override
        public void actionPerformed(ActionEvent e) {
            CalculatorDisplay.displayText = CalculatorDisplay.displayText + "6";
            CalculatorFrame.generateCalculatorFrame().repaint();
        }
    });
    // Legt die Funktionen von buttonSeven fest
    CalculatorButtons.buttonSeven.addActionListener(new ActionListener() {
        @Override
        public void actionPerformed(ActionEvent e) {
            CalculatorDisplay.displayText = CalculatorDisplay.displayText + "7";
            CalculatorFrame.generateCalculatorFrame().repaint();
        }
    });
    // Legt die Funktionen von buttonEight fest
    CalculatorButtons.buttonEight.addActionListener(new ActionListener() {
        @Override
        public void actionPerformed(ActionEvent e) {
            CalculatorDisplay.displayText = CalculatorDisplay.displayText + "8";
            CalculatorFrame.generateCalculatorFrame().repaint();
        }
    });
    // Legt die Funktionen von buttonNine fest
    CalculatorButtons.buttonNine.addActionListener(new ActionListener() {
        @Override
        public void actionPerformed(ActionEvent e) {
            CalculatorDisplay.displayText = CalculatorDisplay.displayText + "9";
            CalculatorFrame.generateCalculatorFrame().repaint();
        }
    });
    // Legt die Funktionen von buttonComma fest
    CalculatorButtons.buttonComma.addActionListener(new ActionListener() {
        @Override
        public void actionPerformed(ActionEvent e) {
            CalculatorDisplay.displayText = CalculatorDisplay.displayText + ".";
            CalculatorFrame.generateCalculatorFrame().repaint();
        }
    });
    // Legt die Funktionen von buttonPlus fest
    CalculatorButtons.buttonPlus.addActionListener(new ActionListener() {
        @Override
        public void actionPerformed(ActionEvent e) {
            CalculatorDisplay.displayText = CalculatorDisplay.displayText + "+";
            CalculatorFrame.generateCalculatorFrame().repaint();
        }
    });
    // Legt die Funktionen von buttonMinus fest
    CalculatorButtons.buttonMinus.addActionListener(new ActionListener() {
        @Override
        public void actionPerformed(ActionEvent e) {
            CalculatorDisplay.displayText = CalculatorDisplay.displayText + "-";
            CalculatorFrame.generateCalculatorFrame().repaint();
        }
    });
    // Legt die Funktionen von buttonMultiply fest
    CalculatorButtons.buttonMultiply.addActionListener(new ActionListener() {
        @Override
        public void actionPerformed(ActionEvent e) {
            CalculatorDisplay.displayText = CalculatorDisplay.displayText + "x";
            CalculatorFrame.generateCalculatorFrame().repaint();
        }
    });
    // Legt die Funktionen von buttonDivide fest
    CalculatorButtons.buttonDivide.addActionListener(new ActionListener() {
        @Override
        public void actionPerformed(ActionEvent e) {
            CalculatorDisplay.displayText = CalculatorDisplay.displayText + "\u00F7";
            CalculatorFrame.generateCalculatorFrame().repaint();
        }
    });
    // Legt die Funktionen von buttonBracketRight fest
    CalculatorButtons.buttonBracketRight.addActionListener(new ActionListener() {
        @Override
        public void actionPerformed(ActionEvent e) {
            CalculatorDisplay.displayText = CalculatorDisplay.displayText + "(";
            CalculatorFrame.generateCalculatorFrame().repaint();
        }
    });
    // Legt die Funktionen von buttonBracketLeft fest
    CalculatorButtons.buttonBracketLeft.addActionListener(new ActionListener() {
        @Override
        public void actionPerformed(ActionEvent e) {
            CalculatorDisplay.displayText = CalculatorDisplay.displayText + ")";
            CalculatorFrame.generateCalculatorFrame().repaint();
        }
    });
    // Legt die Funktionen von buttonEqual fest
    CalculatorButtons.buttonEqual.addActionListener(new ActionListener() {
        @Override
        public void actionPerformed(ActionEvent e) {
            CalculatorDisplay.displayText = CalculatorDisplay.displayText + "=";
            CalculatorFrame.generateCalculatorFrame().repaint();
        }
    });
    // Legt die Funktionen von buttonDeleteLast fest
    CalculatorButtons.buttonDeleteLast.addActionListener(new ActionListener() {
        @Override
        public void actionPerformed(ActionEvent e) {
            try {
                CalculatorDisplay.displayText = CalculatorDisplay.displayText.substring(0,
                        CalculatorDisplay.displayText.length() - 1);
                CalculatorFrame.generateCalculatorFrame().repaint();
            } catch (Exception e2) {
            }
        }
    });
    // Legt die Funktionen von buttonDeleteAll fest
    CalculatorButtons.buttonDeleteAll.addActionListener(new ActionListener() {
        @Override
        public void actionPerformed(ActionEvent e) {
            CalculatorDisplay.displayText = "";
            CalculatorFrame.generateCalculatorFrame().repaint();
        }
    });

}

}

你说得对:我认为新的 JFrame 属于我的 generateCalculatorFrame() 方法中的新的。问题是,无论何时调用该方法,都会生成一个新框架 -> 一个新对象。你想要做的(我认为)是修改你当前的对象(当前帧)。此外,您无需创建新面板或新标签,只需更新现有面板即可。

最简单的解决方案是单例 "pattern" (http://www.journaldev.com/1377/java-singleton-design-pattern-best-practices-examples)。制作 calculatorFrame、calculatorPanel 和 calculatorDisplay 静态变量,而不是 "generating new objects" 使用相同的变量,仅在第一次调用该方法时生成。

private static JLabel calculatorDisplay;
    public static JLabel generateCalculatorDisplay ()
    {
      if(calculatorDisplay != null)
            {
                //tiny hack so i could quickly check it works. 
                //better move it to an update display method
                calculatorDisplay.setText(displayText);
                return calculatorDisplay;
            }
            calculatorDisplay = new JLabel();
            // Legt die Größe des JLabels fest
            calculatorDisplay.setSize(50, 50);
            // Legt die Hintergrundfarbe des JLabels fest
            calculatorDisplay.setOpaque(true);
            calculatorDisplay.setBackground(Color.BLACK);
            // Legt die Schriftgröße des JLabels fest
            calculatorDisplay.setFont(calculatorDisplay.getFont().deriveFont(30f));
            // Legt die Schriftfarbe des JLabels fest
            calculatorDisplay.setForeground(Color.WHITE);
            // Legt den Text des JLabels fest
            calculatorDisplay.setText(displayText);
            // Gibt das JLabel zurück
            return calculatorDisplay;
    }

这是一个快速模拟。希望这是您正在寻找的功能。 updated_display_label