java AbstractTableModel 2每行的不同颜色 [英] java AbstractTableModel 2 Different Color For Each Row

查看:164
本文介绍了java AbstractTableModel 2每行的不同颜色的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

我想提高我的jtable的可读性,这里是MyTableModel.java类下面,如何使每行有两种不同的颜色如图所示。应该是什么特定的方法,我可以给不同的颜色每行,以提高用户的可读性。

  public class MyTableModel extends AbstractTableModel {

String [] columnNames;
Vector< Vector< Object>>数据;
public DataAccessObject ObjDb = new DataAccessObject();


public MyTableModel(String [] coln,Vector< Vector< Object>> data)
{

columnNames = coln;
this.data = data;

}

@Override
public int getColumnCount(){
return columnNames.length;
}

@Override
public int getRowCount(){
return data.size();
}

@Override
public String getColumnName(int col){
return columnNames [col];
}

public Object getValueAt(int row,int col){
return data.get(row).get(col);
}

public class getColumnClass(int c){
return getValueAt(0,c).getClass();
}


public boolean isCellEditable(int row,int col){

if(col <= 0){
return真正;
} else {
return true;
}
}


public void setValueAt(Object value,int row,int col){
data.get(row).set ,value);
fireTableCellUpdated(row,col);
}




private class RowListener implements ListSelectionListener {
public void valueChanged(ListSelectionEvent event){
if .getValueIsAdjusting()){
return;
}
// output.append(ROW SELECTION EVENT。);
// outputSelection();
}
}

私人类ColumnListener实现ListSelectionListener {
public void valueChanged(ListSelectionEvent event){
if(event.getValueIsAdjusting()){
return;
}
// output.append(COLUMN SELECTION EVENT。);
// outputSelection();
}
}

}

Netbeans自动创建我的jtable变量名我设置是mytable然后我
有定义prepareRenderer下面的问题,我错过这里吗?我想让

每行有不同的颜色这里是我的示例代码如下。

  mytable.prepareRenderer(TableCellRenderer renderer,int row,int column)
{
Component c = super .prepareRenderer(renderer,row,column);

//交替行颜色

if(!isRowSelected(row))
c.setBackground(row%2 == 0?getBackground():Color。浅灰);

return c;
}
};

我也使用这一个但是设置5列我有7列剩余两个不是

  mytable.setDefaultRenderer() ObjectClass,new TableCellRenderer(){
private DefaultTableCellRenderer DEFAULT_RENDERER = new DefaultTableCellRenderer();

@Override
public Component getTableCellRendererComponent(JTable table,Object value,boolean
isSelected,boolean hasFocus,int row,int column){
Component c = DEFAULT_RENDERER.getTableCellRendererComponent(table,value,


isSelected,hasFocus,row,column);


System.out.println(column);

if(row%2 == 0){
c.setBackground(Color.WHITE) ;
} else {
c.setBackground(Color.LIGHT_GRAY);
}
return c;
}

}


解决方案

您可以...



使用 SwingLabs中的 JXTable ,SwingX库,其功能可以做到这...这将是我的首选解决方案,如果你可以使用第三方库...



...



使用Nimbus的外观和感觉,但这会阻止你使用其他外观和感觉(像系统的外观和感觉)



您可以...



创建您自己的系列 TableCellRenderer s,它们的背景颜色基于当前行...这是单调乏味的你可能需要的每个单元格渲染器,需要能够执行此操作...



< h2>您可以...

覆盖 JTable 的 prepareCellRenderer code>并强行设置单元格渲染器的背景自己,基于行...我不是这个解决方案的粉丝,因为它强制设计选择到渲染器,这可能不适合它的要求(覆盖值



您可以...



创建一个 JViewport ,它能够与 JTable 交谈,并在表格下方提取糖果,但表和渲染器将需要是透明的...我做到了这一点,它的...复杂...但允许我继续糖果剥离视图端口的全长(超出可渲染区域的table)...



更新为 JViewport 示例
$ b

这是我刚刚实现的一个项目的一个例子(它实际上由一个接口管理,所以我可以包括 JList JTextArea ,但这是另一个问题)...



基本上,它使 JViewport 出现在 JTable 下面,负责渲染实际的糖果剥离。



但是为什么?你问...因为它不影响表或单元格渲染器。这样做的唯一要求是,表和单元渲染器都是透明的(除非它们必须是其他)。



这意味着,你不需要你的渲染器中的糖果剥离逻辑,这意味着你不需要重写 prepareRenderer 你创建和修改细胞渲染器的要求...



这不太完美,但却表现出了基本的想法...





好吧,但为什么要打扰?好吧,基本上,这种方法允许你绘制超出了表格绘制的区域...



  import java.awt.Color; 
import java.awt.Component;
import java.awt.EventQueue;
import java.awt.Graphics;
import java.awt.Graphics2D;
import java.awt.Rectangle;
import javax.swing.JFrame;
import javax.swing.JScrollPane;
import javax.swing.JTable;
import javax.swing.JViewport;
import javax.swing.UIManager;
import javax.swing.UnsupportedLookAndFeelException;
import javax.swing.table.DefaultTableCellRenderer;
import javax.swing.table.DefaultTableModel;

public class CandyStrippedTable {

public static void main(String [] args){
new CandyStrippedTable();
}

public CandyStrippedTable(){
EventQueue.invokeLater(new Runnable(){
@Override
public void run(){
try {
UIManager.setLookAndFeel(UIManager.getSystemLookAndFeelClassName());
} catch(ClassNotFoundException | InstantiationException | IllegalAccessException | UnsupportedLookAndFeelException ex){
}

对象[ ] columns = new Object [10];
for(int col = 0; col< columns.length; col ++){
columns [col] =(char)(65 + col);


Object [] [] data = new Object [10] [10];
for(int row = 0; row< data.length; row ++){
for(int col = 0; col< data [row] .length; col ++){
data [row] [col] = row +x+ col;
} $ b b}

DefaultTableModel model = new DefaultTableModel(data,columns);
JTable table = new JTable(model);
table.setDefaultRenderer(Object.class,new DefaultTableCellRenderer(){

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

});
table.setFillsViewportHeight(true);
table.setOpaque(false);

JScrollPane sp = new JScrollPane();
sp.setViewport(new CandyStrippedViewPort(new Color(255,0,0,128)));
sp.setViewportView(table);

JFrame frame = new JFrame(Test);
frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
frame.add(sp);
frame.pack();
frame.setLocationRelativeTo(null);
frame.setVisible(true);
}
});
}

public class CandyStrippedViewPort extends JViewport {

private Color candyStrippedColor;

public CandyStrippedViewPort(color color){
candyStrippedColor = color;
}

public Color getCandyStrippedColor(){
return candyStrippedColor;
}

public void setCandyStrippedColor(Color candyStrippedColor){
this.candyStrippedColor = candyStrippedColor;
repaint();
}

@Override
protected void paintComponent(Graphics g){
super.paintComponent(g);
Graphics2D g2d =(Graphics2D)g.create();
g2d.setColor(getCandyStrippedColor());
组件视图= getView();
if(view instanceof JTable){
JTable table =(JTable)view;
Rectangle viewRect = getViewRect();
int y = 0;
int row = 0;
if(table.getRowCount()> 0){
row = table.rowAtPoint(viewRect.getLocation());
while(row< table.getRowCount()){
int rowHeight = table.getRowHeight(row);
Rectangle cellRect = table.getCellRect(row,0,true);
if(row%2 == 0){
g2d.fillRect(0,cellRect.y - viewRect.y,getWidth(),cellRect.height);
}
y = cellRect.y + cellRect.height;
row ++;
}
}
int rowHeight = table.getRowHeight();
while(y if(row%2 == 0){
g2d.fillRect(0,y,getWidth(),rowHeight);
}
row ++;
y + = rowHeight;
}
}
g2d.dispose();
}
}
}



您可以从...开始。

  obj.table.setDefaultRenderer(Double.class,
new DefaultTableCellRenderer(){
@Override public Component getTableCellRendererComponent(JTable table,Object value,boolean isSelected,boolean hasFocus,int row,int column ){
if(value instanceof Number){
value = NumberFormat.getNumberInstance()。format(value);
}
super.getTableCellRendererComponent(table,value,isSelected,hasFocus ,row,column);
setOpaque(isSelected);
return this;
}
});

如果由于某种原因,默认格式适合, / p>

  obj.table.setDefaultRenderer(Double.class,
new DefaultTableCellRenderer(){
@Override public Component getTableCellRendererComponent(JTable table,Object value,boolean isSelected,boolean hasFocus,int row,int column){
if(value instanceof Number){
NumberFormat ni = NumberFormat.getNumberInstance();
ni .setMaximumFractionDigits(2)
value = ni.format(value);
}
super.getTableCellRendererComponent(table,value,isSelected,hasFocus,row,column);
setOpaque isSelected);
return this;
}
});

而不是


I want to increase readability of my jtable , here is MyTableModel.java class below , how to make each row with 2 different color shown in this picture . What should be the specific method that I can give different color to each row to increase readability of the user.

      public class MyTableModel extends AbstractTableModel{

   String [] columnNames;
   Vector<Vector<Object>> data;
   public DataAccessObject  ObjDb = new DataAccessObject ();


   public  MyTableModel(String [] coln , Vector<Vector<Object>>  data)
   {

       columnNames = coln;
       this.data =data;

   }

   @Override
        public int getColumnCount() {
            return columnNames.length;
        }

   @Override
        public int getRowCount() {
            return data.size();
        }

   @Override
        public String getColumnName(int col) {
            return columnNames[col];
        }

        public Object getValueAt(int row, int col) {
            return data.get(row).get(col);
        }

        public Class getColumnClass(int c) {
            return getValueAt(0, c).getClass();
        }


        public boolean isCellEditable(int row, int col) {

            if (col <= 0) {
                return true;
            } else {
                return true;
            }
        }


        public void setValueAt(Object value, int row, int col) {
            data.get(row).set(col, value);
            fireTableCellUpdated(row, col);
        }




      private class RowListener implements ListSelectionListener {
        public void valueChanged(ListSelectionEvent event) {
            if (event.getValueIsAdjusting()) {
                return;
            }
//            output.append("ROW SELECTION EVENT. ");
//            outputSelection();
        }
    }

    private class ColumnListener implements ListSelectionListener {
        public void valueChanged(ListSelectionEvent event) {
            if (event.getValueIsAdjusting()) {
                return;
            }
//            output.append("COLUMN SELECTION EVENT. ");
//            outputSelection();
        }
    }

}

Netbeans automatically created my jtable with variable name I set is mytable then I have problem with defining prepareRenderer below , do I miss step here ? I wanna make
each row with different color Here is my sample code below.

       mytable.prepareRenderer(TableCellRenderer renderer, int row, int column)
        {
            Component c = super.prepareRenderer(renderer, row, column);

            //  Alternate row color

            if (!isRowSelected(row))
                c.setBackground(row % 2 == 0 ? getBackground() : Color.LIGHT_GRAY);

            return c;
        }
    };

I have also use this one but this sets 5 columns i have 7 columns remaining two is not
colored at the end , when I click the white colored row the text color disappears.

 mytable.setDefaultRenderer(Object.class, new TableCellRenderer() {
    private DefaultTableCellRenderer DEFAULT_RENDERER = new DefaultTableCellRenderer();

    @Override
    public Component getTableCellRendererComponent(JTable table, Object value, boolean      
  isSelected, boolean hasFocus, int row, int column) {
        Component c = DEFAULT_RENDERER.getTableCellRendererComponent(table, value,             


isSelected, hasFocus, row, column);


        System.out.println(column);

        if (row % 2 == 0) {
            c.setBackground(Color.WHITE);
        } else {
            c.setBackground(Color.LIGHT_GRAY);
        }
        return c;
    }

});

解决方案

You could...

Use JXTable from SwingLabs, SwingX library which has functionality which could do this...this would be my preferred solution if you can use 3rd party libraries...

You could...

Use Nimbus look and feel which does this...but this precludes you from using other look and feels (like the system look and feel)

You could...

Create your own series of custom TableCellRenderers which color their background based on the current row...this is tedious as EVERY cell renderer you might need, needs to be able to perform this operation...

You could...

Override the prepareCellRenderer method of the JTable and forcefully set the background of the cell renderer yourself, based on the row...I'm not a fan of this solution, as it's forcing a design choice onto the renderer which might not fit it's requirements (overriding values the cell renderer might want) and locks you into a particular implementation of the table...

You could...

Create a JViewport which was capable of talking with the JTable and rendered the candy stripping underneath the table, but the table and renderers would need to be transparent...I've done this, it's...complicated...but allowed me to continue the candy stripping the full length of the view port (beyond the renderable area of the table)...

Updated with JViewport example

This is an example of a concept I implemented a while ago for a project (it is actually managed by an interface so I could include JList and JTextArea as well, but that's another question)...

Basically, it makes the JViewport, which appears below the JTable, responsible for rendering the actual candy stripping.

But "why?" you ask...because it doesn't affect the table or cell renderer. The only requirement that this makes is that both the table and cell renderers are transparent (unless they have to be otherwise).

This means, you don't need to put candy stripping logic in your renderers, this means you don't need to override prepareRenderer of every table you create and mangle the requirements of the cell renderers...

It's far from perfect, but demonstrates the basic idea...

Okay, but why bother? Well, basically, this approach allows you to paint beyond the area painted by the table...

import java.awt.Color;
import java.awt.Component;
import java.awt.EventQueue;
import java.awt.Graphics;
import java.awt.Graphics2D;
import java.awt.Rectangle;
import javax.swing.JFrame;
import javax.swing.JScrollPane;
import javax.swing.JTable;
import javax.swing.JViewport;
import javax.swing.UIManager;
import javax.swing.UnsupportedLookAndFeelException;
import javax.swing.table.DefaultTableCellRenderer;
import javax.swing.table.DefaultTableModel;

public class CandyStrippedTable {

    public static void main(String[] args) {
        new CandyStrippedTable();
    }

    public CandyStrippedTable() {
        EventQueue.invokeLater(new Runnable() {
            @Override
            public void run() {
                try {
                    UIManager.setLookAndFeel(UIManager.getSystemLookAndFeelClassName());
                } catch (ClassNotFoundException | InstantiationException | IllegalAccessException | UnsupportedLookAndFeelException ex) {
                }

                Object[] columns = new Object[10];
                for (int col = 0; col < columns.length; col++) {
                    columns[col] = (char) (65 + col);
                }

                Object[][] data = new Object[10][10];
                for (int row = 0; row < data.length; row++) {
                    for (int col = 0; col < data[row].length; col++) {
                        data[row][col] = row + "x" + col;
                    }
                }

                DefaultTableModel model = new DefaultTableModel(data, columns);
                JTable table = new JTable(model);
                table.setDefaultRenderer(Object.class, new DefaultTableCellRenderer() {

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

                });
                table.setFillsViewportHeight(true);
                table.setOpaque(false);

                JScrollPane sp = new JScrollPane();
                sp.setViewport(new CandyStrippedViewPort(new Color(255, 0, 0, 128)));
                sp.setViewportView(table);

                JFrame frame = new JFrame("Test");
                frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
                frame.add(sp);
                frame.pack();
                frame.setLocationRelativeTo(null);
                frame.setVisible(true);
            }
        });
    }

    public class CandyStrippedViewPort extends JViewport {

        private Color candyStrippedColor;

        public CandyStrippedViewPort(Color color) {
            candyStrippedColor = color;
        }

        public Color getCandyStrippedColor() {
            return candyStrippedColor;
        }

        public void setCandyStrippedColor(Color candyStrippedColor) {
            this.candyStrippedColor = candyStrippedColor;
            repaint();
        }

        @Override
        protected void paintComponent(Graphics g) {
            super.paintComponent(g);
            Graphics2D g2d = (Graphics2D) g.create();
            g2d.setColor(getCandyStrippedColor());
            Component view = getView();
            if (view instanceof JTable) {
                JTable table = (JTable) view;
                Rectangle viewRect = getViewRect();
                int y = 0;
                int row = 0;
                if (table.getRowCount() > 0) {
                    row = table.rowAtPoint(viewRect.getLocation());
                    while (row < table.getRowCount()) {
                        int rowHeight = table.getRowHeight(row);
                        Rectangle cellRect = table.getCellRect(row, 0, true);
                        if (row % 2 == 0) {
                            g2d.fillRect(0, cellRect.y - viewRect.y, getWidth(), cellRect.height);
                        }
                        y = cellRect.y + cellRect.height;
                        row++;
                    }
                }
                int rowHeight = table.getRowHeight();
                while (y < getHeight()) {
                    if (row % 2 == 0) {
                        g2d.fillRect(0, y, getWidth(), rowHeight);
                    }
                    row++;
                    y += rowHeight;
                }
            }
            g2d.dispose();
        }
    }
}

Formatting numbers in cell renderers

You could start with something like...

obj.table.setDefaultRenderer(Double.class, 
    new DefaultTableCellRenderer() { 
        @Override public Component getTableCellRendererComponent(JTable table, Object value, boolean isSelected, boolean hasFocus, int row, int column) { 
            if (value instanceof Number) {
                value = NumberFormat.getNumberInstance().format(value);
            }
            super.getTableCellRendererComponent(table, value, isSelected, hasFocus, row, column); 
            setOpaque(isSelected); 
            return this; 
        } 
    });

If, for some reason, the default format instead suitable, you could do something like...

obj.table.setDefaultRenderer(Double.class, 
    new DefaultTableCellRenderer() { 
        @Override public Component getTableCellRendererComponent(JTable table, Object value, boolean isSelected, boolean hasFocus, int row, int column) { 
            if (value instanceof Number) {
                NumberFormat ni = NumberFormat.getNumberInstance();
                ni.setMaximumFractionDigits(2)
                value = ni.format(value);
            }
            super.getTableCellRendererComponent(table, value, isSelected, hasFocus, row, column); 
            setOpaque(isSelected); 
            return this; 
        } 
    });

Instead

这篇关于java AbstractTableModel 2每行的不同颜色的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆