Java, как добавить WaterMark в JTable - PullRequest
0 голосов
/ 20 июля 2011

У меня есть JTable, и я пытаюсь вставить изображение позади JTable в качестве водяного знака

tblMainView= new JTable(dtModel){

        public Component prepareRenderer(TableCellRenderer renderer, int row, int column) 
        {
        Component c = super.prepareRenderer( renderer, row, column);
        // We want renderer component to be transparent so background image is visible
        if( c instanceof JComponent )
        ((JComponent)c).setOpaque(true);
        return c;
        }
        ImageIcon image = new ImageIcon( "images/watermark.png" );

          public void paint( Graphics g )
        {
        // First draw the background image - tiled 
        Dimension d = getSize();
        for( int x = 0; x < d.width; x += image.getIconWidth() )
        for( int y = 0; y < d.height; y += image.getIconHeight() )
        g.drawImage( image.getImage(), x, y, null, null );
        // Now let the regular paint code do it's work
        super.paint(g);
        }


        public boolean isCellEditable(int rowIndex, int colIndex) {
          return false;
        }
        public Class getColumnClass(int col){
            if (col == 0)  
            {  
            return Icon.class;  
            }else if(col==7){
                return String.class;
            }
        else
            return String.class;  

        }   
        public boolean getScrollableTracksViewportWidth() {
            if (autoResizeMode != AUTO_RESIZE_OFF) {
                if (getParent() instanceof JViewport) {
                return (((JViewport)getParent()).getWidth() > getPreferredSize().width);
                }
            } 
            return false;
            }

    };

Выше приведен код моего JTable, но водяного знакав невидимых;Позвольте мне добавить, что позже я помещаю это JTable в JScrollPane и JSplitPane.

Ответы [ 3 ]

3 голосов
/ 20 июля 2011

есть ошибки

действительно не очень хорошая идея, используйте paint(Graphics g) для Swing JComponents, paint() для кода AWT, для Swing есть paintComponent(Graphics g), использование paint(Graphics g) в Swing будет иметь неожиданный вывод в графический интерфейс Swing,

действительно не очень хорошая идея paint(Graphics g) для кода AWT или paintComponent(Graphics g) для кода Swing внутри любого из Renderer

Вы должны подготовить BackGroung JTable, как показано здесь TableWithGradientPaint

3 голосов
/ 20 июля 2011

Два возможных решения, но я не знаю, какое. : D Я думаю, что первый подход будет иметь самые высокие шансы на успех.

Первый подход

Переопределите ваш paintComponent(Graphics g) метод:

public void paintComponent(Graphics g)
{
    //First super
    super.paintComponent(g);

    g.drawImage(0, 0, getWidth(), getHeight());
}

Второй подход

Установите для непрозрачного JTable значение false: table.setOpaque(false);
Переопределите ваш paintComponent(Graphics g) метод:

public void paintComponent(Graphics g)
{
    //First draw
    g.drawImage(0, 0, getWidth(), getHeight());

    super.paintComponent(g);
}
1 голос
/ 20 июля 2011

Попробуйте позвонить super.paint(g), прежде чем закрасить свой водяной знак, JTable, вероятно, закрасит ваше изображение.

...