问题描述
我已从 JComoboBox
中删除了箭头按钮,使其看起来像 JTextField
并将其添加为CellEditor中。目的是创建一个AutoSuggest(不是自动完成)JTable单元格。
I have removed the arrow button from the JComoboBox
to make it look like a JTextField
and added it as a celleditor. The purpose is it create an AutoSuggest(not AutoComplete) JTable cell.
On这样做边框有点看起来很烦人。如何更改边框使其看起来像文本边框在右边。我试过去除边框创建的线条边框。但它没有移除蓝色边框。
On Doing that the border kinda looks irking.How to change the border to make it look like textfield border on the right. I have tried removing the border created line border. But its not removing the blueish border.
使用Nimbus UI。
Using Nimbus UI.
MCVE解决问题
import java.util.logging.Level;
import java.util.logging.Logger;
import javax.swing.BorderFactory;
import javax.swing.DefaultCellEditor;
import javax.swing.JButton;
import javax.swing.JComboBox;
import javax.swing.JFrame;
import javax.swing.JScrollPane;
import javax.swing.JTable;
import javax.swing.SwingUtilities;
import javax.swing.UIManager;
public class Sample extends JFrame {
public Sample() {
init();
}
private void init() {
JTable table = new JTable(5, 5);
DefaultCellEditor cellEditor = new DefaultCellEditor(new EditorCombo());
cellEditor.setClickCountToStart(2);
table.getColumnModel().getColumn(0)
.setCellEditor(cellEditor);
table.setRowHeight(30);
table.setCellSelectionEnabled(true);
add(new JScrollPane(table));
}
public static void main(String[] args) {
setUpUI("Nimbus");
SwingUtilities.invokeLater(new Runnable() {
@Override
public void run() {
Sample samp = new Sample();
samp.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
samp.setTitle("Table Test");
samp.pack();
samp.setLocationRelativeTo(null);
samp.setVisible(true);
}
});
}
private static void setUpUI(String ui) {
try {
for (UIManager.LookAndFeelInfo info : UIManager.getInstalledLookAndFeels()) {
if (ui.equals(info.getName())) {
UIManager.setLookAndFeel(info.getClassName());
break;
}
}
} catch (ClassNotFoundException | InstantiationException | IllegalAccessException | javax.swing.UnsupportedLookAndFeelException ex) {
Logger.getLogger(Sample.class.getName()).log(Level.SEVERE, null, ex);
}
}
class EditorCombo extends JComboBox {
public EditorCombo() {
setEditable(true);
for (int i = 0; i < 10; i++) {
addItem("Sample" + i);
}
setUI(new javax.swing.plaf.synth.SynthComboBoxUI() {
@Override
protected JButton createArrowButton() {
JButton button = new JButton() {
@Override
public int getWidth() {
return 0;
}
};
button.setBorder(BorderFactory.createEmptyBorder());
button.setVisible(false);
return button;
}
@Override
public void configureArrowButton() {
}
});
}
}
}
推荐答案
也许这会对你有所帮助:
Maybe this will help you: Nimbus Defaults (The Java™ Tutorials > Creating a GUI With JFC/Swing > Modifying the Look and Feel)
-
TextField [Focused] .borderPainter
-
TextField [Enabled] .borderPainter
-
ComboBox:\ComboBox .textField \[Enabled] .backgroundPainter
-
ComboBox:\ComboBox.textField \[Selected] .backgroundPainter
TextField[Focused].borderPainter
TextField[Enabled].borderPainter
ComboBox:\"ComboBox.textField\"[Enabled].backgroundPainter
ComboBox:\"ComboBox.textField\"[Selected].backgroundPainter
import java.awt.*;
import java.util.logging.Level;
import java.util.logging.Logger;
import javax.swing.*;
public class Sample2 extends JFrame {
public Sample2() {
init();
}
private void init() {
JTable table = new JTable(5, 5);
DefaultCellEditor cellEditor = new DefaultCellEditor(new EditorCombo());
cellEditor.setClickCountToStart(2);
table.getColumnModel().getColumn(0).setCellEditor(cellEditor);
table.setRowHeight(30);
table.setCellSelectionEnabled(true);
add(new JScrollPane(table));
}
public static void main(String[] args) {
setUpUI("Nimbus");
SwingUtilities.invokeLater(new Runnable() {
@Override
public void run() {
Sample2 samp = new Sample2();
samp.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
samp.setTitle("Table Test");
samp.pack();
samp.setLocationRelativeTo(null);
samp.setVisible(true);
}
});
}
private static void setUpUI(String ui) {
try {
for (UIManager.LookAndFeelInfo info : UIManager.getInstalledLookAndFeels()) {
if (ui.equals(info.getName())) {
UIManager.setLookAndFeel(info.getClassName());
break;
}
}
} catch (ClassNotFoundException | InstantiationException
| IllegalAccessException | UnsupportedLookAndFeelException ex) {
Logger.getLogger(Sample2.class.getName()).log(Level.SEVERE, null, ex);
}
}
}
class EditorCombo extends JComboBox<String> {
public EditorCombo() {
super();
setEditable(true);
for (int i = 0; i < 10; i++) {
addItem("Sample" + i);
}
}
@Override public void updateUI() {
//super.updateUI();
setUI(new javax.swing.plaf.synth.SynthComboBoxUI() {
@Override
protected JButton createArrowButton() {
JButton button = new JButton() {
@Override
public int getWidth() {
return 0;
}
};
button.setBorder(BorderFactory.createEmptyBorder());
button.setVisible(false);
return button;
}
@Override
public void configureArrowButton() {
}
});
UIDefaults d = new UIDefaults();
// putClientProperty("Nimbus.Overrides", d);
// putClientProperty("Nimbus.Overrides.InheritDefaults", false);
// JComponent c = (JComponent) getEditor().getEditorComponent();
// c.putClientProperty("Nimbus.Overrides", d);
// c.putClientProperty("Nimbus.Overrides.InheritDefaults", false);
// c.setBorder(BorderFactory.createLineBorder(Color.BLACK));
Painter<JComponent> emptyPainter = new Painter<JComponent>() {
@Override public void paint(Graphics2D g, JComponent c, int w, int h) {
/* Empty painter */
}
};
d.put("TextField.borderPainter", emptyPainter);
d.put("TextField[Enabled].borderPainter", emptyPainter);
d.put("TextField[Focused].borderPainter", emptyPainter);
d.put("ComboBox:\"ComboBox.textField\"[Enabled].backgroundPainter", emptyPainter);
d.put("ComboBox:\"ComboBox.textField\"[Selected].backgroundPainter", emptyPainter);
d.put("ComboBox[Editable+Focused].backgroundPainter", emptyPainter);
putClientProperty("Nimbus.Overrides", d);
JComponent c = (JComponent) getEditor().getEditorComponent();
c.putClientProperty("Nimbus.Overrides", d);
c.setBorder(BorderFactory.createLineBorder(Color.BLACK));
}
}
这篇关于删除JTable中的JCombobox边框的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持!