这是我从序列化数据重建JTable
的方法:
table = new JTable(){
public boolean isCellEditable(int arg0, int arg1) {
return true;
}
};
table.addMouseListener(this);
table.addFocusListener(this);
int width = HCAConstants.hcaGuiFuzzyTableWidth;
int tableRowHeight = HCAConstants.hcaGuiFuzzyTableRowHeight;
table.putClientProperty("cancelEditOnFocusLost", Boolean.TRUE);
table.putClientProperty("terminateEditOnFocusLost", Boolean.TRUE);
table.setModel(new MBFTableModel(data[currentH.Int][currentF.Int]));
TableColumn col = table.getColumnModel().getColumn(0);
col.setPreferredWidth(width);}
table.getInputMap(JComponent.WHEN_ANCESTOR_OF_FOCUSED_COMPONENT)
.put(KeyStroke.getKeyStroke(KeyEvent.VK_TAB, 0), "none");
table.getInputMap(JComponent.WHEN_ANCESTOR_OF_FOCUSED_COMPONENT)
.put(KeyStroke.getKeyStroke(KeyEvent.VK_TAB, InputEvent.SHIFT_DOWN_MASK), "none");
table.setCellSelectionEnabled(true);
KeyStroke tab = KeyStroke.getKeyStroke(KeyEvent.VK_TAB, 0);
InputMap map = table.getInputMap(JTable.WHEN_ANCESTOR_OF_FOCUSED_COMPONENT);
map.put(tab, "selectNextRowCell");
table.getInputMap(JComponent.WHEN_ANCESTOR_OF_FOCUSED_COMPONENT)
.put(KeyStroke.getKeyStroke(KeyEvent.VK_ESCAPE, 0), "none");
table.setEnabled(true);
table.setDefaultRenderer(FuzzyDat.class,new FuzzyDatRender());
table.setDefaultEditor(FuzzyDat.class, new FuzzyDatEditor(currentF,(LoadToTable)this));
table.setDefaultRenderer(MinMax.class, new MinMaxRender());
table.setDefaultEditor(MinMax.class, new MinMaxEditor());
table.setRowSelectionAllowed(true);
table.setColumnSelectionAllowed(true);
table.setRowHeight(tableRowHeight);
我的场景是这样的:每当我第一次点击单元格的滑块时,它都没有响应;在第二次单击时,组件响应,然后滑块响应第一次单击。
如何使滑块仅与第一次点击交互,而不是最初点击两次。
DefaultCellEditor
有三个默认构造函数:JCheckBox
,JComboBox
和JTextField
;但是我需要覆盖JSlider
的这个构造函数。我怎样才能做到这一点?这有必要吗?有人建议我使用setClickCountToStart(1)
。
答案 0 :(得分:2)
也许SliderColumn
或SpinnerColumn
中的一个可能有所帮助:
SliderColumn:
import java.awt.*;
import java.util.EventObject;
import javax.swing.*;
import javax.swing.border.*;
import javax.swing.table.*;
public class SliderColumn extends AbstractCellEditor
implements TableCellEditor, TableCellRenderer {
private JSlider editSlider, renderSlider;
private Border originalBorder;
public SliderColumn(JTable table, int column) {
editSlider = new JSlider();
renderSlider = new JSlider();
originalBorder = editSlider.getBorder();
editSlider.setBorder(new LineBorder(Color.BLUE));
table.getColumnModel().getColumn(column).setCellEditor(this);
Dimension d = renderSlider.getPreferredSize();
table.setRowHeight(d.height);
}
@Override
public Object getCellEditorValue() {
return editSlider.getValue();
}
@Override
public Component getTableCellEditorComponent(JTable table, Object value,
boolean isSelected, int row, int column) {
if (value != null) {
editSlider.setValue((Integer) value);
}
return editSlider;
}
@Override
public Component getTableCellRendererComponent(JTable table, Object value,
boolean isSelected, boolean hasFocus, int row, int column) {
if (hasFocus) {
renderSlider.setBorder(new LineBorder(Color.BLUE));
} else {
renderSlider.setBorder(originalBorder);
}
if (value == null) {
renderSlider.setValue(0);
} else {
int intValue = ((Integer) value).intValue();
renderSlider.setValue(intValue);
}
return renderSlider;
}
@Override
public boolean isCellEditable(EventObject evt) {
return true;
}
public static void main(String[] args) {
javax.swing.SwingUtilities.invokeLater(new Runnable() {
@Override
public void run() {
JFrame frame = new JFrame("SpinnerColumn");
JPanel panel = new JPanel(new GridLayout(1, 1));
JTable table = new JTable(5, 1);
SliderColumn spinnerColumn = new SliderColumn(table, 0);
table.setDefaultRenderer(Object.class, spinnerColumn);
panel.add(table);
frame.setContentPane(panel);
frame.pack();
frame.setVisible(true);
frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
}
});
}
}
SpinnerColumn:
import java.awt.*;
import java.util.EventObject;
import javax.swing.*;
import javax.swing.border.*;
import javax.swing.table.*;
public class SpinnerColumn extends AbstractCellEditor implements TableCellEditor, TableCellRenderer {
private static final long serialVersionUID = 1L;
private JSpinner editSpinner, renderSpinner;
private JTable table;
private String[] list;
private Border originalBorder;
public SpinnerColumn(JTable table, int column) {
editSpinner = new JSpinner();
renderSpinner = new JSpinner();
originalBorder = editSpinner.getBorder();
editSpinner.setBorder(new LineBorder(Color.BLUE));
this.table = table;
table.getColumnModel().getColumn(column).setCellEditor(this);
}
public SpinnerColumn(String[] list, JTable table, int column) {
editSpinner = new JSpinner();
editSpinner.setModel(new SpinnerListModel(list));
renderSpinner = new JSpinner();
originalBorder = editSpinner.getBorder();
editSpinner.setBorder(new LineBorder(Color.BLUE));
this.list = list;
this.table = table;
table.getColumnModel().getColumn(column).setCellEditor(this);
}
@Override
public Object getCellEditorValue() {
return editSpinner.getValue();
}
@Override
public Component getTableCellEditorComponent(JTable table, Object value, boolean isSelected,
int row, int column) {
if (list != null) {
editSpinner.setValue(list[0]);
} else {
editSpinner.setValue(0);
}
if (value != null) {
editSpinner.setValue(value);
}
return editSpinner;
}
@Override
public Component getTableCellRendererComponent(JTable table, Object value, boolean isSelected,
boolean hasFocus, int row, int column) {
if (hasFocus) {
renderSpinner.setBorder(new LineBorder(Color.BLUE));
} else {
renderSpinner.setBorder(originalBorder);
}
// *** here's where we set the spinner's value
if (value == null) {
renderSpinner.setValue(0);
} else {
int intValue = ((Integer) value).intValue();
renderSpinner.setValue(intValue);
}
return renderSpinner;
}
@Override
public boolean isCellEditable(EventObject evt) {
return true;
}
public static void main(String[] args) {
javax.swing.SwingUtilities.invokeLater(new Runnable() {
@Override
public void run() {
JFrame frame = new JFrame("SpinnerColumn");
JPanel panel = new JPanel(new GridLayout(1, 1));
JTable table = new JTable(5, 1);
SpinnerColumn spinnerColumn = new SpinnerColumn(table, 0);
table.setDefaultRenderer(Object.class, spinnerColumn);
panel.add(table);
frame.setContentPane(panel);
frame.pack();
frame.setVisible(true);
frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
}
});
}
}
答案 1 :(得分:1)
FuzzyDatRender
或MinMaxRender
中的任何一个是否来自JSlider
尚不清楚。目前尚不清楚FuzzyDatEditor
或MinMaxEditor
中的任何一个是clickCountToStart
属性是否类似于DefaultCellEditor
中的AbstractCellEditor
属性。如果没有展示您所描述问题的sscce,我看不出如何回答这个问题。
附录:编辑问题后,我猜测延长DefaultCellEditor
会优于clickCountToStart
,以避免默认的{{1}}值。