Это пример JTable
с пользовательскими границами строк - для определенных строк. Эти конкретные строки определяются данными в строках таблицы.
В примере используется JTable
с пользовательским средством визуализации - CustomBorderRenderer
класс, который расширяет javax.swing.table.DefaultTableCellRenderer
. В этом примере приложения есть два класса: TableCellRendererTester.java
и CustomBorderRenderer.java
.
Ниже приведено изображение таблицы с настраиваемой рамкой для конкретной строки, где значением года является «2012». Ниже приведен исходный код двух классов.
Пример кода :
import java.awt.Dimension;
import javax.swing.JFrame;
import javax.swing.JPanel;
import javax.swing.JScrollPane;
import javax.swing.JTable;
import javax.swing.table.DefaultTableModel;
public class TableCellRendererTester {
private static final Object[] TABLE_COLUMNS = {"Book", "Author", "Year"};
private static final Object [][] TABLE_DATA = {
{"Book 1", "author 1", "1972"}, {"Book 2", "author 1", "1945"},
{"Book 3", "author 2", "2012"}, {"Book 4", "author 3", "1999"}
};
public static void main(String [] args) {
new TableCellRendererTester().createAndShowGUI();
}
public void createAndShowGUI() {
JFrame frame = new JFrame("Table Custom Row Border Tester");
frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
frame.add(getTablePanel());
frame.pack();
frame.setLocationRelativeTo(null);
frame.setVisible(true);
}
private JPanel getTablePanel() {
DefaultTableModel model = new DefaultTableModel(TABLE_DATA, TABLE_COLUMNS);
JTable table = new JTable(model);
table.setRowHeight(30);
CustomBorderRenderer renderer = new CustomBorderRenderer();
table.setDefaultRenderer(Object.class, renderer);
JScrollPane scrollpane = new JScrollPane(table);
scrollpane.setPreferredSize(new Dimension(400, 150));
scrollpane.setViewportView(table);
JPanel panel = new JPanel();
panel.add(scrollpane);
return panel;
}
}
Класс рендерера :
import java.awt.Color;
import java.awt.Component;
import javax.swing.JTable;
import javax.swing.JComponent;
import javax.swing.BorderFactory;
import javax.swing.border.Border;
import javax.swing.table.TableModel;
import javax.swing.table.DefaultTableCellRenderer;
public class CustomBorderRenderer extends DefaultTableCellRenderer {
private int prevRow;
private boolean customBorderFlag;
@Override
public Component getTableCellRendererComponent(JTable table, Object value,
boolean isSelected, boolean hasFocus, int row, int column) {
JComponent c = (JComponent) super.getTableCellRendererComponent(table,
value, isSelected, hasFocus, row, column);
if (row != prevRow) {
// Row has changed.
// Store it so that all the columns can be rendered
// with the custom border - if condition is met.
customBorderFlag = false;
prevRow = row;
TableModel m = table.getModel();
String s = (String) m.getValueAt(row, 2);
// Check if the row needs to be rendered with a custom border.
if (s.equals("2012")) {
customBorderFlag = true;
}
}
if (customBorderFlag) {
// Set custom border for all column cells - for a row.
c.setBorder(getCustomBorder());
}
return c;
}
/*
* Returns a custom border with:
* 1. Thick border
* 2. A margin between cell content (text) and the border.
*/
private Border getCustomBorder() {
Border insideMargin = BorderFactory.createEmptyBorder(10, 10, 10, 10);
Border thickBorder = BorderFactory.createLineBorder(Color.BLACK, 3);
Border borderWithMargin =
BorderFactory.createCompoundBorder(thickBorder, insideMargin);
return borderWithMargin;
}
}
РЕДАКТИРОВАТЬ : обновлены изображение и класс CustomBorderRenderer.java
для отображения настраиваемой границы с полем .