java - Jtable外观: How to write a code with jtable properties that can be use to multiple jtables to have a similar appearance?

标签 java swing user-interface properties jtable

我正在处理一个包含 5 个表的简单 CRUD,我已经更改了 Table_1 的属性,例如(背景颜色、前景色、行高等)。我想要的是我的 Table_2、Table_3 和其他表看起来像 Table_1。

我尝试创建自定义 TableCellRenderer 这是我的代码:

package com.table.design.Default;

import java.awt.Color;
import java.awt.Component;
import java.awt.Font;
import java.util.Hashtable;
import java.util.Map;
import javax.swing.BorderFactory;
import javax.swing.JScrollPane;
import javax.swing.JTable;
import javax.swing.SwingConstants;
import javax.swing.table.DefaultTableCellRenderer;
import javax.swing.table.TableCellRenderer;


public class StrippedTable implements TableCellRenderer {

    private TableCellRenderer mWrappedRenderer;

    public StrippedTable(TableCellRenderer pWrappedRenderer) {
        mWrappedRenderer = pWrappedRenderer;
   DefaultTableCellRenderer DEFAULT_RENDERER = new DefaultTableCellRenderer();

}

public Component getTableCellRendererComponent(JTable pTable, Object pValue, boolean pIsSelected,
            boolean pHasFocus, int pRow, int pColumn) {

        Component c = mWrappedRenderer.getTableCellRendererComponent(pTable, pValue, pIsSelected, pHasFocus,
                pRow, pColumn);
        if ( pTable.isCellSelected(pRow, pColumn) == false ) {
            c.setBackground(colorForRow(pRow));
//            c.setForeground(UIManager.getColor("Table.foreground"));
        } else {
//            c.setBackground(new java.awt.Color(242, 242, 242));
//            c.setForeground(UIManager.getColor("Table.selectionForeground"));
        }
//      setting global table properties
            pTable.setRowHeight(45);
            pTable.setShowVerticalLines(false);

        return c;
    }

    protected Color colorForRow(int row) {
        return (row % 2 == 0) ? new java.awt.Color(245, 245, 245) : Color.WHITE;
    }
}

添加代码可以吗

//      setting global table properties
            pTable.setRowHeight(45);
            pTable.setShowVerticalLines(false);

public Component getTableCellRendererComponent(JTable pTable, Object pValue, boolean pIsSelected,
            boolean pHasFocus, int pRow, int pColumn) {

        Component c = mWrappedRenderer.getTableCellRendererComponent(pTable, pValue, pIsSelected, pHasFocus,
                pRow, pColumn);
        if ( pTable.isCellSelected(pRow, pColumn) == false ) {
            c.setBackground(colorForRow(pRow));
//            c.setForeground(UIManager.getColor("Table.foreground"));
        } else {
//            c.setBackground(new java.awt.Color(242, 242, 242));
//            c.setForeground(UIManager.getColor("Table.selectionForeground"));
        }

//      setting global table properties
            pTable.setRowHeight(45);
            pTable.setShowVerticalLines(false);

        return c;

}

因为它正在工作..并且我使用此代码来使我的表具有相同的属性

TableModel s = (DefaultTableModel) jTable1.getModel();

        StrippedTable cellRenderer = new StrippedTable(jTable1.getDefaultRenderer(Object.class));      
        jTable1.setDefaultRenderer(Object.class, cellRenderer);

非常感谢!!

--------已编辑------

我工作了另一个扩展 jtable 的类,


package com.table.design;

import java.awt.Color;
import java.awt.Component;
import java.awt.Dimension;
import java.awt.Font;
import java.awt.event.MouseEvent;
import javax.swing.BorderFactory;
import javax.swing.JLabel;
import javax.swing.JScrollPane;
import javax.swing.JTable;
import javax.swing.event.MouseInputAdapter;
import javax.swing.table.TableCellRenderer;
import javax.swing.table.TableModel;

public class CustomTable extends JTable {

     public CustomTable(TableModel model, JScrollPane scrollpane) {
        super(model);
        getTableHeader().setDefaultRenderer(new customHeaderRenderer());
        customTableProperties(scrollpane);
    }

    @Override
    public Component prepareRenderer(TableCellRenderer renderer, int row, int column) {


        Component c = super.prepareRenderer(renderer, row, column);
        if (isCellSelected(row, column) == false) {
            c.setBackground(colorForRow(row));
        }

        return c;
    }

    protected Color colorForRow(int row) {
        return (row % 2 == 0) ? new java.awt.Color(245, 245, 245) : Color.WHITE;
    }

    private void customTableProperties(JScrollPane sp) {

        setForeground(new java.awt.Color(100, 100, 100));
        setShowVerticalLines(false);
        setFont(new Font("Open Sans", Font.PLAIN, 14));
        setIntercellSpacing(new java.awt.Dimension(0, 0));
        setSelectionBackground(new java.awt.Color(242, 242, 242));
        setGridColor(new java.awt.Color(240, 240, 240));
        setSelectionMode(javax.swing.ListSelectionModel.SINGLE_SELECTION);
        setRowHeight(45);
        setCursor(new java.awt.Cursor(java.awt.Cursor.HAND_CURSOR));
        setBorder(BorderFactory.createEmptyBorder());
        setRowSelectionAllowed(false);
        setFocusable(false);
        setAutoCreateRowSorter(true);
        /**
         * *** JscrollPane*******
         */
        sp.setBorder(BorderFactory.createEmptyBorder());
        sp.getViewport().setBackground(Color.decode("#FFFFFF"));
        sp.setOpaque(false);


    }

    /**
     * Code for JtableHeaderRenderer
     *
     */
    public class customHeaderRenderer extends JLabel implements TableCellRenderer {

        public customHeaderRenderer() {

            setAutoCreateRowSorter(true);
            setAutoResizeMode(0);
            setFont(new Font("Open Sans", Font.BOLD, 15));
            setForeground(new java.awt.Color(95, 95, 95));
            setOpaque(false);
            getTableHeader().setBackground(new java.awt.Color(255, 255, 255));
            setPreferredSize(new Dimension(this.getWidth(), 65));
            getTableHeader().setReorderingAllowed(false);
            getTableHeader().setBorder(BorderFactory.createMatteBorder(1, 0, 2, 0, new java.awt.Color(235, 235, 235)));
        }

        @Override
        public Component getTableCellRendererComponent(JTable table, Object value,
                boolean isSelected, boolean hasFocus, int row, int column) {
            setText(value.toString());
            return this;
        }

    }


}

然后我会这样调用该表

private static CustomTable customTable;
private DefaultTableModel tbm;

tbm = (DefaultTableModel) customTable.getModel();
customTable = new CustomTable (tbm, /*Jscrollpane*/);

我上面的代码正确吗?

最佳答案

从单元格渲染器修改父组件的外观通常是不好的做法(主要是因为每次单元格更新发生时都会调用它们,如 this thread 中所述)。

对于您的情况,我只需创建另一个类,该类使用一个构造函数扩展 JTable,该构造函数调用所需 super 构造函数,然后应用所需的更改。

你的新类看起来像这样:

import javax.swing.*;

public class JCustomTable extends JTable {
    public JCustomTable(/* parameters of your desired JTable constructor */){
        super(/* parameters of your desired JTable constructor */);
        //setting desired global table properties
        setRowHeight(45);
        setShowVerticalLines(false);
    }
}

现在只需使用 JCustomTable 或任何您想在通常使用 JTable 对象时调用的名称即可。

<小时/>

与第一种情况非常相似,从另一个对象中修改其他对象并不是一个好的做法。在这种情况下,最好为自定义表的构造函数留下这样的指纹(为了提高清晰度,我在第一部分中添加了一些单词):

CustomTable(TableModel)

JScrollPane 设置可以再次以与 JCustomTable 相同的方式完成,以便保持代码面向对象且总体上更清晰。

关于java - Jtable外观: How to write a code with jtable properties that can be use to multiple jtables to have a similar appearance?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/57073821/

相关文章:

java - 如何让GridBagLayout定位左上角

java - jTable beans绑定(bind)

.net - 哪种编程语言最容易(对于用户)用作集成脚本语言?

java - 我的 GUI 中使用 ActionListener 时出现错误

java - 无法设置 app.js 的正确路径

java - 如何调用一个 java 类,该类使用 Process-Builder 打开 CLI 并读取/写入其输入/输出流? wrapper ?适配器?

java - 在 Java 中将 JDom 文档转换为 SOAPMessage

Java Swing JTextArea 行号

python - 如何在 PySide 中正确使用 multiprocessing.Pool 来创建非阻塞 GUI

java - 在android中使用数组的帮助