繁体   English   中英

如何在具有较大行高的JTable中控制ComboBox编辑器的高度?

[英]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处理。 这个问题也适用于这种情况。

JTable中的JComboBox编辑器

和以下代码:

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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM