问题描述
我希望能够跳入组合框单元格并在键入字母时激活弹出窗口。
我已经编写了一个小程序,在表中有一个组合框,也有一个独立的框。
表格的组合框是可编辑的,而独立组合框则不可编辑。
独立的组合框仅显示键入键时要合并到表组合框中的行为。
可以使用向下箭头键激活表格组合框弹出窗口,但我不知道如何通过键盘将其下拉。
不知道我想要什么甚至可能。预先感谢您的评论。...
import java.awt.*;
import javax.swing.*;
import javax.swing.table.*;
public class Testtable {
final private JTable table;
final private JComboBox tblcombo;
final private JComboBox pnlcombo;
public Testtable() {
String[] headings = { "Name","Country"};
Object[][] data = new Object[][]{
{ "John","Canada" },{ "Mary","USA" },{ "Bob","UK" },{ "Joan","Ukraine" },{ "Mike","Mexico"}};
table = new JTable(data,headings) {
// Following needed to allow comboBox to allow editing without
// clicking mouse.
@Override
public void changeSelection(int row,int column,boolean toggle,boolean extend) {
super.changeSelection(row,column,toggle,extend);
if (editCellAt(row,column)) {
Component editor = getEditorComponent();
editor.requestFocusInWindow();
}
}
};
table.setRowHeight(30);
jtableheader header = table.getTableHeader();
header.setForeground(Color.BLUE);
String[] countries = {"","Canada","Mexico","Samoa","UK","Ukraine","USA"};
tblcombo = new JComboBox(countries);
tblcombo.setEditable(true);
pnlcombo = new JComboBox(countries);
pnlcombo.setEditable(false);
JFrame frame = new JFrame("Test ComboBoxes");
frame.setDefaultCloSEOperation(JFrame.EXIT_ON_CLOSE);
JPanel p = createPanel();
frame.add(p);
frame.pack();
frame.setLocationRelativeto(null);
frame.setVisible(true);
}
private JPanel createPanel() {
BorderLayout layout = new BorderLayout();
JPanel p = new JPanel(layout);
TableCellRenderer renderer = new MyCellRenderer();
for (int i = 0; i < table.getColumnCount(); i++) {
String name = table.getColumnName(i);
TableColumn column = table.getColumn(name);
column.setCellRenderer(renderer);
if (name.equals("Country")) {
column.setCellEditor(new ComboEditor(tblcombo));
}
}
JScrollPane jsp = new JScrollPane(table);
jsp.setBorder(BorderFactory.createLineBorder(Color.BLUE,2));
JPanel pnl = new JPanel(new FlowLayout());
JTextField tf = new JTextField(15);
pnl.add(tf);
pnl.add(pnlcombo);
p.add(pnl,BorderLayout.norTH);
p.add(jsp,BorderLayout.CENTER);
return p;
}
public static void setUIFont(javax.swing.plaf.FontUIResource f) {
java.util.Enumeration keys = UIManager.getDefaults().keys();
while (keys.hasMoreElements()) {
Object key = keys.nextElement();
Object value = UIManager.get(key);
if (value instanceof javax.swing.plaf.FontUIResource) {
UIManager.put (key,f);
}
}
}
public static void main(String[] args) {
try {
UIManager.setLookAndFeel(UIManager.getSystemLookAndFeelClassName());
UIManager.getLookAndFeelDefaults()
.put("ComboBox.noActionOnKeyNavigation",true);
setUIFont(new javax.swing.plaf.FontUIResource(
new Font("Tahoma",Font.PLAIN,20)));
} catch (Exception ex) {
ex.printstacktrace();
}
SwingUtilities.invokelater(new Runnable() {
@Override
public void run() {
new Testtable();
}
});
}
public class MyCellRenderer extends JLabel implements TableCellRenderer {
public MyCellRenderer() {
this.setopaque(true);
}
@Override
public Component getTableCellRendererComponent(JTable table,Object value,boolean isSelected,boolean hasFocus,int row,int col) {
setBackground(Color.white);
setForeground(Color.black);
if (isSelected) {
setBackground(Color.decode("#f8f8f8"));
setForeground(Color.black);
}
if (hasFocus) {
setBackground(Color.decode("#e9e9e9"));
setForeground(Color.blue);
}
if (value == null) {
value = "";
}
setText(value.toString());
return this;
}
}
public class ComboEditor extends AbstractCellEditor
implements TableCellEditor {
private final JComboBox cb;
public ComboEditor(JComboBox comboBox) {
cb = comboBox;
// prevent action events from being fired when the up/down arrow keys
// are used
this.cb.putClientProperty("JComboBox.isTableCellEditor",Boolean.TRUE);
// remove the editor's border - the cell itself already has one
((JComponent)cb.getEditor().getEditorComponent()).setBorder(null);
}
@Override
public Component getTableCellEditorComponent(JTable table,int column) {
if (isSelected) {
cb.setBackground(table.getSelectionBackground());
} else {
cb.setBackground(table.getSelectionForeground());
}
ComboBoxEditor editor = cb.getEditor();
editor.setItem(value);
editor.selectAll();
cb.setSelectedItem(value);
return cb;
}
@Override
public Object getCellEditorValue() {
Object item = cb.getSelectedItem();
if (!hasItem(item)) {
addItem(item);
}
return item;
}
private boolean hasItem(Object value) {
for (int i = 0; i < cb.getItemCount(); i++) {
if (cb.getItemAt(i).toString().equals(value.toString())) {
return true;
}
}
return false;
}
private void addItem(Object value) {
for (int i = 0; i < cb.getItemCount(); i++) {
if (value.toString().compareto(cb.getItemAt(i).toString()) <= 0) {
cb.insertItemAt(value,i);
return;
}
}
}
}
解决方法
暂无找到可以解决该程序问题的有效方法,小编努力寻找整理中!
如果你已经找到好的解决方法,欢迎将解决方案带上本链接一起发送给小编。
小编邮箱:dio#foxmail.com (将#修改为@)