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