2017-04-30 7 views
1

나는 자바로 만들고 싶은 계산기에 문제가있다. JLabel에는 숫자가 입력 된 숫자를 표시해야합니다. 내 문제는 사용자가 버튼을 누를 때마다 프레임이 다시 그려지지 않고 업데이트 된 JLabel 텍스트가있는 새로운 JFrame이 열리는 것입니다. 나는 새로운 JFrame이 내 generateCalculatorFrame() 메소드의 새로운 것에 속한다고 생각하지만, JFrame을 다시 그리는 방법을 모른다. 나는 약 2 시간 동안 해결책을 찾고 나보다 더 숙련 된 프로그래머에게 물었다. 그러나 그는 해결책을 찾지 못했다. 여기 JLabel을 다시 칠하는 방법?

내 코드입니다 :

package com.decase.taschenrechner; 

공용 클래스 계산기 {

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;

공용 클래스 CalculatorFrame {

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;

import javax.swing.BoxLayout; import javax.swing.JPanel;

공용 클래스 CalculatorPanel {

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에;

import javax.swing.JLabel;

공용 클래스 CalculatorDisplay {

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;

공용 클래스 ButtonEvents {

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(); 
     } 
    }); 

} 

은}

+0

나는 당신의 코드를 보지 않았지만 (너무 많은 방법이있다.) 보통 당신은 단지 레이블에'setText()'를 호출하고 그 코드를 업데이트한다. 나는 전에 이와 같은 프로그램을 작성했고 그게 내가 한 전부입니다. * * Minif * Verifiable 예제 프로그램에 대한 FAQ를 참조하십시오. – markspace

+0

문제를 올바르게 지적했습니다. 당신은 당신의 메소드를 호출 할 때마다 JFrame과 주 JPanel의 새로운 인스턴스를 생성합니다. 인스턴스를 한 번만 만들고 인스턴스에 대한 참조를 저장하지 않는 이유는 무엇입니까? 나는 당신이 싱글 톤 패턴을 사용하는 것을 실패로 시도하고 있다고 생각한다. – RubioRic

+0

어이 마크 스페이스, 답장을 보내 주셔서 감사합니다. RubioRic도 고맙습니다.하지만 제 문제를 올바르게 설명하지 못했습니다. ^^ 이미 이전 시도에서 인스턴스를 만들었지 만,이 버전은 내 JLabel 텍스트를 업데이트하지 않았습니다. – Decase

답변

1

이 약 맞다 : 나는 새로운 JFrame의 내 generateCalculatorFrame()에 새에 속하는 생각 - 방법. 새로운 메쏘드가 생성 될 때마다 그 메쏘드를 호출 할 때마다 새로운 객체가 생성됩니다. 당신이하고 싶은 것은 (나는 생각한다) 당신의 현재 객체 (현재 프레임)를 수정하는 것이다. 또한 새 패널이나 새 레이블을 만들 필요가 없으며 기존 패널을 업데이트하기 만하면됩니다.

가장 쉬운 솔루션은 싱글 톤 패턴 (http://www.journaldev.com/1377/java-singleton-design-pattern-best-practices-examples)입니다.calculatorFrame, calculatorPanel 및 calculatorDisplay 정적 변수를 만들고 "새 객체 생성"대신에 메소드의 첫 번째 호출에서만 생성 된 동일한 객체를 사용하십시오.

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

+0

안녕하세요, 감사합니다. calculatorDisplay.setText (displayText); 내 ActionEvent에서 호출했습니다. 나는 또한 calculatorFrame, calculatorPanel 및 calculatorDisplay 정적 변수를 다시 만들었습니다. 잘 작동합니다! – Decase

관련 문제