Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/400.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
在java Jframe中,我可以使用复选框从视图中添加/删除Jlabel吗?_Java_Swing_Jlabel_Jcheckbox - Fatal编程技术网

在java Jframe中,我可以使用复选框从视图中添加/删除Jlabel吗?

在java Jframe中,我可以使用复选框从视图中添加/删除Jlabel吗?,java,swing,jlabel,jcheckbox,Java,Swing,Jlabel,Jcheckbox,我正在制作一个应用程序,让我执行哈希,在顶部我想有一组复选框,基本上说我有四种不同的哈希类型。选中复选框后,我希望标签显示哈希输入的文本 我附上了一张图片,希望能让你更容易理解我的意思。我这样做的原因是,当最终的程序有将近10行的文本框和标签时,它可以被缩小,只显示用户希望看到的文本框和标签 我已经能够得到它,所以复选框使它可见或不可见,但这也只是留下一个空白,其中一行标签,而不是移动所有的一行 我现在添加了我的编码,这样人们就可以看到我目前是如何做的,并帮助定义需要修改的地方 import j

我正在制作一个应用程序,让我执行哈希,在顶部我想有一组复选框,基本上说我有四种不同的哈希类型。选中复选框后,我希望标签显示哈希输入的文本

我附上了一张图片,希望能让你更容易理解我的意思。我这样做的原因是,当最终的程序有将近10行的文本框和标签时,它可以被缩小,只显示用户希望看到的文本框和标签

我已经能够得到它,所以复选框使它可见或不可见,但这也只是留下一个空白,其中一行标签,而不是移动所有的一行

我现在添加了我的编码,这样人们就可以看到我目前是如何做的,并帮助定义需要修改的地方

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

public class Hasher extends JFrame implements ActionListener {
    String UserInput;
    private JTextField textInputField;
    private static JLabel MD5Hashed,MD5Label;
    private static JCheckBox MD5Check, SHA1Check, SHA256Check, FileCheck;
    private JFrame contentPane;

public Hasher() {
    this.setTitle("Hasher");
    Container contentPane = this.getContentPane();
    contentPane.setLayout(new GridLayout(0,1) );
    contentPane.setBackground(new Color(88,148,202));

    //CheckBoxes
        JPanel mainPanel = new JPanel();
        mainPanel.setLayout(new BorderLayout());
        JPanel checkBoxPanel = new JPanel();
        MD5Check = new JCheckBox("MD5");
        MD5Check.addActionListener(new ActionListener() {
@Override
            public void actionPerformed(ActionEvent e) {
    boolean Visible = MD5Check.isSelected();
    MD5Hashed.setVisible(Visible);
    MD5Label.setVisible(Visible);
            }
        });
        checkBoxPanel.add(MD5Check);
        SHA1Check = new JCheckBox("SHA-1");
        checkBoxPanel.add(SHA1Check);
        SHA256Check = new JCheckBox("SHA-256");
        checkBoxPanel.add(SHA256Check);
        FileCheck = new JCheckBox("File Hashing");
        checkBoxPanel.add(FileCheck);
        mainPanel.add(checkBoxPanel);
        contentPane.add(mainPanel);


//Entered data to perform hash on
    contentPane.add(new JLabel ("   Enter text to hash"));
    textInputField = new JTextField();
    //HashingProcess inputListener = new HashingProcess( );
    //textInputField.addActionListener(inputListener);
    contentPane.add( textInputField);

//MD5 hash is completed 
    MD5Label = new JLabel( "   Using MD5 the hash is: " );
    contentPane.add( MD5Label);
    MD5Hashed = new JLabel( "??") ;
    contentPane.add( MD5Hashed );
    MD5Hashed.setVisible(false);
    MD5Label.setVisible(false);

}

public static void main(String[] args) {
    Hasher theWindow = new Hasher( );
    theWindow.setSize(400, 400 );
    theWindow.setDefaultCloseOperation( JFrame.EXIT_ON_CLOSE );
    theWindow.setVisible(true);

}

}
改变

致:

如果要删除MD5Hashed和MD5Label,请执行以下操作:

{
if(MD5Check.isSelected()){
    MD5Hashed.remove();
    MD5Label.remove();
}
else{
    contentPane.add( MD5Label);
    contentPane.add( MD5Hashed );
}

    contentPane.validate();
    contentPane.repaint();
}

在选中/取消选中时,您需要为所有
复选框处理
事件

public void actionPerformed(ActionEvent actionEvent) {
       if(all check-box un-checked){
            // someLable.setVisible(false);
       }else if(MD5 checked){
           // peform operation based upon MD5
           // someLable.setVisible(true);
       }
       // likewise for all others
      }
你有两帧

public class Hasher extends JFrame implements ActionListener {
    //...
    private JFrame contentPane;
    //..
这立刻引发了一个问题,屏幕上到底是哪一个,你到底在和哪一个互动?虽然这可能与您的问题没有直接关系,但令人困惑

一般的经验法则是,不要从顶级容器(如
JFrame
)进行扩展,它将您锁定在一个用例中,并可能导致无休止的混乱。相反,从
JPanel
开始,并将其添加到
JFrame
的实例或任何其他您喜欢的容器中

“主要可能”的问题是,Swing是懒惰的。它不会更新用户界面,直到你告诉它或用户界面的大小调整

添加和删除组件时,需要在容器上调用
revalidate
repaint
,以触发更新-这就是代码中实际出现的问题,您正在引用
contentPane
,即
private JFrame contentPane
而不是
JFrame
contentPane
Hasher
从中扩展。。。看,混乱

如果你仔细研究一下你的代码,很明显你有很多重复的操作在进行,唯一的核心区别是用来散列文本的算法

因此,考虑到这一点,我们可以创建一些基本类来完成大部分工作,例如

public class HashPane extends JPanel {

    private JLabel hashedLabel;
    private JLabel promptLabel;

    private HashAlgorithim algorithim;

    public HashPane(String labelText, HashAlgorithim algorithim) {
        setOpaque(false);
        this.algorithim = algorithim;
        setLayout(new FlowLayout(FlowLayout.LEFT));
        promptLabel = new JLabel(labelText);
        add(promptLabel);
        hashedLabel = new JLabel("??");
        add(hashedLabel);
    }

    public void setText(String text) {
        hashedLabel.setText(algorithim.generateHash(text));
    }

}
这只是两个标签,分别显示提示和结果。结果是通过插件算法生成的,该算法用于生成所提供文本的哈希

该算法本身只是一个定义基本契约的
接口

public interface HashAlgorithm {
    public String generateHash(String from);
}
然后,您需要创建要使用的每个算法的实现

现在,使面板可见/不可见只需将
JCheckBox
HashPane
关联起来,这可以通过简单的
映射实现

public class Hasher extends JPanel {
    //...
    private Map<JCheckBox, HashPane> mapPanes;

    public Hasher() {
        //...
        HashPane md5Pane = new HashPane("MD5 hash = ", new NotAMD5Alorithim());
        //...
        HashPane sha1Pane = new HashPane("SHA-1 hash = ", new NotAMSHA1Alorithim());
        //..
        mapPanes = new HashMap<>(25);
        mapPanes.put(MD5Check, md5Pane);
        mapPanes.put(SHA1Check, sha1Pane);
        //...
因为我几乎毁了你的代码

导入java.awt.BorderLayout;
导入java.awt.Color;
导入java.awt.EventQueue;
导入java.awt.FlowLayout;
导入java.awt.GridBagConstraints;
导入java.awt.GridBagLayout;
导入java.awt.event.ActionEvent;
导入java.awt.event.ActionListener;
导入java.util.HashMap;
导入java.util.Map;
导入java.util.Map.Entry;
导入javax.swing.JCheckBox;
导入javax.swing.JFrame;
导入javax.swing.JLabel;
导入javax.swing.JPanel;
导入javax.swing.JTextField;
导入javax.swing.UIManager;
导入javax.swing.UnsupportedLookAndFeelException;
公共类哈希器扩展了JPanel{
字符串用户输入;
私有JTextField textInputField;
私有静态JCheckBox MD5Check、SHA1Check、SHA256Check、FileCheck;
私人地图窗格;
公共哈希器(){
setLayout(新的BorderLayout());
挫折背景(新颜色(88148202));
//复选框
JPanel mainPanel=新的JPanel();
setLayout(新的BorderLayout());
JPanel checkBoxPanel=新的JPanel();
MD5Check=新的JCheckBox(“MD5”);
checkBoxPanel.add(MD5Check);
SHA1Check=新JCheckBox(“SHA-1”);
checkBoxPanel.add(SHA1Check);
SHA256Check=新JCheckBox(“SHA-256”);
checkBoxPanel.add(SHA256Check);
FileCheck=newjcheckbox(“文件哈希”);
添加(文件检查);
mainPanel.add(复选框面板);
添加(主面板,BorderLayout.NORTH);
JPanel centerPane=newjpanel(newborderlayout());
centerPane.set不透明(false);
JPanel inputPane=newjpanel(newflowlayout(FlowLayout.LEFT));
inputPane.set不透明(false);
//输入要对其执行哈希的数据
添加(新的JLabel(“将文本输入到哈希:”);
textInputField=新的JTextField(20);
添加(textInputField);
添加(输入窗格,BorderLayout.NORTH);
JPanel输出=新的JPanel(新的GridBagLayout());
output.set不透明(false);
GridBagConstraints gbc=新的GridBagConstraints();
gbc.gridx=0;
gbc.gridy=0;
gbc.fill=GridBagConstraints.HORIZONTAL;
gbc.weightx=1;
gbc.gridwidth=GridBagConstraints.rements;
HashPane md5Pane=newhashpane(“MD5 hash=,new notamd5alorithe());
输出。添加(MD5烷,gbc);
gbc.gridx=0;
gbc.gridy++;
HashPane sha1Pane=新HashPane(“SHA-1 hash=,new NotAMSHA1Alorithim());
输出。添加(sha1Pane,gbc);
//最后一个窗格
gbc.gridy++;
gbc.weighty=1;
add(新的JLabel(),gbc);
centerPane.add(输出);
添加(中心窗格);
public interface HashAlgorithm {
    public String generateHash(String from);
}
public class Hasher extends JPanel {
    //...
    private Map<JCheckBox, HashPane> mapPanes;

    public Hasher() {
        //...
        HashPane md5Pane = new HashPane("MD5 hash = ", new NotAMD5Alorithim());
        //...
        HashPane sha1Pane = new HashPane("SHA-1 hash = ", new NotAMSHA1Alorithim());
        //..
        mapPanes = new HashMap<>(25);
        mapPanes.put(MD5Check, md5Pane);
        mapPanes.put(SHA1Check, sha1Pane);
        //...
public class Hasher extends JPanel {
    //...
    private Map<JCheckBox, HashPane> mapPanes;

    public Hasher() {
        //...
        ActionHandler listener = new ActionHandler();
        for (Entry<JCheckBox, HashPane> entry : mapPanes.entrySet()) {
            entry.getKey().addActionListener(listener);
            entry.getValue().setVisible(false);
        }

    }

    protected class ActionHandler implements ActionListener {

        @Override
        public void actionPerformed(ActionEvent e) {
            JCheckBox cb = (JCheckBox) e.getSource();
            HashPane hashPane = mapPanes.get(cb);
            hashPane.setVisible(cb.isSelected());
            revalidate();
            repaint();
        }

    }
    import java.awt.BorderLayout;
    import java.awt.Color;
    import java.awt.EventQueue;
    import java.awt.FlowLayout;
    import java.awt.GridBagConstraints;
    import java.awt.GridBagLayout;
    import java.awt.event.ActionEvent;
    import java.awt.event.ActionListener;
    import java.util.HashMap;
    import java.util.Map;
    import java.util.Map.Entry;
    import javax.swing.JCheckBox;
    import javax.swing.JFrame;
    import javax.swing.JLabel;
    import javax.swing.JPanel;
    import javax.swing.JTextField;
    import javax.swing.UIManager;
    import javax.swing.UnsupportedLookAndFeelException;

    public class Hasher extends JPanel {

        String UserInput;
        private JTextField textInputField;
        private static JCheckBox MD5Check, SHA1Check, SHA256Check, FileCheck;

        private Map<JCheckBox, HashPane> mapPanes;

        public Hasher() {
            setLayout(new BorderLayout());
            setBackground(new Color(88, 148, 202));

            //CheckBoxes
            JPanel mainPanel = new JPanel();
            mainPanel.setLayout(new BorderLayout());
            JPanel checkBoxPanel = new JPanel();
            MD5Check = new JCheckBox("MD5");
            checkBoxPanel.add(MD5Check);
            SHA1Check = new JCheckBox("SHA-1");
            checkBoxPanel.add(SHA1Check);
            SHA256Check = new JCheckBox("SHA-256");
            checkBoxPanel.add(SHA256Check);
            FileCheck = new JCheckBox("File Hashing");
            checkBoxPanel.add(FileCheck);
            mainPanel.add(checkBoxPanel);
            add(mainPanel, BorderLayout.NORTH);

            JPanel centerPane = new JPanel(new BorderLayout());
            centerPane.setOpaque(false);
            JPanel inputPane = new JPanel(new FlowLayout(FlowLayout.LEFT));
            inputPane.setOpaque(false);

    //Entered data to perform hash on
            inputPane.add(new JLabel("Enter text to hash: "));
            textInputField = new JTextField(20);
            inputPane.add(textInputField);

            centerPane.add(inputPane, BorderLayout.NORTH);

            JPanel output = new JPanel(new GridBagLayout());
            output.setOpaque(false);
            GridBagConstraints gbc = new GridBagConstraints();
            gbc.gridx = 0;
            gbc.gridy = 0;
            gbc.fill = GridBagConstraints.HORIZONTAL;
            gbc.weightx = 1;
            gbc.gridwidth = GridBagConstraints.REMAINDER;
            HashPane md5Pane = new HashPane("MD5 hash = ", new NotAMD5Alorithim());
            output.add(md5Pane, gbc);

            gbc.gridx = 0;
            gbc.gridy++;
            HashPane sha1Pane = new HashPane("SHA-1 hash = ", new NotAMSHA1Alorithim());
            output.add(sha1Pane, gbc);

            // last pane
            gbc.gridy++;
            gbc.weighty = 1;
            output.add(new JLabel(), gbc);

            centerPane.add(output);

            add(centerPane);

            mapPanes = new HashMap<>(25);
            mapPanes.put(MD5Check, md5Pane);
            mapPanes.put(SHA1Check, sha1Pane);
            //...

            ActionHandler listener = new ActionHandler();
            for (Entry<JCheckBox, HashPane> entry : mapPanes.entrySet()) {
                entry.getKey().addActionListener(listener);
                entry.getValue().setVisible(false);
            }

        }

        protected class ActionHandler implements ActionListener {

            @Override
            public void actionPerformed(ActionEvent e) {
                JCheckBox cb = (JCheckBox) e.getSource();
                HashPane hashPane = mapPanes.get(cb);
                hashPane.setVisible(cb.isSelected());
                revalidate();
                repaint();
            }

        }

        public static void main(String[] args) {
            EventQueue.invokeLater(new Runnable() {
                @Override
                public void run() {
                    try {
                        UIManager.setLookAndFeel(UIManager.getSystemLookAndFeelClassName());
                    } catch (ClassNotFoundException | InstantiationException | IllegalAccessException | UnsupportedLookAndFeelException ex) {
                        ex.printStackTrace();
                    }

                    JFrame frame = new JFrame("Testing");
                    frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
                    frame.add(new Hasher());
                    frame.pack();
                    frame.setLocationRelativeTo(null);
                    frame.setVisible(true);
                }
            });
        }

        public interface HashAlgorithm {
            public String generateHash(String from);
        }

        public class NotAMD5Alorithim implements HashAlgorithm {

            @Override
            public String generateHash(String from) {
                return "bananas";
            }

        }

        public class NotAMSHA1Alorithim implements HashAlgorithm {

            @Override
            public String generateHash(String from) {
                return "bananas";
            }

        }

        public class HashPane extends JPanel {

            private JLabel hashedLabel;
            private JLabel promptLabel;

            private HashAlgorithm algorithim;

            public HashPane(String labelText, HashAlgorithm algorithim) {
                setOpaque(false);
                this.algorithim = algorithim;
                setLayout(new FlowLayout(FlowLayout.LEFT));
                promptLabel = new JLabel(labelText);
                add(promptLabel);
                hashedLabel = new JLabel("??");
                add(hashedLabel);
            }

            public void setText(String text) {
                hashedLabel.setText(algorithim.generateHash(text));
            }

        }

    }