java - 如何使 JTable 列不包含 JTextFields,而是包含 JTextAreas?

标签 java swing jtable textarea awt

请告诉我,如何使 JTable 列包含 JTextAreas, 所以当用户键入大量文本时,单元格的高度会增加 我们可以看到不止一行(单元格被扩展;结果,行也会扩展)

最佳答案

您需要基于JTextArea 编写自己的单元格渲染器和编辑器:

    public class Start
{
    public static class JTextPaneCellEditor extends AbstractCellEditor implements TableCellEditor, KeyListener
    {
        private JViewport viewport;
        private JTable table;
        private int row;
        private JTextPane pane;

        public JTextPaneCellEditor(){
            viewport = new JViewport();
            pane = new JTextPane();
            viewport.add(pane);
            pane.addKeyListener(this);
        }

        @Override public Object getCellEditorValue(){
            return pane.getText();
        }

        @Override public Component getTableCellEditorComponent(JTable table, Object value, boolean isSelected, int row, int column){
            this.table = table;
            this.row = row;
            pane.setText(value.toString());
            int newHeight = (int)pane.getPreferredSize().getHeight();
            if(table.getRowHeight(row) < newHeight){
                table.setRowHeight(row, newHeight);
            }
            return pane;
        }

        @Override public boolean isCellEditable(EventObject e){
            if (e instanceof MouseEvent) {
                return ((MouseEvent)e).getClickCount() >= 2;
            }
            return true;
        }

        @Override public void keyTyped(KeyEvent e){
            table.setRowHeight(row, (int)pane.getPreferredSize().getHeight());
        }

        @Override public void keyPressed(KeyEvent e){
            if(e.getKeyCode() == KeyEvent.VK_ENTER){
                stopCellEditing();
            }
        }

        @Override public void keyReleased(KeyEvent e){
        }
    }

    private static class JTextPaneCellRenderer extends JViewport implements TableCellRenderer
    {
        JTextPane pane;
        JTextPaneCellRenderer(){
            pane = new JTextPane();
            add(pane);
        }

        @Override public Component getTableCellRendererComponent(JTable table, Object value, boolean isSelected, boolean hasFocus, int row, int column){
            pane.setText(value.toString());
            table.setRowHeight(row, (int)pane.getPreferredSize().getHeight());
            return this;
        }
    }

    public static void main(String[] args){
        JTable table = new JTable(new String[][]{{"String String String String StringString String String String StringString String String String StringString String String String StringString String String String String"}, {"String 2"}}, new String[]{"Column"});
        table.setDefaultRenderer(Object.class, new JTextPaneCellRenderer());
        table.setDefaultEditor(Object.class, new JTextPaneCellEditor());

        JFrame test = new JFrame();
        test.add(new JScrollPane(table));
        test.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        test.setSize(300, 300);
        test.setLocationRelativeTo(null);
        test.setVisible(true);
    }
}

编辑:添加视口(viewport)以获得更好的尺寸。但该行在第一次编辑时仍未展开。有人有什么想法吗?

EDIT2:我同意这些评论。你想要的东西是可能的,但你需要未经测试的、hackish 的自定义实现。如果您重新设计布局以排除此类 JTable 魔法,您会过得更好。

关于java - 如何使 JTable 列不包含 JTextFields,而是包含 JTextAreas?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/10306164/

相关文章:

java - 带有 StepScope 注释的 PoiItemReader 不读取 Excel 文件

java - 执行其他任务后将字符串 append 到 JText 区域

java - 按下按钮时图像更改Java

java - JTable 中图像的 html 问题

java - 防止 WSDL 生成包含某些字段

java - 嵌套的 JSON 对象反序列化为 JSONObject

Java 在两个类之间无缝传递值

java - 如何通过按钮将一个JFrame的所有数据传输到另一个JFrame?

java - 无法选择复选框——它们是可编辑的! Java Swing

Java - JScrollPane 与 JTable 不一致