2014-01-14 5 views
0

데이터를 암호화하는 프로그램을 쓰고 있습니다. 텍스트 편집을위한 JTextArea가 있지만, 인코딩 된 텍스트인지 일반 텍스트인지 선택하고 싶습니다. 이를 위해 저장 버튼을 클릭 할 때 나타나는 JDialog를 만들었습니다. 두 개의 라디오 버튼이 있습니다. 하나는 암호화 된 데이터를 저장하고 다른 하나는 일반 텍스트로 저장하는 버튼입니다. 그 중간에는 encasskey를 요구하는 JPasswordField가 있습니다.라디오 버튼을 선택하거나 선택하지 않을 때 텍스트 필드를 숨기는 방법은 무엇입니까?

내 질문은 암호화 된 옵션을 선택하지 않은 경우 TextField를 사용할 수없고 반투명하게 만드는 간단한 방법이 있다면 제 질문입니다. 또는 간단한 방법이 없다면 TextArea를 숨기는 방법입니다. 라디오 버튼에 ChangeListener를 사용하려고했지만 작동하지 않습니다. 여기 내 코드입니다 :

import javax.swing.BoxLayout; 
import javax.swing.ButtonGroup; 
import javax.swing.JDialog; 
import javax.swing.JFrame; 
import javax.swing.JLabel; 
import javax.swing.JPanel; 
import javax.swing.JPasswordField; 
import javax.swing.JRadioButton; 
import javax.swing.SwingUtilities; 
import javax.swing.event.ChangeEvent; 
import javax.swing.event.ChangeListener; 

public class StackOverflowVersion extends JFrame { 

public static JFrame frame; 

public StackOverflowVersion() { 
    dialogoCriptografar(); 
    System.exit(EXIT_ON_CLOSE); 
} 

public void dialogoCriptografar(){ 
    final ButtonGroup bGroup = new ButtonGroup(); 
    JRadioButton[] buttons = new JRadioButton[2]; 
    final JPasswordField passwordField = new JPasswordField(20); 

    // create the raio bunttons 
    buttons[0] = new JRadioButton("Encript document before saving"); 
    buttons[1] = new JRadioButton("Just save it"); 
    //ad them to the ButtonGroup 
    bGroup.add(buttons[0]); 
    bGroup.add(buttons[1]); 
    // select the option to encript 
    buttons[0].setSelected(true); 

    //creates a panel with the radio buttons and a JPasswordField 
    final JPanel box = new JPanel(); 
    JLabel descricao = new JLabel("Choose an option to save:"); 
    box.setLayout(new BoxLayout(box, BoxLayout.Y_AXIS)); 
    box.add(descricao); 
    box.add(buttons[0]); 
    box.add(passwordField); 
    box.add(buttons[1]); 

    // creates the dialog 
    final JDialog dialogo = new JDialog(frame, "Storage options", true); 
    dialogo.setSize(275,125); 
    dialogo.setLocationRelativeTo(frame); 
    dialogo.setResizable(false); 
    dialogo.add(box); 
    dialogo.setVisible(true); 

    /* Doesn't work: 
    buttons[0].addChangeListener(new ChangeListener(){ 
     boolean visivel = true;//ele começa visivel 
     public void stateChanged(ChangeEvent event){ 
      if(visivel){ 
       box.remove(password); 
       SwingUtilities.updateComponentTreeUI(dialogo); 
       dialogo.revalidate(); 
       dialogo.repaint(); 
       visivel = false; 
      } 
      else{ 
       box.add(password); 
       SwingUtilities.updateComponentTreeUI(dialogo); 
       dialogo.revalidate(); 
       dialogo.repaint(); 
       SwingUtilities.updateComponentTreeUI(dialogo); 
       visivel = true; 
      } 
     } 
    }); 
    */ 
} 

public static void main(String[] args) { 

    SwingUtilities.invokeLater(new Runnable() { 

     public void run() { 
      frame = new StackOverflowVersion(); 
      frame.setVisible(true); 
     } 
    }); 
} 
} 

답변

5

는 TextField하지 가능한 반 투명하게 만드는 간단한 방법,

는 간단한

textField.setEditable(false); 
를 시도가있을 경우 내 질문은

또는

textField.setEnabled(false); 
+0

감사합니다. 좋은 생각입니다. 하지만 ChangeListener 사용을 도와 줄 수 있습니까? 작동하지 않습니다. 아니면 새로운 질문을해야합니까? – Junior

+0

네, 새로운 질문입니다. 관련이없는 것 같습니다. –

+1

또한 * 시각적 인 표시를주는'setEnabled (false)'를 살펴보십시오 * 사용자가 필드에 입력하는 것으로 가정하지 않았습니다. (필드는 포커스도 맞지 않습니다). –

1

코드에서 관찰.

1) 모든 UI 구성 요소의 속성, 이벤트 등을 설정 한 다음 끝에 setVisible을 추가하십시오.

2) 귀하의 경우에 당신은의 RadioButton의 각각의 리스너가 필요합니다.

3) 또한 ChangeListener에 ItemListener를 사용하는 것이 좋습니다 (마우스가 위로 이동 한 경우에도 발생 함).

아래의 코드를 확인하시기 바랍니다.

import java.awt.event.ItemEvent; 
import java.awt.event.ItemListener; 

import javax.swing.BoxLayout; 
import javax.swing.ButtonGroup; 
import javax.swing.JDialog; 
import javax.swing.JFrame; 
import javax.swing.JLabel; 
import javax.swing.JPanel; 
import javax.swing.JPasswordField; 
import javax.swing.JRadioButton; 
import javax.swing.SwingUtilities; 
import javax.swing.event.ChangeEvent; 
import javax.swing.event.ChangeListener; 

public class Main extends JFrame { 

public static JFrame frame; 

public Main() { 
    dialogoCriptografar(); 
    System.exit(EXIT_ON_CLOSE); 
} 

public void dialogoCriptografar(){ 
    final ButtonGroup bGroup = new ButtonGroup(); 
    final JRadioButton[] buttons = new JRadioButton[2]; 
    final JPasswordField passwordField = new JPasswordField(20); 

    // create the raio bunttons 
    buttons[0] = new JRadioButton("Encript document before saving"); 
    buttons[1] = new JRadioButton("Just save it"); 
    //ad them to the ButtonGroup 
    bGroup.add(buttons[0]); 
    bGroup.add(buttons[1]); 
    // select the option to encript 
    buttons[0].setSelected(true); 

    //creates a panel with the radio buttons and a JPasswordField 
    final JPanel box = new JPanel(); 
    JLabel descricao = new JLabel("Choose an option to save:"); 
    box.setLayout(new BoxLayout(box, BoxLayout.Y_AXIS)); 
    box.add(descricao); 
    box.add(buttons[0]); 
    box.add(passwordField); 
    box.add(buttons[1]); 

    // creates the dialog 
    final JDialog dialogo = new JDialog(frame, "Storage options", true); 
    dialogo.setSize(275,125); 
    dialogo.setLocationRelativeTo(frame); 
    dialogo.setResizable(false); 
    dialogo.add(box); 


    // Doesn't work: 
    buttons[0].addChangeListener(new ChangeListener() { 

     @Override 
     public void stateChanged(ChangeEvent arg0) { 
      // TODO Auto-generated method stub 
      if(buttons[0].isSelected()) { 
       passwordField.setVisible(true);; 
       //SwingUtilities.updateComponentTreeUI(dialogo); 
      // System.out.println("asdasd"); 
       box.revalidate(); 
       box.repaint(); 
      } 
     } 

    }); 
    buttons[1].addChangeListener(new ChangeListener() { 

     @Override 
     public void stateChanged(ChangeEvent arg0) { 
      // TODO Auto-generated method stub 
      //System.out.println("a"); 
      if(buttons[1].isSelected()) { 
       passwordField.setVisible(false);; 
       //System.out.println("asdasd"); 
       //SwingUtilities.updateComponentTreeUI(dialogo); 
       box.revalidate(); 
       box.repaint(); 
      } 
     } 
    }); // 

    dialogo.setVisible(true); 
} 

public static void main(String[] args) { 

    SwingUtilities.invokeLater(new Runnable() { 

     public void run() { 
      frame = new Main(); 
      frame.setVisible(true); 
     } 
    }); 
}