简体   繁体   English

Java-Swing 在 jtable 的单元格中添加多行

[英]Java-Swing adding multiple lines in jtable's cell

i would like to insert multiple strings in the same cell in a jtable line by line.This is the way i added the data into jtable我想在 jtable 的同一个单元格中逐行插入多个字符串。这是我将数据添加到 jtable 的方式

       String Model,Brand,Serial;

       String itemdetails=Model+Brand+Serial

       model.addRow(new Object[]{itemdetails,amountText.getText()});

Here what the problem is,getting the output in single line,But i want output like this in a jtbale's cell.这里的问题是,在单行中获取输出,但我希望在 jtbale 的单元格中输出这样的输出。

      Model                    //it is string coming from database
      Brand                      //it is string coming from database
      Serial                   //it is string coming from database

i have tried this but its working only data within double quotes,not with strings.我试过这个,但它只工作在双引号内的数据,而不是字符串。

                  "<html>lineOne <br/> lineTwo </html>"   

So, without doing anything special, I can make <html>...<br>...</html> work just fine...因此,无需做任何特别的事情,我就可以让<html>...<br>...</html>正常工作...

多线

import java.awt.Dimension;
import java.awt.EventQueue;
import java.awt.Graphics;
import java.awt.Graphics2D;
import java.awt.GridBagLayout;
import javax.swing.JFrame;
import javax.swing.JPanel;
import javax.swing.JScrollPane;
import javax.swing.JTable;
import javax.swing.UIManager;
import javax.swing.UnsupportedLookAndFeelException;
import javax.swing.table.DefaultTableModel;

public class Test {

    public static void main(String[] args) {
        new Test();
    }

    public Test() {
        EventQueue.invokeLater(new Runnable() {
            @Override
            public void run() {
                try {
                    UIManager.setLookAndFeel(UIManager.getSystemLookAndFeelClassName());
                } catch (ClassNotFoundException | InstantiationException | IllegalAccessException | UnsupportedLookAndFeelException ex) {
                    ex.printStackTrace();
                }

                JFrame frame = new JFrame("Testing");
                frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
                frame.add(new TestPane());
                frame.pack();
                frame.setLocationRelativeTo(null);
                frame.setVisible(true);
            }
        });
    }

    public class TestPane extends JPanel {

        public TestPane() {
            DefaultTableModel model = new DefaultTableModel(0, 1);
            model.addRow(new String[]{
                "<html>My teacher took my iPod.<br>She said they had a rule;<br>I couldn't bring it into class<br>or even to the school.</html>"
            });
            model.addRow(new String[]{
                "<html>She said she would return it;<br>I'd have it back that day.<br>But then she tried my headphones on<br>and gave a click on Play.</html>"
            });
            model.addRow(new String[]{
                "<html>She looked a little startled,<br>"
                + "but after just a while<br>"
                + "she made sure we were occupied<br>"
                + "and cracked a wicked smile.<br>"
            });
            model.addRow(new String[]{
                "<html>Her body started swaying.<br>"
                + "Her toes began to tap.<br>"
                + "She started grooving in her seat<br>"
                + "and rocking to the rap.</html>"
            });
            model.addRow(new String[]{
                "<html>My teacher said she changed her mind.<br>"
                + "She thinks it's now okay<br>"
                + "to bring my iPod into class.<br>"
                + "She takes it every day.</html>"
            });

            setLayout(new GridBagLayout());

            JTable table = new JTable(model);
            table.setRowHeight(75);
            add(new JScrollPane(table));

        }

    }

}

Maybe there's something else in your code, which you're not showing us, which is causing the problem...也许您的代码中还有其他内容,您没有向我们展示,这导致了问题......

Updated with "dynamic" example更新了“动态”示例

This is going past the original question, BUT, the TableModel represents the data it's backing, it provides the structure for the JTable to show it.这已经超越了最初的问题,但是, TableModel表示它支持的数据,它提供了JTable的结构来显示它。

So, given a bunch of "disconnected" values, it's the TableModel which is going to "sew" them together, based on your requirements.因此,给定一堆“断开连接”的值, TableModel将根据您的要求将它们“缝合”在一起。

The following example simple splits each line of the previous poem in a an array, when each line represents a element.下面的示例简单地将上一首诗的每一行拆分为一个数组,其中每行代表一个元素。

This is then wrapped again so each section of the poem is an array of lines...然后再次包装,所以这首诗的每一部分都是一行行......

String data[][] = {
            {"My teacher took my iPod.", "She said they had a rule;", "I couldn't bring it into class", "or even to the school."},
            {"She said she would return it;", "I'd have it back that day.", "But then she tried my headphones on", "and gave a click on Play."}, 
            etc...

The example then uses a custom TableModel , which when asked for the value of the cell, takes the given "section" and builds a String out of each line, wrapping into a <html> based String .该示例然后使用自定义TableModel ,当询问单元格的值时,它采用给定的“部分”并从每一行中构建一个String ,包装成一个基于<html>String

Further, you need to click the Add button to add each new line before it can be displayed此外,您需要单击“添加”按钮添加每个新行,然后才能显示

动态数据

public class TestPane extends JPanel {

    private MyTableModel model;
    private int index = 0;
    public TestPane() {
        String data[][] = {
            {"My teacher took my iPod.", "She said they had a rule;", "I couldn't bring it into class", "or even to the school."},
            {"She said she would return it;", "I'd have it back that day.", "But then she tried my headphones on", "and gave a click on Play."},
            {"She looked a little startled,", "but after just a while", "she made sure we were occupied", "and cracked a wicked smile.", ""},
            {"Her body started swaying.", "Her toes began to tap.", "She started grooving in her seat", "and rocking to the rap."},
            {"My teacher said she changed her mind.", "She thinks it's now okay", "to bring my iPod into class.", "She takes it every day."}
        };

        setLayout(new BorderLayout());

        model = new MyTableModel();

        JTable table = new JTable(model);
        table.setRowHeight(75);
        add(new JScrollPane(table));

        JButton add = new JButton("Add");
        add.addActionListener(new ActionListener() {
            @Override
            public void actionPerformed(ActionEvent e) {
                if (index < data.length) {
                    model.addRow(data[index]);
                }
                index++;
                if (index >= data.length) {
                    add.setEnabled(false);
                }
            }
        });

        add(add, BorderLayout.SOUTH);
    }

    public class MyTableModel extends AbstractTableModel {

        private List<String[]> rowData;

        public MyTableModel() {
            rowData = new ArrayList<>(25);
        }

        public void addRow(String[] data) {
            rowData.add(data);
            fireTableRowsInserted(rowData.size() - 1, rowData.size() - 1);
        }

        @Override
        public int getColumnCount() {
            return 1;
        }

        @Override
        public Class<?> getColumnClass(int columnIndex) {
            return String.class;
        }

        @Override
        public Object getValueAt(int rowIndex, int columnIndex) {
            Object value = null;
            switch (columnIndex) {
                case 0:
                    String[] data = rowData.get(rowIndex);
                    StringJoiner joiner = new StringJoiner("<br>", "<html>", "</html>");
                    for (String text : data) {
                        joiner.add(text);
                    }
                    value = joiner.toString();
                    break;
            }
            return value;
        }

        @Override
        public int getRowCount() {
            return rowData.size();
        }

    }

}

Take a look at How to Use Tables for more details查看如何使用表格以获取更多详细信息

Your for loop is incorrectly close :您的 for 循环错误地关闭:

    DefaultTableModel model = (DefaultTableModel) jt.getModel();
    int i; 
    for(i=0; i<model.getRowCount(); i++){ 
    String itemdetails=model+"\n"+brand; 
    System.out.println(itemdetails);
    jt.setRowHeight(30);
    model.addRow(new Object[]{i+1,itemdetails,amountText.getText()}); }

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

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