【问题标题】:Default Table Model doesn't show new lines默认表模型不显示新行
【发布时间】:2013-08-06 01:39:30
【问题描述】:

您好,我想在 DefaultTableModel 中显示新行,但我不知道为什么表格不显示输入。 如何启用输入?如果我有一个字符串“stss\nsdd”,它会显示“stsssdd”,但我想要换行。

public class Main extends JFrame {

    DefaultTableModel model = new DefaultTableModel(
            new Object[][]{{"some", "text"}, {"any", "text"},
                {"even", "more"}, {"text", "str\nings"},
                {"and", "other"}, {"text", "values"}}, new Object[]{
                "Column 1", "Column 2"});

    public Main() {
        setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);    
        JTable table = new JTable(model);
        table.setRowHeight(40);
        getContentPane().add(new JScrollPane(table), BorderLayout.CENTER);
        pack();
    }

    public static void main(String arg[]) {
        new Main().setVisible(true);
    }
}

【问题讨论】:

  • 如果您需要添加新行,请查看此处stackoverflow.com/questions/3549206/how-to-add-row-in-jtable
  • 不是新行。单元格中的新行
  • @Luffy 这是因为 DefaultTableCellRenderer 扩展了 JLabel 不处理 \n。可以尝试定义自己的渲染器吗:)
  • 还有其他的 Table 模型可以处理新行吗?

标签: java swing jtable tablecellrenderer tablecelleditor


【解决方案1】:

这是因为 DefaultTableCellRenderer 使用 JLabel 作为组件来绘制单元格。并且标签不能有新行。您必须使用自己的 TableCellRenderer,它使用接受新行的 TextComponent,例如 JTextArea。

final JTextArea textArea = new JTextArea(); // or static field
//...
table.setDefaultRenderer(Object.class, new TableCellRenderer()
{
    @Override
    public Component getTableCellRendererComponent(JTable table, Object value, boolean isSelected, boolean hasFocus, int row, int column)
    {
        textArea.setText(value.toString());
        return textArea;
    }

});

尝试复制并粘贴几行文本,看看效果如何。现在您可能想要更改 cellEditor 并阻止 Enter 键完成编辑,以便可以使用它在单元格中写入新行。

【讨论】:

  • +1 用于自定义渲染器,-1 用于在每次调用时创建新组件
  • @kleopatra true,这就是为什么 DefaultTableCellRenderer is 也是一个 JLabel 并且在其实现中设置其文本并简单地返回 this
  • 实际上 .. 不:DTCR 是一个 JLabel 是一个设计事故,不应该重复(因为你正确地不这样做:) 不扩展不是不重复使用同一个实例的理由一个渲染组件。
  • ehh .. 这样做怎么样(而不是添加评论)?只需将行移出方法即可:-)
  • 要让它在所有情况下都能正常工作,需要做很多改变。我将搜索不同的表。
【解决方案2】:

我这样做很简单

JLabel l = new JLabel("<html>Hello World!<br>blahblahblah</html>", SwingConstants.CENTER)

【讨论】:

  • 我只使用字符串 "Hello World!
    blahblahblah" 这只是一个例子。 JLabel 可以解释 Html 并且它可以工作,除了我需要正确设置宽度。
  • 你的意思是你的模型中有 html-text 作为数据?
  • 是的,我改成了 html-text。
  • 好吧,这是可能的 - 将所有数据保存为 html 可能有点不方便 :-)
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2022-01-23
  • 2016-12-12
  • 2019-04-30
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多