2010-07-11 22 views
5

He creado una columna con células que contienen un JTextArea + A JButton en su interior, como se puede ver en la siguiente imagen en la Columna 3:¿Puedo hacer una columna JTable sin bordes?

alt text

Pero me he enfrentado a muchos problemas con mi CellRenderer y CellEditor al actualizar los valores de las celdas en esa columna, ya que mi código es un poco complicado. Entonces, en su lugar, quiero reemplazar esa columna con 2 columnas. Una columna debe ser de Cadenas normales y la otra debe ser de JCanas de botones pero estas 2 columnas deben tener el mismo aspecto que la columna 3 aparece en la imagen de arriba. Así que mis preguntas son:

1. ¿Cómo puedo combinar las cabeceras de las columnas 2 juntos?

2. ¿Cómo puedo eliminar los bordes izquierdos de la columna JButtons?

Si se arreglan, las 2 columnas tendrán el mismo aspecto que la imagen anterior + la actualización de los valores de las celdas será mucho más fácil.

-------------------------------- Edit: Mi código de problemas de muestra:

Ok chicos ... lo pediste. Mi código es enorme, pero si me pueden ayudar a solucionarlo, sería perfecto. He creado una muestra de jar en ejecución para mi problema & incluido mi código fuente también. Puede descargar desde aquí:

Jar sample

El problema es que yo uso un botón para permitir la clasificación filas de la tabla (moverlos hacia arriba/abajo), pero cuando hago esto algunas de las células se ha movido valores no son actualizado !

se puede ver la siguiente captura de pantalla: alt text El problema está en el editor de células estoy usando ... pero no puedo arreglarlo.

+0

Muéstranos el código de construcción de la interfaz de usuario para que podamos ayudarle más precisamente. – msw

+0

Me rindo, este código no funciona, lo siento. –

+0

¿No funciona? ... Haga doble clic en el contenedor para ejecutarlo. – Brad

Respuesta

0

Puede crear un JButton sin borde (borde vacío) que implemente TableCellRenderer?

+1

Necesito quitar el borde de la celda (borde izquierdo) ... ¡No el borde del botón! – Brad

2

ACTUALIZACIÓN cuando se crea un modelo de tabla vacía, crear dos instancias de ButtonCellRenderer (en lugar de 4), y establecer una instancia tanto como un editor y un procesador para la columna 2 y la segunda para la columna 3. Este fijo mostrando valores incorrectos al mover filas, pero a veces dibuja una celda vacía al pasar el ratón.

Y sobre el código no funciona, reiniciar la edición de la celda cada vez que se mueve un mouse puede presentar problemas debido a que cambia entre el editor de celda y el procesador en cada movimiento del mouse. No pude editar ningún valor aunque use JTextArea (que debería ser JTextField). Es correcto volver a crear el modelo de tabla cada vez que cambie el orden de las filas, pero es mejor crear una clase que contenga valores para todas las columnas y usar el Vector de estas clases como un modelo de tabla. De esta forma, puede reordenar valores en el vector y el modelo de tabla se actualizará.

Si desea unir dos encabezados, anule getHeaderRect(int col) de , para devolver la unión de super.getHeaderRect() para dos columnas. También es posible que necesite anular el método paint() de BasicTableHeaderUI para pintar el encabezado ancho sobre los dos anteriores.

Este es el enfoque que utilicé para unir celdas de tabla, pero también debería funcionar para encabezados.

Lo siento, no puedo darle el código exacto. Personalmente, me gustaría escribir un renderizador de células personalizado, es decir, tu primer acercamiento.

EDITAR Si desea utilizar metal Laf este código hace poco el truco de no pintar la cabecera de la segunda columna:

final TableCellRenderer defaultRenderer = getTableHeader().getDefaultRenderer(); 
    getTableHeader().setDefaultRenderer(new DefaultTableCellRenderer() { 
     @Override 
     public Component getTableCellRendererComponent(JTable table, Object value, boolean isSelected, boolean hasFocus, int row, int column) { 
      JLabel c = (JLabel) defaultRenderer.getTableCellRendererComponent(table, value, isSelected, hasFocus, row, column); 
      if (column == 1) 
       c.setBorder(BorderFactory.createMatteBorder(1, 1, 1, 0, Color.gray)); 
      else if (column == 2) { 
       c.setBorder(BorderFactory.createMatteBorder(1, 0, 1, 1, Color.gray)); 
       c.setText(null); 
      } else 
       c.setBorder(BorderFactory.createMatteBorder(1, 1, 1, 1, Color.gray)); 
      return c; 
     } 
    }); 
+0

Gracias por el esfuerzo tulskiy ... He editado mi pregunta para establecer una muestra de código de mis problemas. – Brad

+0

Gracias tulskiy por su ayuda ... ¿Puede darme un ejemplo de cómo anular getHeaderRect (...) para devolver 2 columnas? – Brad

Cuestiones relacionadas