我有一个简单的JOptionPane和一些组件,我想安排它们。
例如,我想将标签放在文本/密码字段旁边,设置它们的宽度等。
这就像我做的那样,当然结果不是我想要的:
public class CreateApplicationUserScreen {
CreateApplicationUserScreen(){
JLabel l_name=new JLabel("Username");
JLabel l_pass=new JLabel("Password");
JTextField tf_name=new JTextField(10);
JPasswordField pf_pass=new JPasswordField(10);
JButton b_privs = new JButton("Privs");
JButton b_databases = new JButton("Databases");
int res = JOptionPane.showOptionDialog(window,
new Object[] { l_name, tf_name,
l_pass, pf_pass,
b_privs, b_databases },
"Create application user",
JOptionPane.OK_CANCEL_OPTION,
JOptionPane.PLAIN_MESSAGE,null,
new String[]{"Create", "Cancel"},
"default");
}
}
答案 0 :(得分:4)
您可以将任何Swing组件添加到选项窗格。所以建立自己的面板:
import java.awt.*;
import javax.swing.*;
public class OptionPanePanel
{
private static void createAndShowUI()
{
JFrame frame = new JFrame();
frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
frame.setLocationRelativeTo( null );
frame.setVisible( true );
// Build a custom panel
JPanel panel = new JPanel( new GridLayout(2, 2) );
panel.add( new JLabel("First Name") );
JTextField firstName = new JTextField(10);
// firstName.addAncestorListener( new RequestFocusListener(false) );
panel.add( firstName );
panel.add( new JLabel("Last Name") );
JTextField lastName = new JTextField(10);
panel.add( lastName );
int result = JOptionPane.showConfirmDialog(
frame, // use your JFrame here
panel,
"Use a Panel",
JOptionPane.YES_NO_OPTION,
JOptionPane.PLAIN_MESSAGE);
if(result == JOptionPane.YES_OPTION)
{
System.out.println(firstName.getText() + " : " + lastName.getText());
}
else
{
System.out.println("Canceled");
}
// Let Option Pane build the panel for you
Object[] msg = {"First Name:", firstName, "Last Name:", lastName};
result = JOptionPane.showConfirmDialog(
frame,
msg,
"Use default layout",
JOptionPane.OK_CANCEL_OPTION,
JOptionPane.PLAIN_MESSAGE);
if (result == JOptionPane.YES_OPTION)
{
System.out.println(firstName.getText() + " : " + lastName.getText());
}
else
{
System.out.println("Canceled");
}
}
public static void main(String[] args)
{
EventQueue.invokeLater(new Runnable()
{
public void run()
{
createAndShowUI();
}
});
}
}
这种方法的一个缺点是焦点将放在按钮上,而不是文本字段上。因此,您可能希望使用RequestFocusListener将焦点放在第一个文本字段上。
答案 1 :(得分:2)
JOptionPane
使用BoxLayout
,在API
您可以设置任何LayoutManager
,Font
,Icon
等
需要调用JOptionPane.pack()
,如果更改了LayoutManager
例如
import java.awt.BorderLayout;
import java.awt.GridLayout;
import javax.swing.BorderFactory;
import javax.swing.JComboBox;
import javax.swing.JComponent;
import javax.swing.JFrame;
import javax.swing.JOptionPane;
import javax.swing.JPanel;
public class OptionPaneOptions {
private JPanel options;
private Object[] items;
public OptionPaneOptions() {
options = new JPanel(new GridLayout(0, 3));
options.add(createOptionPane("Plain Message", JOptionPane.PLAIN_MESSAGE));
options.add(createOptionPane("Error Message", JOptionPane.ERROR_MESSAGE));
options.add(createOptionPane("Information Message", JOptionPane.INFORMATION_MESSAGE));
options.add(createOptionPane("Warning Message", JOptionPane.WARNING_MESSAGE));
options.add(createOptionPane("Want to do something?", JOptionPane.QUESTION_MESSAGE));
items = new Object[]{"First", "Second", "Third"};
JComboBox choiceCombo = new JComboBox(items);
options.add(titled(new JOptionPane(choiceCombo,
JOptionPane.QUESTION_MESSAGE, JOptionPane.OK_CANCEL_OPTION), "Question Message"));
JFrame frame = new JFrame("JOptionPane'Options");
frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
frame.add(options, BorderLayout.CENTER);
frame.pack();
frame.setVisible(true);
}
static JOptionPane createOptionPane(String message, int type) {
JOptionPane pane = new JOptionPane(message, type);
System.out.println(pane.getLayout());
String title = message;
if (type == JOptionPane.QUESTION_MESSAGE) {
title = "Question Message";
pane.setOptionType(JOptionPane.YES_NO_CANCEL_OPTION);
}
return titled(pane, title);
}
static <T extends JComponent> T titled(T c, String title) {
c.setBorder(BorderFactory.createTitledBorder(title));
return c;
}
public static void main(String[] args) {
OptionPaneOptions test = new OptionPaneOptions();
}
}