- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
大家好,我是一名业余程序员(12 年级),我正在开发一个程序,该程序通过自定义 JDialog(使用 eclipse WindowBuilder 创建)询问用户的用户名和密码
我遇到的问题是从“弹出窗口”检索数据,我编写了一个测试程序,但在我输入任何数据之前显示了值。
这是我的代码:
package winowbuilderstuff;
public class TestDialog {
/**
* @param args
*/
public static void main(String[] args) {
LoginDialog login = new LoginDialog ();
login.setVisible(true);
String username = login.getUser();
String password = login.getPass();
System.out.println("Username: " + username);
System.out.println("Password: " + password);
}
}
package winowbuilderstuff;
import java.awt.BorderLayout;
import java.awt.FlowLayout;
import javax.swing.JButton;
import javax.swing.JDialog;
import javax.swing.JPanel;
import javax.swing.border.EmptyBorder;
import javax.swing.JLabel;
import javax.swing.JTextField;
import javax.swing.JPasswordField;
import java.awt.event.ActionListener;
import java.awt.event.ActionEvent;
public class LoginDialog extends JDialog {
private final JPanel contentPanel = new JPanel();
private JTextField txtfUsername;
private JPasswordField pswrdf;
/**
* Launch the application.
*/
public static void main(String[] args) {
try {
LoginDialog dialog = new LoginDialog();
dialog.setDefaultCloseOperation(JDialog.DISPOSE_ON_CLOSE);
dialog.setVisible(true);
} catch (Exception e) {
e.printStackTrace();
}
}
/**
* Create the dialog.
*/
public LoginDialog() {
setTitle("Login");
setBounds(100, 100, 478, 150);
getContentPane().setLayout(new BorderLayout());
contentPanel.setBorder(new EmptyBorder(5, 5, 5, 5));
getContentPane().add(contentPanel, BorderLayout.CENTER);
contentPanel.setLayout(null);
{
JLabel lblUsername = new JLabel("Username");
lblUsername.setBounds(25, 13, 68, 14);
contentPanel.add(lblUsername);
}
{
txtfUsername = new JTextField();
txtfUsername.setToolTipText("Enter your username");
txtfUsername.setBounds(137, 13, 287, 17);
contentPanel.add(txtfUsername);
txtfUsername.setColumns(10);
}
JLabel lblPassword = new JLabel("Password");
lblPassword.setBounds(25, 52, 68, 14);
contentPanel.add(lblPassword);
pswrdf = new JPasswordField();
pswrdf.setToolTipText("Enter your password");
pswrdf.setBounds(137, 50, 287, 17);
contentPanel.add(pswrdf);
{
JPanel buttonPane = new JPanel();
buttonPane.setLayout(new FlowLayout(FlowLayout.RIGHT));
getContentPane().add(buttonPane, BorderLayout.SOUTH);
{
JButton btnLogin = new JButton("Login");
btnLogin.addActionListener(new ActionListener() {
public void actionPerformed(ActionEvent arg0) {
getUser();
getPass();
dispose();
}
});
btnLogin.setActionCommand("OK");
buttonPane.add(btnLogin);
getRootPane().setDefaultButton(btnLogin);
}
{
JButton btnCancel = new JButton("Cancel");
btnCancel.addActionListener(new ActionListener() {
public void actionPerformed(ActionEvent arg0) {
dispose();
}
});
btnCancel.setActionCommand("Cancel");
buttonPane.add(btnCancel);
}
}
}
public String getUser(){
return txtfUsername.getText();
}
public String getPass(){
return pswrdf.getText();
}
}
最佳答案
super(...)
构造函数调用或简单的方法调用来完成。setVisible(true)
的站点卡住调用代码,然后在对话框结束时返回到同一点的调用代码不再可见。setVisible(true)
之后,立即通过调用 getUser()
和 getPass()< 查询对话框对象的用户名和密码
上面的方法。getText()
,因为那不是安全代码。而是通过 getPassword()
从中获取 char[]
并使用它,因为这 更安全。setBounds(...)
来放置组件,因为这会导致 GUI 非常不灵活,虽然它们在一个平台上看起来不错,但在大多数其他平台上看起来很糟糕平台或屏幕分辨率,并且很难更新和维护。例如,只需进行以下更改:
public LoginDialog() {
super(null, ModalityType.APPLICATION_MODAL); // add this line
例如:
import java.awt.Dialog.ModalityType;
import java.awt.event.ActionEvent;
import java.awt.GridBagConstraints;
import java.awt.GridBagLayout;
import java.awt.GridLayout;
import java.awt.Insets;
import java.awt.Window;
import javax.swing.*;
public class TestDialog2 {
private static void createAndShowGui() {
int result = MyLoginPanel.showDialog();
if (result == JOptionPane.OK_OPTION) {
String userName = MyLoginPanel.getUserName();
char[] password = MyLoginPanel.getPassword();
System.out.println("User Name: " + userName);
System.out.println("Password: " + new String(password));
}
}
public static void main(String[] args) {
SwingUtilities.invokeLater(new Runnable() {
public void run() {
createAndShowGui();
}
});
}
}
@SuppressWarnings("serial")
class MyLoginPanel extends JPanel {
private static MyLoginPanel myLoginPanel = new MyLoginPanel();
private static JDialog myDialog;
public static final String RETURN_STATE = "return state";
private static final int COLUMNS = 20;
private JTextField userNameField = new JTextField(COLUMNS);
private JPasswordField passField = new JPasswordField(COLUMNS);
private int returnState = Integer.MIN_VALUE;
private MyLoginPanel() {
setLayout(new GridBagLayout());
add(new JLabel("User Name:"), createGbc(0, 0, 1));
add(userNameField, createGbc(1, 0, 2));
add(new JLabel("Password:"), createGbc(0, 1, 1));
add(passField, createGbc(1, 1, 2));
add(new JLabel(""), createGbc(0, 2, 1));
JPanel buttonPanel = new JPanel(new GridLayout(1, 0, 5, 0));
buttonPanel.add(new JButton(new LoginAction("Login")));
buttonPanel.add(new JButton(new CancelAction("Cancel")));
add(buttonPanel, createGbc(1, 2, 2));
}
private GridBagConstraints createGbc(int x, int y, int width) {
GridBagConstraints gbc = new GridBagConstraints();
gbc.gridx = x;
gbc.gridy = y;
gbc.gridwidth = width;
gbc.gridheight = 1;
gbc.weightx = 1.0;
gbc.weighty = 1.0;
gbc.fill = GridBagConstraints.HORIZONTAL;
int right = x == 0 ? 15 : 5;
gbc.insets = new Insets(5, 5, 5, right);
gbc.anchor = x == 0 ? GridBagConstraints.LINE_START : GridBagConstraints.LINE_END;
return gbc;
}
public void setReturnState(int returnState) {
this.returnState = returnState;
firePropertyChange(RETURN_STATE, Integer.MIN_VALUE, returnState);
}
public int getReturnState() {
return returnState;
}
private class LoginAction extends AbstractAction {
public LoginAction(String name) {
super(name);
int mnemonic = (int) name.charAt(0);
putValue(MNEMONIC_KEY, mnemonic);
}
@Override
public void actionPerformed(ActionEvent e) {
returnState = JOptionPane.OK_OPTION;
Window win = SwingUtilities.getWindowAncestor(MyLoginPanel.this);
win.dispose();
}
}
private String _getUserName() {
return userNameField.getText();
}
private char[] _getPassword() {
return passField.getPassword();
}
public static String getUserName() {
return myLoginPanel._getUserName();
}
public static char[] getPassword() {
return myLoginPanel._getPassword();
}
private class CancelAction extends AbstractAction {
public CancelAction(String name) {
super(name);
int mnemonic = (int) name.charAt(0);
putValue(MNEMONIC_KEY, mnemonic);
}
@Override
public void actionPerformed(ActionEvent e) {
returnState = JOptionPane.CANCEL_OPTION;
Window win = SwingUtilities.getWindowAncestor(MyLoginPanel.this);
win.dispose();
}
}
public static int showDialog() {
if (myDialog == null) {
myDialog = new JDialog(null, "Test", ModalityType.APPLICATION_MODAL);
myDialog.add(myLoginPanel);
myDialog.pack();
}
myDialog.setVisible(true);
return myLoginPanel.getReturnState();
}
}
或者更简单,只需使用 JOptionPane 作为模态对话框。您可以轻松地将 JPanel 传递给它。
例如:
import java.awt.GridBagConstraints;
import java.awt.GridBagLayout;
import java.awt.Insets;
import javax.swing.JLabel;
import javax.swing.JOptionPane;
import javax.swing.JPanel;
import javax.swing.JPasswordField;
import javax.swing.JTextField;
import javax.swing.SwingUtilities;
public class TestDialog3 {
private static void createAndShowGui() {
MyLoginPanel3 myLoginPanel3 = new MyLoginPanel3();
int result = JOptionPane.showConfirmDialog(null, myLoginPanel3, "Log On", JOptionPane.OK_CANCEL_OPTION, JOptionPane.PLAIN_MESSAGE);
if (result == JOptionPane.OK_OPTION) {
String userName = myLoginPanel3.getUserName();
char[] password = myLoginPanel3.getPassword();
System.out.println("User Name: " + userName);
System.out.println("Password: " + new String(password));
}
}
public static void main(String[] args) {
SwingUtilities.invokeLater(new Runnable() {
public void run() {
createAndShowGui();
}
});
}
}
@SuppressWarnings("serial")
class MyLoginPanel3 extends JPanel {
private static final int COLUMNS = 20;
private JTextField userNameField = new JTextField(COLUMNS);
private JPasswordField passField = new JPasswordField(COLUMNS);
public MyLoginPanel3() {
setLayout(new GridBagLayout());
add(new JLabel("User Name:"), createGbc(0, 0, 1));
add(userNameField, createGbc(1, 0, 2));
add(new JLabel("Password:"), createGbc(0, 1, 1));
add(passField, createGbc(1, 1, 2));
add(new JLabel(""), createGbc(0, 2, 1));
}
private GridBagConstraints createGbc(int x, int y, int width) {
GridBagConstraints gbc = new GridBagConstraints();
gbc.gridx = x;
gbc.gridy = y;
gbc.gridwidth = width;
gbc.gridheight = 1;
gbc.weightx = 1.0;
gbc.weighty = 1.0;
gbc.fill = GridBagConstraints.HORIZONTAL;
int right = x == 0 ? 15 : 5;
gbc.insets = new Insets(5, 5, 5, right);
gbc.anchor = x == 0 ? GridBagConstraints.LINE_START : GridBagConstraints.LINE_END;
return gbc;
}
public String getUserName() {
return userNameField.getText();
}
public char[] getPassword() {
return passField.getPassword();
}
}
关于java - 如何从自定义 JDialog 返回代码,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/31595336/
好的,所以我编辑了以下... 只需将以下内容放入我的 custom.css #rt-utility .rt-block {CODE HERE} 但是当我尝试改变... 与 #rt-sideslid
在表格 View 中,我有一个自定义单元格(在界面生成器中高度为 500)。在该单元格中,我有一个 Collection View ,我按 (10,10,10,10) 固定到边缘。但是在 tablev
对于我的无能,我很抱歉,但总的来说,我对 Cocoa、Swift 和面向对象编程还很陌生。我的主要来源是《Cocoa Programming for OS X》(第 5 版),以及 Apple 的充满
我正在使用 meta-tegra 为我的 NVIDIA Jetson Nano 构建自定义图像。我需要 PyTorch,但没有它的配方。我在设备上构建了 PyTorch,并将其打包到设备上的轮子中。现
在 jquery 中使用 $.POST 和 $.GET 时,有没有办法将自定义变量添加到 URL 并发送它们?我尝试了以下方法: $.ajax({type:"POST", url:"file.php?
Traefik 已经默认实现了很多中间件,可以满足大部分我们日常的需求,但是在实际工作中,用户仍然还是有自定义中间件的需求,为解决这个问题,官方推出了一个 Traefik Pilot[1] 的功
我想让我的 CustomTextInputLayout 将 Widget.MaterialComponents.TextInputLayout.OutlinedBox 作为默认样式,无需在 XML 中
我在 ~/.emacs 中有以下自定义函数: (defun xi-rgrep (term) (grep-compute-defaults) (interactive "sSearch Te
我有下表: 考虑到每个月的权重,我的目标是在 5 个月内分散 10,000 个单位。与 10,000 相邻的行是我最好的尝试(我在这上面花了几个小时)。黄色是我所追求的。 我试图用来计算的逻辑如下:计
我的表单中有一个字段,它是文件类型。当用户点击保存图标时,我想自然地将文件上传到服务器并将文件名保存在数据库中。我尝试通过回显文件名来测试它,但它似乎不起作用。另外,如何将文件名添加到数据库中?是在模
我有一个 python 脚本来发送电子邮件,它工作得很好,但问题是当我检查我的电子邮件收件箱时。 我希望该用户名是自定义用户名,而不是整个电子邮件地址。 最佳答案 发件人地址应该使用的格式是: You
我想减小 ggcorrplot 中标记的大小,并减少文本和绘图之间的空间。 library(ggcorrplot) data(mtcars) corr <- round(cor(mtcars), 1)
GTK+ noob 问题在这里: 是否可以自定义 GtkFileChooserButton 或 GtkFileChooserDialog 以删除“位置”部分(左侧)和顶部的“位置”输入框? 我实际上要
我正在尝试在主页上使用 ajax 在 magento 中使用 ajax 显示流行的产品列表,我可以为 5 或“N”个产品执行此操作,但我想要的是将分页工具栏与结果集一起添加. 这是我添加的以显示流行产
我正在尝试使用 PasswordResetForm 内置函数。 由于我想要自定义表单字段,因此我编写了自己的表单: class FpasswordForm(PasswordResetForm):
据我了解,新的 Angular 7 提供了拖放功能。我搜索了有关 DnD 的 Tree 组件,但没有找到与树相关的内容。 我在 Stackblitz 上找到的一个工作示例.对比drag'ndrop功能
我必须开发一个自定义选项卡控件并决定使用 WPF/XAML 创建它,因为我无论如何都打算学习它。完成后应该是这样的: 到目前为止,我取得了很好的进展,但还有两个问题: 只有第一个/最后一个标签项应该有
我要定制xtable用于导出到 LaTeX。我知道有些问题是关于 xtable在这里,但我找不到我要找的具体东西。 以下是我的表的外观示例: my.table <- data.frame(Specif
用ejs在这里显示日期 它给我结果 Tue Feb 02 2016 16:02:24 GMT+0530 (IST) 但是我需要表现为 19th January, 2016 如何在ejs中执行此操作?
我想问在 JavaFX 中使用自定义对象制作 ListView 的最佳方法,我想要一个每个项目如下所示的列表: 我搜了一下,发现大部分人都是用细胞工厂的方法来做的。有没有其他办法?例如使用客户 fxm
我是一名优秀的程序员,十分优秀!