📄 basicoptionpaneui.java
字号:
Object[] sValues = optionPane.getSelectionValues(); Object inputValue = optionPane .getInitialSelectionValue(); JComponent toAdd; if (sValues != null) { if (sValues.length < 20) { JComboBox cBox = new JComboBox(); for(int counter = 0, maxCounter = sValues.length; counter < maxCounter; counter++) { cBox.addItem(sValues[counter]); } if (inputValue != null) { cBox.setSelectedItem(inputValue); } inputComponent = cBox; toAdd = cBox; } else { JList list = new JList(sValues); JScrollPane sp = new JScrollPane(list); list.setVisibleRowCount(10); list.setSelectionMode(ListSelectionModel.SINGLE_SELECTION); if(inputValue != null) list.setSelectedValue(inputValue, true); list.addMouseListener(new ListSelectionListener()); toAdd = sp; inputComponent = list; } } else { MultiplexingTextField tf = new MultiplexingTextField(20); tf.setKeyStrokes(new KeyStroke[] { KeyStroke.getKeyStroke("ENTER") } ); if (inputValue != null) { String inputString = inputValue.toString(); tf.setText(inputString); tf.setSelectionStart(0); tf.setSelectionEnd(inputString.length()); } tf.addActionListener(new TextFieldActionListener()); toAdd = inputComponent = tf; } Object[] newMessage; if (message == null) { newMessage = new Object[1]; newMessage[0] = toAdd; } else { newMessage = new Object[2]; newMessage[0] = message; newMessage[1] = toAdd; } return newMessage; } return optionPane.getMessage(); } return null; } /** * Creates and adds a JLabel representing the icon returned from * <code>getIcon</code> to <code>top</code>. This is messaged from * <code>createMessageArea</code> */ protected void addIcon(Container top) { /* Create the icon. */ Icon sideIcon = getIcon(); if (sideIcon != null) { JLabel iconLabel = new JLabel(sideIcon); iconLabel.setVerticalAlignment(SwingConstants.TOP); top.add(iconLabel, BorderLayout.BEFORE_LINE_BEGINS); } } /** * Returns the icon from the JOptionPane the receiver is providing * the look and feel for, or the default icon as returned from * <code>getDefaultIcon</code>. */ protected Icon getIcon() { Icon mIcon = (optionPane == null ? null : optionPane.getIcon()); if(mIcon == null && optionPane != null) mIcon = getIconForType(optionPane.getMessageType()); return mIcon; } /** * Returns the icon to use for the passed in type. */ protected Icon getIconForType(int messageType) { if(messageType < 0 || messageType > 3) return null; switch(messageType) { case 0: return UIManager.getIcon("OptionPane.errorIcon"); case 1: return UIManager.getIcon("OptionPane.informationIcon"); case 2: return UIManager.getIcon("OptionPane.warningIcon"); case 3: return UIManager.getIcon("OptionPane.questionIcon"); } return null; } /** * Returns the maximum number of characters to place on a line. */ protected int getMaxCharactersPerLineCount() { return optionPane.getMaxCharactersPerLineCount(); } /** * Recursively creates new JLabel instances to represent <code>d</code>. * Each JLabel instance is added to <code>c</code>. */ protected void burstStringInto(Container c, String d, int maxll) { // Primitive line wrapping int len = d.length(); if (len <= 0) return; if (len > maxll) { int p = d.lastIndexOf(' ', maxll); if (p <= 0) p = d.indexOf(' ', maxll); if (p > 0 && p < len) { burstStringInto(c, d.substring(0, p), maxll); burstStringInto(c, d.substring(p + 1), maxll); return; } } JLabel label = new JLabel(d, JLabel.LEFT); configureMessageLabel(label); c.add(label); } protected Container createSeparator() { return null; } /** * Creates and returns a Container containing the buttons. The buttons * are created by calling <code>getButtons</code>. */ protected Container createButtonArea() { JPanel bottom = new JPanel(); bottom.setBorder(UIManager.getBorder("OptionPane.buttonAreaBorder")); bottom.setLayout(new ButtonAreaLayout(true, 6)); addButtonComponents(bottom, getButtons(), getInitialValueIndex()); mnemonics = null; return bottom; } /** * Creates the appropriate object to represent each of the objects in * <code>buttons</code> and adds it to <code>container</code>. This * differs from addMessageComponents in that it will recurse on * <code>buttons</code> and that if button is not a Component * it will create an instance of JButton. */ protected void addButtonComponents(Container container, Object[] buttons, int initialIndex) { if (buttons != null && buttons.length > 0) { boolean sizeButtonsToSame = getSizeButtonsToSameWidth(); boolean createdAll = true; int numButtons = buttons.length; JButton[] createdButtons = null; int maxWidth = 0; int[] mnemonics = this.mnemonics; if (mnemonics != null && mnemonics.length != buttons.length) { mnemonics = null; } if (sizeButtonsToSame) { createdButtons = new JButton[numButtons]; } for(int counter = 0; counter < numButtons; counter++) { Object button = buttons[counter]; Component newComponent; if (button instanceof Component) { createdAll = false; newComponent = (Component)button; container.add(newComponent); hasCustomComponents = true; } else { JButton aButton; if (button instanceof Icon) aButton = new JButton((Icon)button); else aButton = new JButton(button.toString()); aButton.setMultiClickThreshhold(UIManager.getInt("OptionPane.buttonClickThreshhold")); configureButton(aButton); container.add(aButton); ActionListener buttonListener = createButtonActionListener(counter); if (buttonListener != null) { aButton.addActionListener(buttonListener); } newComponent = aButton; if (mnemonics != null) { aButton.setMnemonic(mnemonics[counter]); } } if (sizeButtonsToSame && createdAll && (newComponent instanceof JButton)) { createdButtons[counter] = (JButton)newComponent; maxWidth = Math.max(maxWidth, newComponent.getMinimumSize().width); } if (counter == initialIndex) { initialFocusComponent = newComponent; if (initialFocusComponent instanceof JButton) { JButton defaultB = (JButton)initialFocusComponent; defaultB.addAncestorListener(new AncestorListener() { public void ancestorAdded(AncestorEvent e) { JButton defaultButton = (JButton)e.getComponent(); JRootPane root = SwingUtilities.getRootPane(defaultButton); if (root != null) { root.setDefaultButton(defaultButton); } } public void ancestorRemoved(AncestorEvent event) {} public void ancestorMoved(AncestorEvent event) {} }); } } } ((ButtonAreaLayout)container.getLayout()). setSyncAllWidths((sizeButtonsToSame && createdAll)); /* Set the padding, windows seems to use 8 if <= 2 components, otherwise 4 is used. It may actually just be the size of the buttons is always the same, not sure. */ if (sizeButtonsToSame && createdAll) { JButton aButton; int padSize; padSize = (numButtons <= 2? 8 : 4); for(int counter = 0; counter < numButtons; counter++) { aButton = createdButtons[counter]; aButton.setMargin(new Insets(2, padSize, 2, padSize)); } } } } protected ActionListener createButtonActionListener(int buttonIndex) { return new ButtonActionListener(buttonIndex); } /** * Returns the buttons to display from the JOptionPane the receiver is * providing the look and feel for. If the JOptionPane has options * set, they will be provided, otherwise if the optionType is * YES_NO_OPTION, yesNoOptions is returned, if the type is * YES_NO_CANCEL_OPTION yesNoCancelOptions is returned, otherwise * defaultButtons are returned. */ protected Object[] getButtons() { if (optionPane != null) { Object[] suppliedOptions = optionPane.getOptions(); if (suppliedOptions == null) { Object[] defaultOptions; int type = optionPane.getOptionType(); Locale l = optionPane.getLocale(); if (type == JOptionPane.YES_NO_OPTION) { defaultOptions = new String[2]; defaultOptions[0] = UIManager.get("OptionPane.yesButtonText",l); defaultOptions[1] = UIManager.get("OptionPane.noButtonText",l); mnemonics = new int[2]; mnemonics[0] = getMnemonic("OptionPane.yesButtonMnemonic", l); mnemonics[1] = getMnemonic("OptionPane.noButtonMnemonic", l); } else if (type == JOptionPane.YES_NO_CANCEL_OPTION) { defaultOptions = new String[3]; defaultOptions[0] = UIManager.get("OptionPane.yesButtonText",l); defaultOptions[1] = UIManager.get("OptionPane.noButtonText",l); defaultOptions[2] = UIManager.get("OptionPane.cancelButtonText",l); mnemonics = new int[3]; mnemonics[0] = getMnemonic("OptionPane.yesButtonMnemonic", l); mnemonics[1] = getMnemonic("OptionPane.noButtonMnemonic", l); mnemonics[2] = getMnemonic("OptionPane.cancelButtonMnemonic", l); } else if (type == JOptionPane.OK_CANCEL_OPTION) { defaultOptions = new String[2]; defaultOptions[0] = UIManager.get("OptionPane.okButtonText",l); defaultOptions[1] = UIManager.get("OptionPane.cancelButtonText",l); mnemonics = new int[2]; mnemonics[0] = getMnemonic("OptionPane.okButtonMnemonic", l); mnemonics[1] = getMnemonic("OptionPane.cancelButtonMnemonic", l); } else { defaultOptions = new String[1]; defaultOptions[0] = UIManager.get("OptionPane.okButtonText",l); mnemonics = new int[1]; mnemonics[0] = getMnemonic("OptionPane.okButtonMnemonic", l); } return defaultOptions; } return suppliedOptions; } return null; } /** * Returns the mnemonic for the passed in key. */ private int getMnemonic(String key, Locale l) { String value = (String)UIManager.get(key, l); if (value == null) { return 0; } try { return Integer.parseInt(value); } catch (NumberFormatException nfe) { } return 0; } /** * Returns true, basic L&F wants all the buttons to have the same * width. */ protected boolean getSizeButtonsToSameWidth() { return true; } /** * Returns the initial index into the buttons to select. The index * is calculated from the initial value from the JOptionPane and * options of the JOptionPane or 0. */ protected int getInitialValueIndex() { if (optionPane != null) { Object iv = optionPane.getInitialValue(); Object[] options = optionPane.getOptions(); if(options == null) { return 0; } else if(iv != null) { for(int counter = options.length - 1; counter >= 0; counter--){ if(options[counter].equals(iv)) return counter; } } } return -1; } /** * Sets the input value in the option pane the receiver is providing * the look and feel for based on the value in the inputComponent. */ protected void resetInputValue() { if(inputComponent != null && (inputComponent instanceof JTextField)) { optionPane.setInputValue(((JTextField)inputComponent).getText()); } else if(inputComponent != null && (inputComponent instanceof JComboBox)) { optionPane.setInputValue(((JComboBox)inputComponent) .getSelectedItem()); } else if(inputComponent != null) { optionPane.setInputValue(((JList)inputComponent) .getSelectedValue()); } } /** * If inputComponent is non-null, the focus is requested on that, * otherwise request focus on the default value */ public void selectInitialValue(JOptionPane op) { if (inputComponent != null) inputComponent.requestFocus(); else { if (initialFocusComponent != null) initialFocusComponent.requestFocus(); if (initialFocusComponent instanceof JButton) { JRootPane root = SwingUtilities.getRootPane(initialFocusComponent); if (root != null) { root.setDefaultButton((JButton)initialFocusComponent); } } } } /** * Returns true if in the last call to validateComponent the message * or buttons contained a subclass of Component. */ public boolean containsCustomComponents(JOptionPane op) { return hasCustomComponents; } /** * <code>ButtonAreaLayout</code> behaves in a similar manner to * <code>FlowLayout</code>. It lays out all components from left to * right. If <code>syncAllWidths</code> is true, the widths of each * component will be set to the largest preferred size width. * * This inner class is marked "public" due to a compiler bug. * This class should be treated as a "protected" inner class. * Instantiate it only within subclasses of BasicOptionPaneUI. */ public static class ButtonAreaLayout implements LayoutManager { protected boolean syncAllWidths; protected int padding; /** If true, children are lumped together in parent. */ protected boolean centersChildren; public ButtonAreaLayout(boolean syncAllWidths, int padding) { this.syncAllWidths = syncAllWidths; this.padding = padding; centersChildren = true; } public void setSyncAllWidths(boolean newValue) { syncAllWidths = newValue; } public boolean getSyncAllWidths() { return syncAllWidths; } public void setPadding(int newPadding) { this.padding = newPadding; }
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -