簡體   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