英文:
Java:Swing:Nimbus:JComboBox editable box looks different from not editable box
问题
第一个JComboBox是可编辑的,带有TitledBorder,看起来很好。但第二个不可编辑的JComboBox看起来很奇怪。所有的JComboBox都包含枚举,因此它们不应该是可编辑的,但它们应该具有可编辑JComboBox的漂亮外观。我该如何实现这一点?我正在使用Nimbus。
也许这与我为Nimbus选择的设置有关?以下是这些设置:
NimbusLookAndFeel nimbus = new NimbusLookAndFeel();
UIManager.setLookAndFeel(nimbus);
UIManager.put("control", Settings.getTexturedBackgroundColor());
UIManager.put("nimbusBlueGrey", Settings.getLightGrayGold());
UIManager.put("nimbusBase", Settings.getDarkGold());
UIManager.put("textForeground", Color.BLACK);
UIManager.put("nimbusFocus", new Color(255, 220, 35));
UIManager.put("ToolBar:Button.contentMargins",
new Insets(5, 15, 5, 15));
UIManager.put("TextField.background", Settings.getLightYellow());
UIManager.put("ComboBox.forceOpaque", false);
UIManager.put("TitledBorder.border", new Insets(10, 10, 10, 10));
UIManager.put("TitledBorder.position", TitledBorder.ABOVE_BOTTOM);
UIManager.put("TitledBorder.font", getGermanFont(16F));
UIManager.put("TitledBorder.titleColor", Color.GRAY);
UIManager.put("Table.opaque", false);
UIManager.put("List.opaque", false);
UIManager.put("Table.cellRenderer", false);
UIManager.put("OptionPane.buttonFont", Main.getGermanFont(16F));
不,这与Nimbus的设置无关。
英文:
The first JComboBox is editable and looks fine with its TitledBorder. But the second not editable JComboBox looks strange.
All the JComboBoxes contain Enums, therefore they should not be editable but they should have the nice look of the editable JComboBox. How can I achieve that? I am using Nimbus.
EDIT
Maybe it has to do with the settings I choose for Nimbus? These are the settings:
NimbusLookAndFeel nimbus = new NimbusLookAndFeel();
UIManager.setLookAndFeel(nimbus);
UIManager.put("control", Settings.getTexturedBackgroundColor());
UIManager.put("nimbusBlueGrey", Settings.getLightGrayGold());
UIManager.put("nimbusBase", Settings.getDarkGold());
UIManager.put("textForeground", Color.BLACK);
UIManager.put("nimbusFocus", new Color(255, 220, 35));
UIManager.put("ToolBar:Button.contentMargins",
new Insets(5, 15, 5, 15));
UIManager.put("TextField.background", Settings.getLightYellow());
UIManager.put("ComboBox.forceOpaque", false);
UIManager.put("TitledBorder.border", new Insets(10, 10, 10, 10));
UIManager.put("TitledBorder.position", TitledBorder.ABOVE_BOTTOM);
UIManager.put("TitledBorder.font", getGermanFont(16F));
UIManager.put("TitledBorder.titleColor", Color.GRAY);
UIManager.put("Table.opaque", false);
UIManager.put("List.opaque", false);
UIManager.put("Table.cellRenderer", false);
UIManager.put("OptionPane.buttonFont", Main.getGermanFont(16F));
EDIT2
No, it does not have to do with the Nimbus settings:
答案1
得分: 1
这是在我的 Windows 10(64 位)机器上使用 Oracle 的 JDK 15 的外观。
以下是代码部分:
import java.awt.BorderLayout;
import java.awt.EventQueue;
import javax.swing.BorderFactory;
import javax.swing.JComboBox;
import javax.swing.JFrame;
import javax.swing.JPanel;
import javax.swing.UIManager;
import javax.swing.UnsupportedLookAndFeelException;
import javax.swing.WindowConstants;
import javax.swing.border.TitledBorder;
public class Nimbus00 {
private JFrame frame;
private JPanel createEditableCombo() {
JPanel panel = new JPanel();
panel.setBorder(BorderFactory.createTitledBorder(BorderFactory.createEmptyBorder(),
"Editable",
TitledBorder.LEADING,
TitledBorder.BOTTOM));
Object[] items = new Object[]{"One",
"Two",
"Three",
"Four",
"Five",
"Six",
"Seven",
"Eight",
"Nine",
"Ten"};
JComboBox<Object> combo = new JComboBox<>(items);
combo.setEditable(true);
panel.add(combo);
return panel;
}
private JPanel createNonEditableCombo() {
JPanel panel = new JPanel();
panel.setBorder(BorderFactory.createTitledBorder(BorderFactory.createEmptyBorder(),
"Regular",
TitledBorder.LEADING,
TitledBorder.BOTTOM));
Object[] items = new Object[]{"First",
"Second",
"Third",
"Fourth",
"Fifth",
"Sixth",
"Seventh",
"Eighth",
"Ninth",
"Last"};
JComboBox<Object> combo = new JComboBox<>(items);
combo.setPrototypeDisplayValue("WWWWWWWWWW");
panel.add(combo);
return panel;
}
private void showGui() {
frame = new JFrame();
frame.setDefaultCloseOperation(WindowConstants.EXIT_ON_CLOSE);
frame.add(createEditableCombo(), BorderLayout.PAGE_START);
frame.add(createNonEditableCombo(), BorderLayout.PAGE_END);
frame.pack();
frame.setLocationByPlatform(true);
frame.setVisible(true);
}
public static void main(String[] args) {
try {
UIManager.setLookAndFeel("javax.swing.plaf.nimbus.NimbusLookAndFeel");
}
catch (ClassNotFoundException |
IllegalAccessException |
InstantiationException |
UnsupportedLookAndFeelException x) {
x.printStackTrace();
}
EventQueue.invokeLater(() -> new Nimbus00().showGui());
}
}
英文:
This is how it looks on my Windows 10 (64 bit) machine with Oracle's JDK 15
Here is the code.
import java.awt.BorderLayout;
import java.awt.EventQueue;
import javax.swing.BorderFactory;
import javax.swing.JComboBox;
import javax.swing.JFrame;
import javax.swing.JPanel;
import javax.swing.UIManager;
import javax.swing.UnsupportedLookAndFeelException;
import javax.swing.WindowConstants;
import javax.swing.border.TitledBorder;
public class Nimbus00 {
private JFrame frame;
private JPanel createEditableCombo() {
JPanel panel = new JPanel();
panel.setBorder(BorderFactory.createTitledBorder(BorderFactory.createEmptyBorder(),
"Editable",
TitledBorder.LEADING,
TitledBorder.BOTTOM));
Object[] items = new Object[]{"One",
"Two",
"Three",
"Four",
"Five",
"Six",
"Seven",
"Eight",
"Nine",
"Ten"};
JComboBox<Object> combo = new JComboBox<>(items);
combo.setEditable(true);
panel.add(combo);
return panel;
}
private JPanel createNonEditableCombo() {
JPanel panel = new JPanel();
panel.setBorder(BorderFactory.createTitledBorder(BorderFactory.createEmptyBorder(),
"Regular",
TitledBorder.LEADING,
TitledBorder.BOTTOM));
Object[] items = new Object[]{"First",
"Second",
"Third",
"Fourth",
"Fifth",
"Sixth",
"Seventh",
"Eighth",
"Ninth",
"Last"};
JComboBox<Object> combo = new JComboBox<>(items);
combo.setPrototypeDisplayValue("WWWWWWWWWW");
panel.add(combo);
return panel;
}
private void showGui() {
frame = new JFrame();
frame.setDefaultCloseOperation(WindowConstants.EXIT_ON_CLOSE);
frame.add(createEditableCombo(), BorderLayout.PAGE_START);
frame.add(createNonEditableCombo(), BorderLayout.PAGE_END);
frame.pack();
frame.setLocationByPlatform(true);
frame.setVisible(true);
}
public static void main(String[] args) {
try {
UIManager.setLookAndFeel("javax.swing.plaf.nimbus.NimbusLookAndFeel");
}
catch (ClassNotFoundException |
IllegalAccessException |
InstantiationException |
UnsupportedLookAndFeelException x) {
x.printStackTrace();
}
EventQueue.invokeLater(() -> new Nimbus00().showGui());
}
}
答案2
得分: 0
原因是我直接在JComboBox上设置了边框,而没有在包围它的JPanel上设置。
通过集体智慧和协作来改善编程学习和解决问题的方式。致力于成为全球开发者共同参与的知识库,让每个人都能够通过互相帮助和分享经验来进步。
评论