初学JAVA,在做一个图片浏览器的时候碰到个问题缩略图我想用JTtable做,然后就重载了DefaultTableCellRenderer的getTableCellRendererComponent方法,把返回值改成了Jlabel接着我在JTtable里加了个鼠标事件,为选中的单元格的LABEL加上边框,但是显示起来非常慢,或者把窗口最小化再还原后border才会出现。然后我就在setborder语句后面加上了一句JOptionPane,显示就正常了。那么我想应该不是阻塞了啊什么的关系,应该是组件的显示绘制问题。
我又试着加了validate和updateComponentTreeUI,但是都不行,故来请教一下这是什么原因,要怎么解决,望高手指教。关键代码如下:
//thumbnailTable自定义的JTable
thumbnailTable.addMouseListener(new MouseAdapter() {
public void mouseClicked(MouseEvent e) {
int row=thumbnailTable.getSelectedRow();
int column=thumbnailTable.getSelectedColumn();
if (selectedLabel!=null) {
……
}
selectedLabel=(JLabel)thumbnailTable.getValueAt(row, column);
selectedLabel.setBorder(new LineBorder(Color.GRAY));
……
}
});

解决方案 »

  1.   

    要死…………还是解决不了= =
    继续顶…………
    我在想要不干脆换思路…………但是我懒得重写= =
    我主要是重载了DefaultTableCellRenderer的getTableCellRendererComponent方法后,选中的单元格的效果就没了,我又不知道怎么写,所以我只好把这效果加在JLABEL上了。谁能告诉我这种效果要咋写?现在我自定义的JTABLE代码如下:
    public class Ex02aJTable extends JTable {
    private static final long serialVersionUID=20101215L;
    public Ex02aJTable(int numRows,int numColumns) {
    super(numRows,numColumns);
    init();
    }
    private void init() {
    this.setRowHeight(0, 60);
    TableColumnModel columnModel=this.getColumnModel();
    Enumeration<TableColumn> columns=columnModel.getColumns();
    while (columns.hasMoreElements()) {
    columns.nextElement().setPreferredWidth(70);
    }
    this.setShowGrid(false);
    this.setIntercellSpacing(new Dimension(10,0));
    this.setBackground(new Color(0Xeeeeee));
    }
    public TableCellRenderer getDefaultRenderer(Class<?> columnClass) {
    ImageRenderer renderer=new ImageRenderer();
    return renderer;
    }
    public boolean isCellEditable(int row,int column) {
    return false;
    }
    private class ImageRenderer extends DefaultTableCellRenderer {
    public static final long serialVersionUID=20101216L;
    public Component getTableCellRendererComponent(JTable table,Object value,boolean isSelected,boolean hasFocus,int row,int column) {
    if (isSelected) {
    ……//这样吗????不会啊啊啊啊啊啊
    }
    return (JLabel)value;
    }
    }
      

  2.   

    解决了= =
    我不死心地加了SwingUtilities.updateComponentTreeUI(thumbnailTable);竟然解决了= =这是为神马,原来我看走眼了吗?话说其实我还是不是很明白,SwingUtilities.updateComponentTreeUI(thumbnailTable);这个到底是干神马的。。谁来解释下,顺便送点分数改写代码为:
    //thumbnailTable是放LABEL的表格,表格第一行是缩略图,第二行是图片名称
    //column是选中的列
    private void setSelectionFace(int column) {
    if (selectedImg!=null && selectedName!=null) {
    selectedImg.setBorder(null);
    selectedImg.setOpaque(false);
    selectedName.setOpaque(false);
    }
    selectedImg=(JLabel)thumbnailTable.getValueAt(0, column);
    selectedImg.setBorder(new LineBorder(Color.GRAY));
    selectedImg.setOpaque(true);
    selectedImg.setBackground(Color.WHITE);
    selectedName=(JLabel)thumbnailTable.getValueAt(1, column);
    selectedName.setOpaque(true);
    selectedName.setBackground(Color.WHITE);
    SwingUtilities.updateComponentTreeUI(thumbnailTable);//这个到底什么用的?为什么加了就解决了……我以前每次遇到这种显示问题就加validate或者这个,其实我不是很明白到底啥用的
    }
      

  3.   

    这个看看java tutorial swing线程 那个地方