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
String Model,Brand,Seri
Your for loop is incorrectly close :
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()}); }
So, without doing anything special, I can make <html>...<br>...</html>
work just fine...
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.
So, given a bunch of "disconnected" values, it's the TableModel
which is going to "sew" them together, based on your requirements.
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
.
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