类Integer
具有缓存,缓存Integer
值.因此,如果我使用方法valueOf
或收件箱,新值将不会被实例化,而是从缓存中获取.
我知道默认缓存大小是127
因为VM设置而可以扩展.我的问题是:在这些设置中缓存大小的默认值有多大,我可以操纵这个值吗?这个值取决于我使用的是哪个VM(32位还是64位)?
我现在正在调整遗留代码,可能需要从int转换为Integer.
澄清:遵循我在Java源代码中找到的代码
private static class IntegerCache {
static final int low = -128;
static final int high;
static final Integer cache[];
static {
// high value may be configured by property
int h = 127;
String integerCacheHighPropValue =
sun.misc.VM.getSavedProperty("java.lang.Integer.IntegerCache.high");
if (integerCacheHighPropValue != null) {
int i = parseInt(integerCacheHighPropValue);
i = Math.max(i, 127);
// Maximum array size is Integer.MAX_VALUE
h = Math.min(i, Integer.MAX_VALUE - (-low));
}
high = h;
cache = …
Run Code Online (Sandbox Code Playgroud) 我需要一个具有快速索引和哈希访问权限的集合类.现在我有了ArrayList.它具有良好的索引访问,但他的contains
方法不具备性能.HashSet具有良好的contains
实现,但没有索引访问.哪个系列都有?可能来自Apache的东西?或者我应该创建自己的集合类,它具有:用于索引访问的ArrayList和用于contains
检查的HashSet ?
只是为了澄清:我需要get(int index)
和contains(Object o)
我有一个用于验证用户输入的界面。为了进行验证,我使用了一些标准 Java 验证器和一些自定义验证器。我的自定义验证器在出错时抛出 ParseException 并带有本地化消息。但我不知道Java或第三方lib是否也使用本地化消息。
问题:如何在 catch 块中获取异常是否有本地化消息的提示(标准 Java 方式,而不是自定义异常类/接口)?
我使用带有自定义标题栏和自定义缩放器的未修饰的JFrame.一切正常,但是当我制作一个JFrame未修饰时,我失去了对Windows-Left/Right键绑定的支持(似乎它是由Windows本机实现的).我想为我的应用程序重新实现此功能.我的问题:我可以在一个关键监听器中检测到是否按下了Windows键,但我无法检测是否另一个键(在我的情况下为左/右)与Windows键一起按下(在InputEvent中没有修饰符WINDOWS_MASK_DOWN).可能有人知道解决方法吗?
这是我的代码:
import java.awt.BorderLayout;
import java.awt.event.KeyAdapter;
import java.awt.event.KeyEvent;
import javax.swing.JFrame;
import javax.swing.JTextField;
import javax.swing.WindowConstants;
public class HeadlessFrameTest {
public static void main(String[] args) {
final JFrame frm = new JFrame("Test");
final JTextField field = new JTextField();
frm.add(field, BorderLayout.NORTH);
field.addKeyListener(new KeyAdapter() {
@Override
public void keyPressed(KeyEvent e) {
System.out.println(e);
}
});
frm.setUndecorated(true);
frm.setSize(500, 550);
frm.setDefaultCloseOperation(WindowConstants.EXIT_ON_CLOSE);
frm.setVisible(true);
}
}
Run Code Online (Sandbox Code Playgroud) 我想在用户输入无效时绘制一个图标.我找到了Oracle的一个例子并为我的目的修改了它.Icon的绘画工作正常,但是当我更改值以更正时,图标不会完全不可见:仍然会显示在JPanel上绘制的部分.
这是我的代码:
import java.awt.AlphaComposite;
import java.awt.Graphics;
import java.awt.Graphics2D;
import java.awt.GridBagConstraints;
import java.awt.GridBagLayout;
import java.awt.Insets;
import java.awt.RenderingHints;
import java.awt.image.BufferedImage;
import java.text.NumberFormat;
import javax.swing.Icon;
import javax.swing.ImageIcon;
import javax.swing.JComponent;
import javax.swing.JFormattedTextField;
import javax.swing.JFrame;
import javax.swing.JLabel;
import javax.swing.JLayer;
import javax.swing.JPanel;
import javax.swing.UIManager;
import javax.swing.plaf.LayerUI;
public class FieldValidator extends JPanel {
private static final int ICON_SIZE = 12;
private static final Icon ICON = createResizedIcon((ImageIcon) UIManager.getIcon("OptionPane.errorIcon"));
public static void main(String[] args) {
javax.swing.SwingUtilities.invokeLater(new Runnable() {
@Override
public void run() {
createUI();
}
});
}
public …
Run Code Online (Sandbox Code Playgroud) 我想在弹出窗口中显示一个文本。当弹出完全在应用程序框架上时 (MediumWeightPopup) - 一切正常,但是当弹出的一部分在框架之外 (HeavyWeightPopup) 时,它无法聚焦。在这种情况下,插入符号是不可见的,并且无法输入文本。
这是我的代码:
import java.awt.BorderLayout;
import java.awt.event.MouseAdapter;
import java.awt.event.MouseEvent;
import javax.swing.JFrame;
import javax.swing.JPanel;
import javax.swing.JTextField;
import javax.swing.Popup;
import javax.swing.PopupFactory;
import javax.swing.SwingUtilities;
import javax.swing.WindowConstants;
public class PopupTest {
public static void main(String[] args) {
JFrame frm = new JFrame("Popup test");
JPanel p = new JPanel();
p.addMouseListener(new MouseAdapter() {
Popup pop;
@Override
public void mouseReleased(MouseEvent e) {
if (SwingUtilities.isRightMouseButton(e)) {
if (pop != null) {
pop.hide();
}
JPanel popupPanel = new JPanel(new BorderLayout());
JTextField field = new JTextField(20); …
Run Code Online (Sandbox Code Playgroud) 我需要在组合框中提供一些禁用的项目。除了防止在单击禁用的项目后关闭组合框之外,所有其他方法都工作正常。
这是我的代码:
import java.awt.Component;
import java.awt.event.MouseAdapter;
import java.awt.event.MouseEvent;
import java.awt.event.MouseListener;
import javax.swing.DefaultComboBoxModel;
import javax.swing.JComboBox;
import javax.swing.JFrame;
import javax.swing.JList;
import javax.swing.UIManager;
import javax.swing.WindowConstants;
import javax.swing.plaf.basic.BasicComboBoxRenderer;
import javax.swing.plaf.basic.ComboPopup;
public class DisabledCombo {
public static void main(String[] args) {
final DisabledSupportComboModel model = new DisabledSupportComboModel();
model.addElement(new Item("First element"));
model.addElement(new Item("Second element"));
model.addElement(new Item("Disabled", false));
model.addElement(new Item("Fourth element"));
final JComboBox<Item> itemCombo = new JComboBox<DisabledCombo.Item>(model);
itemCombo.setRenderer(new DisabledSupportComboRenderer());
final ComboPopup popup = (ComboPopup) itemCombo.getUI().getAccessibleChild(itemCombo, 0);
final JList<?> l = popup.getList();
final MouseListener[] listeners = l.getMouseListeners();
for …
Run Code Online (Sandbox Code Playgroud) 对于以下代码
boolean changed = null == oldValue? oldValue != newValue : !oldValue.equals(newValue);
Run Code Online (Sandbox Code Playgroud)
我收到PMD警告:"使用equals()来比较对象引用".但如果我遵循这个提议,我会得到一份NPE.这是PMD规则的错误还是我的编程风格简直不好?
我对Swing Event Dispatcher Thread(EDT)的理解是,它是执行事件处理代码的专用线程。因此,如果我的理解是正确的,那么在下面的示例中:
private class ButtonClickListener implements ActionListener{
public void actionPerformed(ActionEvent e) {
// START EDT
String command = e.getActionCommand();
if( command.equals( "OK" )) {
statusLabel.setText("Ok Button clicked.");
} else if( command.equals( "Submit" ) ) {
statusLabel.setText("Submit Button clicked.");
} else {
statusLabel.setText("Cancel Button clicked.");
}
// END EDT
}
}
Run Code Online (Sandbox Code Playgroud)
在之间的所有代码START EDT
,并END EDT
在在美国东部时间执行,并且它的任何代码以外的主应用程序线程上执行。同样,另一个示例:
// OUTSIDE EDT
JFrame mainFrame = new JFrame("Java SWING Examples");
mainFrame.setSize(400,400);
mainFrame.setLayout(new GridLayout(3, 1));
mainFrame.addWindowListener(new WindowAdapter() {
public void windowClosing(WindowEvent …
Run Code Online (Sandbox Code Playgroud) import java.awt.Graphics;
import javax.swing.JPanel;
import java.awt.Color;
public class DrawPanel extends JPanel {
public void paintComponent(Graphics g) {
int height = getHeight();
int width = getWidth();
g.drawRect(350, 510, 110, 170);
g.drawRect(470, 510, 110, 170);
g.drawRect(590, 510, 110, 170);
g.drawRect(710, 510, 110, 170);
g.drawRect(830, 510, 110, 170);
g.drawRect(350, 30, 110, 170);
g.drawRect(470, 30, 110, 170);
g.drawRect(590, 30, 110, 170);
g.drawRect(710, 30, 110, 170);
g.drawRect(830, 30, 110, 170);
g.setColor(Color.RED);
g.drawRect(110, 450, 110, 170);
g.drawRect(110, 60, 110, 170);
}
}
Run Code Online (Sandbox Code Playgroud)
我需要为每个Rectangle(我的意思是在Rectangle内)着色红色,但是使用这个g.setColor(Color.RED); 我只能为Rectanlge的外部部分着色
java ×10
swing ×6
boxing ×1
collections ×1
contains ×1
hashcode ×1
integer ×1
java-8 ×1
jcombobox ×1
jlayer ×1
keylistener ×1
localization ×1
pmd ×1
popup ×1