2012-05-10 42 views
0

を更新する際に私が持っている:フォーカスが失われたJDialogの

  • アイテムのリストを含むJScrollPaneに埋め込まJTable、選択された項目に関連する情報を表示JDialogに埋め込ま
  • JPanel

コードはJTableがフォーカスを失って、JDialogが焦点に選択が変更されるたびに取得することを除いて、期待どおりに動作(情報が更新されます)。だから、私はtable.requestFocusInWindowを追加しましたが、JTableは依然としてフォーカスを失いますが、呼び出しはtrueを返します。

JDialogは更新されますが、JTableはフォーカスを失わないことを確認するにはどうすればよいですか?

ps:私の最終目標は、矢印(上/下)でテーブルをブラウズし、JDialogで情報の更新を見ることです。現時点では、行をクリックする必要があります。


は私の問題を(選択が変更されたときに使って、JDialogの内容は変わりますが、フォーカスが失われた)複製SSCCE下記参照EDIT。

public class TestTable extends JTable { 

    public static JFrame f = new JFrame(); 
    public static JTextField text = new JTextField(); 
    public static JDialog dialog; 

    public static void main(String[] args) { 
     f.setSize(300, 300); 
     f.setLocation(300, 300); 
     f.setResizable(false); 
     showPopup(); 
     final JScrollPane jScrollPane = new JScrollPane(); 
     jScrollPane.getViewport().add(new TestTable()); 
     f.add(jScrollPane); 
     f.setVisible(true); 
     f.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); 
    } 

    public TestTable() { 
     super(); 
     setModel(new TestTableModel()); 
     getSelectionModel().addListSelectionListener(new ListSelectionListener() { 

      @Override 
      public void valueChanged(ListSelectionEvent e) { 
       ListSelectionModel lsm = (ListSelectionModel) e.getSource(); 
       int row = lsm.getAnchorSelectionIndex(); 

       Object item = getModel().getValueAt(row, 0); 

       text.setText(item.toString()); 
       dialog.setVisible(true); 
       TestTable.this.requestFocusInWindow(); //DOES NOT DO ANYTHING 
      } 
     }); 
     setCellSelectionEnabled(false); 
    } 

    public class TestTableModel extends DefaultTableModel { 

     public TestTableModel() { 
      super(new String[]{"DATA"}, 3); 
      setValueAt(Double.valueOf(-0.1), 0, 0); 
      setValueAt(Double.valueOf(+0.1), 1, 0); 
      setValueAt(Double.valueOf(0), 2, 0); 
     } 
    } 

    private static void showPopup() { 
     dialog = new JDialog(f, "Title"); 
     dialog.setContentPane(text); 
     dialog.setDefaultCloseOperation(JDialog.DISPOSE_ON_CLOSE); 
     dialog.pack(); 
     dialog.setLocationRelativeTo(null); 
     dialog.setVisible(true); 
    } 
} 

答えて

1

私はJLabelので試してみました、それは問題にならないので、その場に焦点をつかむあなたのダイアログで何かがあるに違いありません。この問題を回避する必要がある場合は、いつでもJTableの親フレームにtoFront()を呼び出すことができます。問題が解決しない場合は、SSCCEを編集して問題を再現してください。あなたは第二を持っている場合は、私が投稿している - あなたの答えのための

import java.awt.Component; 
import java.util.Vector; 

import javax.swing.FocusManager; 
import javax.swing.JDialog; 
import javax.swing.JFrame; 
import javax.swing.JLabel; 
import javax.swing.JScrollPane; 
import javax.swing.JTable; 
import javax.swing.ListSelectionModel; 
import javax.swing.SwingUtilities; 
import javax.swing.event.ListSelectionEvent; 
import javax.swing.event.ListSelectionListener; 
import javax.swing.table.DefaultTableModel; 

public class Test { 

    public static class MyTableModel extends DefaultTableModel { 
     private int count; 

     public MyTableModel() { 
      addColumn("Test"); 
     } 

     public void insertNewRow() { 
      Vector<String> rowData = createNewRowData(); 
      insertRow(0, rowData); 
     } 

     private Vector<String> createNewRowData() { 
      Vector<String> data = new Vector<String>(1); 
      data.add("Hello-" + count++); 
      return data; 
     } 

    } 

    public static void main(String[] args) { 
     SwingUtilities.invokeLater(new Runnable() { 
      @Override 
      public void run() { 
       new Test().initUI(); 
      } 
     }); 
    } 

    public void initUI() { 
     final JFrame frame = new JFrame(); 
     frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); 

     final MyTableModel model = new MyTableModel(); 
     final JTable table = new JTable(model); 
     for (int i = 0; i < 100; i++) { 
      model.insertNewRow(); 
     } 
     final JLabel label = new JLabel(); 
     JDialog dialog = new JDialog(frame, false); 
     dialog.add(label); 
     dialog.setSize(300, 50); 
     dialog.setLocation(400, 0); 
     dialog.setVisible(true); 
     table.getSelectionModel().setSelectionMode(ListSelectionModel.SINGLE_SELECTION); 
     table.getSelectionModel().addListSelectionListener(new ListSelectionListener() { 

      @Override 
      public void valueChanged(ListSelectionEvent e) { 
       final Component focused = FocusManager.getCurrentManager().getFocusOwner(); 
       int index = table.getSelectionModel().getLeadSelectionIndex(); 
       if (index > -1) { 
        Object valueAt = model.getValueAt(index, 0); 
        label.setText("Current row selected is: " + valueAt); 
       } else { 
        label.setText("No selection"); 
       } 
       label.grabFocus(); 
       if (focused != null) { 
        SwingUtilities.invokeLater(new Runnable() { 

         @Override 
         public void run() { 
          frame.toFront(); 
         } 
        }); 
       } 
      } 
     }); 
     final JScrollPane scroll = new JScrollPane(table); 
     scroll.setVerticalScrollBarPolicy(JScrollPane.VERTICAL_SCROLLBAR_AS_NEEDED); 
     frame.add(scroll); 
     frame.pack(); 
     frame.setVisible(true); 

    } 
} 
+0

ありがとう:

(フォーカスをつかむあなたのダイアログで何かがあることを自分自身を納得させるために、ラベルにgrabFocusコメント)このコードを参照してください。上記のSSCCEが問題を再現します。 – assylias

+0

@assyliasはい私はそれを見た。私はちょうどそれをコピーし、 'f.toFront()'を呼び出すことはそのように思えるようです –

+0

実際には主な違いは 'dialog.setVisible()'です。私がその行を削除すると、私は期待される動作を得ます。 – assylias

関連する問題