2017-11-19 4 views
1

내 교과서 : "사용자가 버튼을 클릭하면 문구가 거꾸로 표시되는 JFrame을 확장하는 애플리케이션을 작성합니다. 사용자가 버튼을 클릭하면 문구가 정상적으로 표시됩니다. 다시."actionListener를 사용하여 문자열을 뒤집어 사용하려고 시도했습니다.

현재 paint() 메서드와 Graphic 개체를 사용하여 그려지는 String이 있습니다. String은 JUpsideDown 프레임에 표시되며 역순으로 패널 중앙에 위치합니다. 내 버튼과 actionListener를 추가했지만 -1로 곱하기로 음수 글꼴 크기를 만들려고했기 때문에 actionPerformed 메서드의 코드가 잘못되었다고 생각하지만 다시 그리면 적용되지 않는 것처럼 보입니다. . 위치 지정된 문자열은 x = 100 ad y = 100으로 이동되었지만 문자열은 여전히 ​​거꾸로되어 있습니다.

어떤 종류의지도도 부탁드립니다. 다시 새로운 fontsize을 캡슐화하는 새로운 Font 개체를 인스턴스화 할 필요가 있지만

import javax.swing.*; 
import java.awt.*; 
import java.awt.event.*; 
@SuppressWarnings("serial") 
public class JUpsideDown extends JFrame implements ActionListener 
{ 
    int x = 350; 
    int y = 100; 
    int fontSize = -26; 
    Font font = new Font("Serif", Font.PLAIN, fontSize); 
    JButton press = new JButton("Flip Text"); 
    String label = "Look at this text, it will flip!"; 

    public JUpsideDown() 
    { 
     setTitle("JUpsideDown"); 
     setLayout(new FlowLayout()); 
     setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); 
     add(press); 
     press.addActionListener(this); 
    } 

    public void paint(Graphics g) 
    { 
     super.paint(g); 
     g.setFont(font); 
     g.drawString(label, x, y); 
    } 

    public void actionPerformed(ActionEvent e) 
    { 
     fontSize = fontSize * -1; 
     x = 100; 
     y = 100; 
     repaint(); 
    } 

    public static void main(String[] args) 
    { 
     JUpsideDown frame = new JUpsideDown(); 
     frame.setSize(450, 200); 
     frame.setVisible(true); 

    } 

} 
+0

.... –

+1

음수 폰트 크기는 텍스트를 뒤집을 것이고, 대신에 네거티브 상태를 통해'Graphics' 문맥의 크기를 조절할 필요가 있습니다. 일반적으로'JFrame'과 같은 최상위 컨테이너의'paint'를 오버라이드하고 싶지는 않습니다. 문제가 없으면 대신'JPanel'으로 시작하여'paintComponent' 메소드를 오버라이드해야합니다. – MadProgrammer

+0

[이 예제] (https://stackoverflow.com/questions/24522458/flipping-rotations-and-images/24523176#24523176)는 네거티브 스케일을 사용하여'Graphics' 컨텍스트를 뒤집는 것을 보여줍니다. – MadProgrammer

답변

0

당신의 논리는 권리입니다. 이것은 actionPerformed() 메서드 내에서 버튼을 클릭 한 후에 수행해야합니다. 이 방법으로 응용 프로그램의 동작이 예상됩니다.

당신은 가능한 해결책을 찾을 수 아래 :

나는를 사용하여 생각하지 않을 때 어떻게 당신이 JUpsideDown 클래스의 fontSize는 변수를 변경하는 글꼴 인스턴스가 모르는 것
public void actionPerformed(ActionEvent e) 
    { 
     fontSize = fontSize * -1; 
     x = 100; 
     y = 100; 
     font = new Font("Serif", Font.PLAIN, fontSize); //added line 
     repaint(); 
    } 
+0

'font = 새로운 글꼴 ("Serif", Font.PLAIN, fontSize); // added line' 그 작품과 나는 이것과 비슷한 것을 시도했지만 "font"라는 새로운 Font 객체를 인스턴스화하려고 시도했다. 'Font font = new Font ("Serif", Font.PLAIN, fontSize) ; // added line' 이것은 이전에 가지고 있었던 것으로 생각합니다. 그리고 글꼴 객체가 actionPerformed 메소드에 지역화되어 있기 때문에 분명히 작동하지 않을 것입니다. 고맙습니다! –

관련 문제