2017-02-03 9 views
-1

私はコンボボックスとボタンを持っています。ボタンをクリックすると、コンボボックスの最初の項目が選択されます(インデックス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のサブクラスにすることです。

しかし、私はDefaultComboBoxModelAbstractListModelを拡張するので、私は、右ここでやっていると思います。

この行はどちらも機能しません。

combo.setSelectedItem(combo.getModel().getElementAt(0)); 

ですから、私にはいくつかのヒントがありますか?レンダラーと何か関係があるはずですが、私は何が間違っているのか分かりません。コンボのselectedIndexが変更された場合、BasicComboboxRendererは反応しませんか?

+0

repaint()を呼び出してみましたか。選択を変更したら? – Mark

+0

'repaint()'、 'updateUI()'はどちらも動作しません。私はそれらを 'actionPerformed()'部分に入れました。私はそれらが不必要だと思う。 – FaithReaper

+0

エディタは、セル内の値の編集にのみ使用されます。必要な作業を行うには、テーブルモデルを更新する必要があります。 –

答えて

4

すでに述べたように、モデルを更新する必要があります。

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.DefaultComboBoxModel; 
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<>(new String[] {"One", "Two", "Three"}); 
     combo = new JComboBox<>(model); 
     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) { 
       for (int i = 0; i < table.getModel().getRowCount(); i++) { 
        table.setValueAt(combo.getModel().getElementAt(0), i, 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(); 

      } 

     }); 
    } 
} 
+0

正しく表示されません。私はすべてのセルで実際の値でテーブルを更新したいが、答えは "null"でテーブルを埋める。今私がすべてのテーブルで見るものは空白です。最初のコンボボックスの値を「1」に、2番目のコンボボックスの値を「2」にリセットしたい場合はどうすればよいですか? – FaithReaper

+0

@FaithReaper私は自分の答えを修正しました。 –

+0

これは完璧です、ありがとう!ですから、もし私がそれをうまく理解すれば、コンボボックスならセルのレンダラは更新されません。なぜなら、更新はテーブルによって制御されるからです。 – FaithReaper

関連する問題