Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/391.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 默认表格模型不使用';不显示新行_Java_Swing_Jtable_Tablecellrenderer_Tablecelleditor - Fatal编程技术网

Java 默认表格模型不使用';不显示新行

Java 默认表格模型不使用';不显示新行,java,swing,jtable,tablecellrenderer,tablecelleditor,Java,Swing,Jtable,Tablecellrenderer,Tablecelleditor,嗨,我想在DefaultTableModel中显示新行,但我不知道为什么表格不显示输入。 如何启用输入?如果我有一个字符串“stss\nsdd”,它会显示“stsssdd”,但我需要新行 public class Main extends JFrame { DefaultTableModel model = new DefaultTableModel( new Object[][]{{"some", "text"}, {"any", "text"},

嗨,我想在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);
    }
}

这是因为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键完成编辑,以便可以使用它在单元格中写入新行。

我用一种简单的方法完成了这一操作

JLabel l = new JLabel("<html>Hello World!<br>blahblahblah</html>", SwingConstants.CENTER)
JLabel=newjlabel(“你好,世界!
blahblahblah”,SwingConstants.CENTER)
如果需要添加新行,请查看此处,而不是新行。新线cell@Luffy这是因为
DefaultTableCellRenderer
扩展了
JLabel
,它不处理
\n
。您可以尝试定义自己的渲染器:)是否有其他表格模型处理新行?+1用于自定义渲染器,-1用于在每个渲染器上创建新组件call@kleopatra没错,这就是为什么DefaultTableCellRenderer也是一个JLabel,在它的实现中设置文本并简单地返回
这个
。。否:DTCR是一个JLabel是一个不应该重复的设计事故(正如您正确地指出的:)不扩展不是不重复使用渲染组件的同一实例的理由。ehh。。直接做(而不是添加评论)怎么样?只需将该行移出该方法,您就可以了:-)要使其在所有情况下都能正确工作,有很多事情需要更改。我将搜索不同的表。我只使用字符串“Hello World!
blahblahblah”,这是唯一的示例。JLabel可以解释Html,除了我需要正确设置宽度外,它可以工作。你是说你的模型中有Html文本作为数据吗?是的,我改为Html-text。好的,这是可能的-可能会有点不方便将所有数据保留为Html:-)