7

セル間に隙間がないように、swing JTable のセルの周囲の境界線を完全に削除するにはどうすればよいですか? これが私が試したことです:

table.setShowGrid(false);
table.setShowVerticalLines(false);
table.setShowHorizontalLines(false);

セルレンダラーを作成し、次を使用します。

setBorder(BorderFactory.createEmptyBorder(0,0,0,0));

個々のセルごとに。

しかし、その結果、セル間の線は削除されますが、セル間に 1 ピクセルのギャップが残ります。

4

3 に答える 3

13

セルレンダラーを作成し、次を使用します。

すべてはRendererが返すものに依存しますが、Rendererがなくても機能します

  • setIntercellSpacing()

  • setShowGrid()

ここに画像の説明を入力

import java.awt.*;
import javax.swing.*;
import javax.swing.table.DefaultTableModel;

public class TableExample {

    public TableExample() {
        Object[][] data1 = new Object[50][5];
        for (int i = 0; i < data1.length; i++) {
            data1[i][0] = "Company # " + (i + 1);
            for (int j = 1; j < data1[i].length; j++) {
                data1[i][j] = "" + (i + 1) + ", " + j;
            }
        }
        String[] headers = {"Col 1", "Col 2", "Col 3", "Col 4", "Col 5"};
        DefaultTableModel model1 = new DefaultTableModel(data1, headers);
        final JTable jTable3 = new TableBackroundPaint0(data1, headers);
        //final JTable jTable3 = new JTable(data1, headers);
        jTable3.setSelectionMode(ListSelectionModel.SINGLE_SELECTION);
        jTable3.setModel(model1);
        final JScrollPane sp3 = new JScrollPane();
        sp3.setViewportView(jTable3);
        jTable3.setIntercellSpacing(new Dimension(0, 0));
        jTable3.setShowGrid(false);
        //jTable3.setPreferredScrollableViewportSize(jTable3.getPreferredSize());
        JFrame frame = new JFrame("tableSelection");
        frame.add(sp3);
        frame.setSize(new Dimension(600, 200));
        //frame.pack();
        frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        frame.setVisible(true);
    }

    public static void main(String[] args) {
        SwingUtilities.invokeLater(new Runnable() {

            @Override
            public void run() {
                TableExample te = new TableExample();
            }
        });
    }
}

class TableBackroundPaint0 extends JTable {

    private static final long serialVersionUID = 1L;

    TableBackroundPaint0(Object[][] data, Object[] head) {
        super(data, head);
        setOpaque(false);
        ((JComponent) getDefaultRenderer(Object.class)).setOpaque(false);
    }

    @Override
    public void paintComponent(Graphics g) {
        Color background = new Color(168, 210, 241);
        Color controlColor = new Color(230, 240, 230);
        int width = getWidth();
        int height = getHeight();
        Graphics2D g2 = (Graphics2D) g;
        Paint oldPaint = g2.getPaint();
        g2.setPaint(new GradientPaint(0, 0, background, width, 0, controlColor));
        g2.fillRect(0, 0, width, height);
        g2.setPaint(oldPaint);
        for (int row : getSelectedRows()) {
            Rectangle start = getCellRect(row, 0, true);
            Rectangle end = getCellRect(row, getColumnCount() - 1, true);
            g2.setPaint(new GradientPaint(start.x, 0, controlColor, (int) ((end.x + end.width - start.x) * 1.25), 0, Color.orange));
            g2.fillRect(start.x, start.y, end.x + end.width - start.x, start.height);
        }
        super.paintComponent(g);
    }
}
于 2012-04-23T06:20:05.193 に答える
2

境界線の色をセルの背景色に設定するだけです。また、これらの例をご覧ください。

http://www.java2s.com/Code/Java/Swing-Components/CellBorderTableExample.htm

http://www.esus.com/docs/GetQuestionPage.jsp?uid=1290

于 2012-04-23T05:46:22.870 に答える
2

列モデルが自動生成されていない場合 (データ バインディングなし)、グリッドを削除するために JTable でこれらのメソッドを使用できます。

 setShowGrid(false);
 setRowMargin(0);
 setShowVerticalLines(false);
 setShowHorizontalLines(false);

しかし、データ バインディングを使用して列モデルを作成した場合は、問題が発生します。つまり、これらのメソッドを呼び出しても、各列のマージンに 1 ピクセルのギャップが白くペイントされます。

カスタム DefaultTableColumnModel を使用して、その列マージンを削除できます。

 private class CustomDefaultTableColumnModel extends DefaultTableColumnModel{

 @Override
 public void setColumnMargin(int newMargin) {
    //Always set ColumnMargin to zero.
    //Because after the column data binding its internally set one as ColumnMargin.
   //That course to paint white color grid.
   //To stop we override the setColumnMargin and pass zero to ColumnMargin.
  super.setColumnMargin(0);
  }
}

次に、カスタム テーブル カラム モデルをテーブルに追加できます。

 setColumnModel(new CustomDefaultTableColumnModel());
于 2016-07-11T10:36:54.950 に答える