我有:
JTable
,嵌入JScrollPane
,其中包含项目列表JPanel
的{{1}},显示与所选商品相关的信息代码按预期工作(信息得到更新),但JDialog
失去焦点,JTable
每次更改选择时都会获得焦点。所以我添加了JDialog
,但table.requestFocusInWindow
仍然失去焦点,尽管调用返回true。
如何确保JTable
更新,但JDialog
不会失去焦点?
ps:我的最终目标是能够使用箭头(向上/向下)浏览表格并查看JDialog中的信息更新 - 目前,我需要点击行来执行此操作。
修改
请参阅下面一个复制我的问题的SSCCE(当选择被更改但焦点丢失时,JDialog的内容会发生变化)。
JTable
答案 0 :(得分:1)
你的对话框中必须有一些东西可以抓住焦点,因为我已经尝试过使用JLabel并且不会造成任何问题。如果您需要解决此问题,可以随时在JTable父框架上调用toFront()
。如果它对您的案例没有帮助,请尝试修改此SSCCE以重现您的问题。
查看此代码(在标签上注释grabFocus以说服自己,对话框中有一些东西可以抓住焦点):
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);
}
}