簡體   English   中英

選擇/不選擇單選按鈕時如何隱藏文本字段?

[英]How to hide a Text Field when a radio button is selected/not selected?

我正在編寫一個程序來加密數據。 它具有一個JTextArea來編輯文本,但是我想選擇是否將其保存為抄寫文本或純文本格式。 為此,我創建了一個JDialog,單擊“保存”按鈕時將出現該對話框。 它包含兩個單選按鈕:一個用於保存加密的數據,另一個用於以純文本格式保存。 在它們中間,有一個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);
        }
    });
}
}

我的問題是,是否有一種簡單的方法可以使TextField不可用且半透明,

你嘗試過一個簡單的

textField.setEditable(false);

要么

textField.setEnabled(false);

在您的代碼中觀察。

1)在設置所有UI組件的屬性,事件等之后,最后添加setVisible

2)在您的情況下,您需要每個RadioButton的偵聽器。

3)我也更喜歡使用ItemListener而不是ChangeListener(即使將鼠標移到它上面也會觸發)。

請檢查下面的代碼。

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

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM