Установить поле и пользовательскую границу определенной строки для JTable - PullRequest
0 голосов
/ 18 сентября 2018

Как я могу установить поле определенной строки в JTable по номеру строки?

Пожалуйста, обратитесь к иллюстрации ниже, которую я сделал с помощью Excel.

enter image description here


Кроме того, я хочу толстую границу и невидимую границу

Ответы [ 2 ]

0 голосов
/ 18 сентября 2018

Это пример JTable с пользовательскими границами строк - для определенных строк. Эти конкретные строки определяются данными в строках таблицы.

В примере используется JTable с пользовательским средством визуализации - CustomBorderRenderer класс, который расширяет javax.swing.table.DefaultTableCellRenderer. В этом примере приложения есть два класса: TableCellRendererTester.java и CustomBorderRenderer.java.

Ниже приведено изображение таблицы с настраиваемой рамкой для конкретной строки, где значением года является «2012». Ниже приведен исходный код двух классов.

enter image description here


Пример кода :

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 для отображения настраиваемой границы с полем .

0 голосов
/ 18 сентября 2018

JTable имеет метод setRowHeight(...), который позволит вам увеличить высоту отдельных строк.

Что касается границы, вы можете проверить Рендеринг таблицы строк . Он демонстрирует, как переопределить prepareRenderer(...) метод JTable для использования пользовательского Border.

...