[英]How to control height of ComboBox Editor within a JTable with large row height?
我有一個JTable,其中的一列中需要ComboBox編輯器,而另一列中需要TextArea。
當輸入的TextArea包含多行文本時,我正在成功調整行高的大小,但是,當使用ComboBox編輯器(在同一行中)選擇單元格時,ComboBox下拉列表看起來有點“垂直拉伸”,即它填滿了整個行高。
這就是它的樣子,還是有某種方法可以設置ComboBox的下拉標記的最大或首選高度,所以無論行高如何,所有行都一樣?
下面將對此進行演示(感謝JavaSpecialists的Heinz博士 )
import java.awt.Dimension;
import java.util.Vector;
import javax.swing.DefaultCellEditor;
import javax.swing.JComboBox;
import javax.swing.JFrame;
import javax.swing.JScrollPane;
import javax.swing.JTable;
import javax.swing.table.DefaultTableCellRenderer;
import javax.swing.table.TableCellEditor;
import javax.swing.table.TableColumnModel;
public class ComboAndTextAreaTest extends JFrame {
private final JTable table = new JTable(10, 2);
public ComboAndTextAreaTest() {
super(System.getProperty("java.vm.version"));
Vector boxVals = new Vector();
boxVals.add("First");
boxVals.add("Second");
boxVals.add("Third");
final JComboBox box = new JComboBox(boxVals);
box.setSelectedIndex(0);
final TableCellEditor boxEditor = new DefaultCellEditor(box);
box.setPreferredSize(new Dimension());
TableColumnModel cmodel = table.getColumnModel();
// First column is ComboBox based
cmodel.getColumn(0).setCellRenderer(new DefaultTableCellRenderer());
cmodel.getColumn(0).setCellEditor(boxEditor);
// Second column is Text Area
cmodel.getColumn(1).setCellRenderer(new TextAreaRenderer());
cmodel.getColumn(1).setCellEditor(new TextAreaEditor());
// The following doesn't appear to have any effect
int cw = cmodel.getColumn(0).getPreferredWidth();
Dimension pd = new Dimension(cw, 18);
box.setMaximumSize(pd);
String test = "The quick brown fox jumps over the lazy dog.";
for (int row = 0; row < 10; row++) {
table.setValueAt(boxVals.get(row % 3), row, 0);
table.setValueAt(test, row, 1);
}
test = test + "\n" + test + test + test + "\n" + test + test;
table.setValueAt(test, 4, 1);
getContentPane().add(new JScrollPane(table));
setSize(600, 600);
setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
setVisible(true);
}
public static void main(String[] args) {
new ComboAndTextAreaTest();
}
}
編輯:為清楚起見(以下有關渲染器的評論),以下內容進行了稍微修改的示例,刪除了定制的TextArea處理。 這個問題也適用於這種情況。
和以下代碼:
import java.util.Vector;
import javax.swing.DefaultCellEditor;
import javax.swing.JComboBox;
import javax.swing.JFrame;
import javax.swing.JScrollPane;
import javax.swing.JTable;
import javax.swing.JTextField;
import javax.swing.table.DefaultTableCellRenderer;
import javax.swing.table.TableCellEditor;
import javax.swing.table.TableColumnModel;
public class ComboAndTextAreaTest extends JFrame {
private final JTable table = new JTable(10, 2);
public ComboAndTextAreaTest() {
super(System.getProperty("java.vm.version"));
Vector boxVals = new Vector();
boxVals.add("First");
boxVals.add("Second");
boxVals.add("Third");
final JComboBox box = new JComboBox(boxVals);
box.setSelectedIndex(0);
final TableCellEditor boxEditor = new DefaultCellEditor(box);
TableColumnModel cmodel = table.getColumnModel();
// First column is ComboBox based
cmodel.getColumn(0).setCellRenderer(new DefaultTableCellRenderer());
cmodel.getColumn(0).setCellEditor(boxEditor);
cmodel.getColumn(0).setMaxWidth(100);
// Second column is just text field
cmodel.getColumn(1).setCellRenderer(new DefaultTableCellRenderer());
cmodel.getColumn(1).setCellEditor(new DefaultCellEditor(new JTextField()));
cmodel.getColumn(1).setPreferredWidth(200);
String test = "The quick brown fox jumps over the lazy dog.";
for (int row = 0; row < 10; row++) {
table.setValueAt(boxVals.get(row % boxVals.size()), row, 0);
table.setValueAt(test, row, 1);
}
// special processing on row 4 to show row height and affect on combobox
String test2 = "This row set with greater height - combo drop down in prev cell affected during edit";
table.setValueAt(test2, 4, 1);
table.setRowHeight(4, 50);
getContentPane().add(new JScrollPane(table));
setSize(600, 600);
setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
setVisible(true);
}
public static void main(String[] args) {
new ComboAndTextAreaTest();
}
}
@kleopatra(在問題評論中)回答問題“這到底是怎么回事?” 基本上將其回答為“ ... [是],編輯器的大小總是與單元格的大小相同,(幾乎沒有,除非有非常骯臟的技巧:-)對此您無能為力。解決方法可能是自定義編輯器,例如包含該組合的面板。盡管如此,其中涉及一些工作。”
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.