4

PDFにJTableを描画する必要があります。この要件のために、私は JTable を取得し、pdf に直接印刷しました。しかし、JTable の Left と Top の境界線を取得できませんでした。さらに、テーブルのセル境界線をカスタマイズする必要があります。とにかく、JTable のセルに異なる色の境界線を付けることができますか? 例:-

Left Border = Grid Color
Top Border = Grid Color
Right Border = Black Color
Bottom Border =  Grid Color

これに関連する提案は非常に役立ちますか?

4

3 に答える 3

7

@andrewthompson が提供するリンクは、テーブルの境界線を印刷するという質問の最初の部分に対する回答を提供するはずです (別名、JTable ヘッダーが画像に表示されないのはなぜですか? )

テーブルで異なる色の内側の境界線を取得するには (2 番目の質問だったと思います)、 と を . と組み合わせて使用​​する必要がありMatteBorderます。CompoundBorderTableCellRenderer

import java.awt.*;
import javax.swing.*;
import javax.swing.border.Border;
import javax.swing.table.TableCellRenderer;


public class JTableColoredBorder extends Box{

    public JTableColoredBorder(){
        super(BoxLayout.Y_AXIS);

        JTable table = new JTable(5,5);
        table.setIntercellSpacing(new Dimension(0,0));//Get rid of cell spacing

        //Set your own renderer.  You'll have to set this for Number and Boolean too if you're using those
        CustomRenderer cr = new CustomRenderer(table.getDefaultRenderer(Object.class), Color.red, Color.orange, Color.pink, Color.magenta);
        table.setDefaultRenderer(Object.class, cr);

        add(table);
    }

    //Custom renderer - do what the natural renderer would do, just add a border
    public static class CustomRenderer implements TableCellRenderer{
        TableCellRenderer render;
        Border b;
        public CustomRenderer(TableCellRenderer r, Color top, Color left,Color bottom, Color right){
            render = r;

            //It looks funky to have a different color on each side - but this is what you asked
            //You can comment out borders if you want too. (example try commenting out top and left borders)
            b = BorderFactory.createCompoundBorder();
            b = BorderFactory.createCompoundBorder(b, BorderFactory.createMatteBorder(2,0,0,0,top));
            b = BorderFactory.createCompoundBorder(b, BorderFactory.createMatteBorder(0,2,0,0,left));
            b = BorderFactory.createCompoundBorder(b, BorderFactory.createMatteBorder(0,0,2,0,bottom));
            b = BorderFactory.createCompoundBorder(b, BorderFactory.createMatteBorder(0,0,0,2,right));
        }

        @Override
        public Component getTableCellRendererComponent(JTable table,
                Object value, boolean isSelected, boolean hasFocus, int row,
                int column) {
            JComponent result = (JComponent)render.getTableCellRendererComponent(table, value, isSelected, hasFocus, row, column);
            result.setBorder(b);
            return result;
        }

    }

    /**
     * @param args
     */
    public static void main(String[] args) {

        JFrame frame = new JFrame();
        frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        frame.setContentPane(new JTableColoredBorder());
        frame.validate();
        frame.pack();
        frame.setVisible(true);
    }

}
于 2012-10-11T19:21:41.383 に答える
6

印刷する前に、テーブルに MatteBorder を追加します。

Color color = UIManager.getColor("Table.gridColor");
MatteBorder border = new MatteBorder(1, 1, 0, 0, color);
table.setBorder(border);
于 2012-10-11T18:55:44.687 に答える
0

すべてのコードをありがとう。時間と労力を費やして私たちを助けてくれる人々に本当に感謝しています。これらのソリューションはすべて問題を解決します。私は以下のコードでこれについて非常に良い解決策を得ました:-

 package com.swing.data;

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

public class TableExample{   
    public static void main(String[] args) {   
        final JFrame f = new JFrame("TableExample");   
        f.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);   
        f.getContentPane().add(createTable());   
        f.pack();   
        SwingUtilities.invokeLater(new Runnable(){   
            public void run() {   
                f.setLocationRelativeTo(null);   
                f.setVisible(true);   
            }   
        });   
    }   

    static JComponent createTable() {   
        final JTable table = new JTable(9,9) {   
            private static final long serialVersionUID = 0;   

            Color B = Color.RED;   
            Color C = this.getGridColor();   
            final Border[][] borders = {   
                {new ZoneBorder(C,B,B,B), new ZoneBorder(B,C,C,C), new ZoneBorder(B,B,C,C)},   
                {new ZoneBorder(C,C,C,B), new ZoneBorder(C,C,C,C), new ZoneBorder(C,B,C,C)},   
                {new ZoneBorder(C,C,B,B), new ZoneBorder(C,C,B,C), new ZoneBorder(C,B,B,C)}   
            };   

            public Component prepareRenderer(TableCellRenderer renderer, int row, int column) {   
                Component result = super.prepareRenderer(renderer, row, column);   
                if (result instanceof JComponent) {   
                    if(row == 0 && column == 0)
                    ((JComponent) result).setBorder(borders[0][0]);   
                }   
                return result;   
            }   
        };   
        table.setRowHeight(28);   
        //table.setGridColor(Color.BLACK);   
        TableColumnModel tcm = table.getColumnModel();   
        for(int c = 0; c<table.getColumnCount(); ++c) {   
            TableColumn tc = tcm.getColumn(c);   
            tc.setPreferredWidth(28);   
        }   
        JPanel inner = new JPanel(new GridLayout());   
        //inner.setBorder(BorderFactory.createLineBorder(Color.BLACK, 3));   
        inner.add(table);   
        return inner;   
    }   
}  

    package com.swing.data;

import java.awt.*;   
import javax.swing.*;   
import javax.swing.border.*;   

public class ZoneBorder implements Border {   
    private static final int WIDTH = 1;   
    private Color colorN, colorE, colorS, colorW;   

    public ZoneBorder(Color colorN, Color colorE, Color colorS, Color colorW) {   
        this.colorN=colorN;   
        this.colorE=colorE;   
        this.colorS=colorS;   
        this.colorW=colorW;   
    }   

    public boolean isBorderOpaque() {   
        return false;   
    }   

    public Insets getBorderInsets(Component c) {   
        return new Insets(WIDTH,WIDTH,WIDTH,WIDTH);   
    }   

    public void paintBorder(Component c, Graphics g, int x, int y, int width, int height) {   
        Color old = g.getColor();   
        if (colorN != null) {   
            g.setColor(colorN);   
            g.fillRect(x, y, width, WIDTH);   
        }   
        if (colorE != null) {   
            g.setColor(colorE);   
            g.fillRect(x+width-WIDTH, y, WIDTH, height);   
        }   
        if (colorS != null) {   
            g.setColor(colorS);   
            g.fillRect(x, y+height-WIDTH, width, WIDTH);   
        }   
        if (colorW != null) {   
            g.setColor(colorW);   
            g.fillRect(x, y, WIDTH, height);   
        }   
        g.setColor(old);   
    }   
}  

ありがとう!

于 2012-10-12T10:34:54.700 に答える