2017-10-30 3 views
0

JButton을 눌렀을 때 텍스트를 변경하고 싶습니다. 지금까지 텍스트는 버튼을 눌렀을 때 바뀌지 만 버튼 밖에서 마우스를 움직이면 텍스트는 이전의 텍스트 (이 경우에는 빈 문자열)로 되돌아갑니다. 텍스트가 JButton에서 변경되지 않도록하려면 어떻게해야합니까? 여기 눌렀을 때 JButton의 텍스트 변경하기

내 코드입니다 :

import javax.swing.*; 
import java.awt.*; 
import java.awt.event.ActionEvent; 
import java.awt.event.ActionListener; 

public class Tile extends JButton implements ActionListener { 
    private int xPos, yPos; 
    private char value; 

    Tile(int x, int y) { 
     xPos = x; 
     yPos = y; 
     setFont(this.getFont().deriveFont(Font.PLAIN, 45f)); 
     addActionListener(this); 
    } 

    @Override 
    public int getX() { 
     return xPos; 
    } 

    @Override 
    public int getY() { 
     return yPos; 
    } 

    public char getValue() { 
     return value; 
    } 

    @Override 
    public void actionPerformed(ActionEvent e) { 
     value = 'X'; 
     setText(Character.toString(value)); 
    } 
} 
+2

무시하지 마십시오'getX' /'getY', 이것은 좋은 생각 – MadProgrammer

+0

내가'getX' /'getY' 문을 제거하고 문제없이 코드를 실행, 나는 그들이하는 과정입니다 의심 귀하의 문제와 그 코드의 어딘가에있을 가능성이 높습니다 – MadProgrammer

+0

이 코드는 완벽하게 잘 작동합니다! – Prashant

답변

-1

텍스트가 버튼을 누를 때 변경 않지만, 나는 버튼을 외부에 내 마우스를 이동할 때, 텍스트가

전에 무엇인지 되돌아갑니다

따라서, 버튼의 선택된 상태와 목표 상태에 대한 apidocs를 읽어야 할 것입니다. 가 버튼 위에 마우스를 누르면 무장을 누르면 두 모델을 만드는 :

ButtonModel (Java Platform SE 8)
는 세부, 버튼의 상태 모델은 마우스를 사용하는 경우 다음과 같이 작동합니다. 마우스가 계속 내려져있는 한, 마우스가 단추 밖으로 이동하더라도 모델은 계속 누르고 있습니다. 그 반대로, 모델은 버튼의 경계 내에서 마우스가 계속 눌려져있는 동안에 만 무장됩니다 (버튼 내부 또는 외부로 이동할 수 있지만 버튼 내에서 소비 된 시간 동안 모델이 활성화 됨). 모델이 준비되어있는 동안 마우스가 놓여지면 버튼이 트리거되고 ActionEvent가 발생합니다. 즉, 마우스가 이전에 버튼에 눌려진 후 (아직 해제되지 않은 상태) 버튼 위로 벗어 났을 때 발생합니다. 마우스를 놓으면 모델이 비무장 상태가되고 비 압축 상태가됩니다.

import java.awt.*; 
import javax.swing.*; 

public class TileTest { 
    private JComponent makeUI() { 
    JButton button1 = new JButton("A"); 
    button1.addChangeListener(e -> { 
     JButton b = (JButton) e.getSource(); 
     ButtonModel m = b.getModel(); 
     boolean isPressedAndArmed = m.isPressed() && m.isArmed(); 
     b.setText(isPressedAndArmed ? "X" : "A"); 
    }); 

    JButton button2 = new JButton("B"); 
    button2.addChangeListener(e -> { 
     JButton b = (JButton) e.getSource(); 
     ButtonModel m = b.getModel(); 
     boolean isPressed = m.isPressed(); 
     b.setText(isPressed ? "X" : "B"); 
    }); 

    JPanel p = new JPanel(); 
    p.add(button1); 
    p.add(button2); 
    return p; 
    } 
    public static void main(String[] args) { 
    EventQueue.invokeLater(() -> { 
     JFrame f = new JFrame(); 
     f.setDefaultCloseOperation(WindowConstants.EXIT_ON_CLOSE); 
     f.getContentPane().add(new TileTest().makeUI()); 
     f.setSize(320, 240); 
     f.setLocationRelativeTo(null); 
     f.setVisible(true); 
    }); 
    } 
} 
+1

나는 왜 OP의 코드가 그들이 원하는 코드를 수행한다는 사실을 감안할 때 귀찮을 까봐 궁금해했다. – MadProgrammer

+0

@MadProgrammer thanks. 나는 OP의 코드를 언급하지 않았지만 설명을 상기시켰다. 나는 보충 교재로 apidoc에서 인용문을 추가했습니다. – aterai

+0

나는 아직도 내 머리를 긁적이다. op가 말한 것을 기반으로, 마우스 커서를 버튼에서 멀리 떨어 뜨리면 텍스트가 원래대로 돌아가는 것이지, 원하는 것은 아니지만 할 수있는 일입니다. 나는 ops 코드를 시도했으며 원하는대로 작동하므로 문제가있을 가능성이 큽니다. – MadProgrammer

관련 문제