私はコンボボックスとボタンを持っています。ボタンをクリックすると、コンボボックスの最初の項目が選択されます(インデックス0)。しかし、combo.getSelectedIndex()
が変更されましたが(私はそれがデバッグで変更されたことがわかります)、UIでは表示されません。どうして?Java SWING - setSelectedIndex()が呼び出されたときにJComboBoxがUIの選択を変更しない
実行可能な例:
package com.WindThunderStudio.TableWithComboBox;
import java.awt.Dimension;
import java.awt.EventQueue;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
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.table.TableColumn;
public class TC extends JFrame{
JComboBox<String> combo;
JTable table;
public TC(){
begin();
}
public void begin(){
setDefaultCloseOperation(JFrame.DISPOSE_ON_CLOSE);
setTitle("nothing.");
DefaultComboBoxModel<String> model = new DefaultComboBoxModel<>(options);
combo = new JComboBox<>(model);
JTable table = new JTable(new Object[2][2], new String[]{"Column One", "Column Two"});
TableColumn col0 = table.getColumnModel().getColumn(0);
col0.setCellEditor(new DefaultCellEditor(combo));
JButton button = new JButton("Clear");
button.addActionListener(new ActionListener() {
@Override
public void actionPerformed(ActionEvent e) {
combo.setSelectedIndex(0);
}
});
getContentPane().setLayout(null);
// getContentPane().setLayout(new MigLayout());
setPreferredSize(new Dimension(500,500));
JScrollPane sp = new JScrollPane(table);
sp.setBounds(0,0,300,100);
getContentPane().add(sp);
button.setBounds(300,100,200,200);
getContentPane().add(button);
pack();
setVisible(true);
}
public static void main(String[] args) {
EventQueue.invokeLater(new Runnable(){
@Override
public void run() {
TC tc = new TC();
}
});
}
}
私は不思議私は「UIを更新していない」の部分が似ているより複雑な例を参照してください、こことGoogleで検索していますが、私の場合は単純です。
私は読んだことがあるDOC言って:他に
何かに注意する - でも編集できないコンボボックスの - カスタムモデル火災リストデータイベントことを確保されたときにコンボ ボックスのデータや状態変化。 データが決して変更されない不変のコンボボックスモデルであっても、選択内容が変更されると、リストデータイベント(CONTENTS_CHANGED イベント)が発生する必要があります。リストデータイベント を無料で発生させる1つの方法は、コンボボックスモデルを AbstractListModelのサブクラスにすることです。
しかし、私はDefaultComboBoxModel
がAbstractListModel
を拡張するので、私は、右ここでやっていると思います。
この行はどちらも機能しません。
combo.setSelectedItem(combo.getModel().getElementAt(0));
ですから、私にはいくつかのヒントがありますか?レンダラーと何か関係があるはずですが、私は何が間違っているのか分かりません。コンボのselectedIndex
が変更された場合、BasicComboboxRenderer
は反応しませんか?
repaint()を呼び出してみましたか。選択を変更したら? – Mark
'repaint()'、 'updateUI()'はどちらも動作しません。私はそれらを 'actionPerformed()'部分に入れました。私はそれらが不必要だと思う。 – FaithReaper
エディタは、セル内の値の編集にのみ使用されます。必要な作業を行うには、テーブルモデルを更新する必要があります。 –