2012-07-01 16 views
5

Bir JTable (Nimbus L & F) içindeki verileri düzenlerken, hücreden hücreye kullanıcı sekmeleri olarak, hangi hücrenin netleme yaptığı açık değildir. Hangi hücrenin odaklanacağını nasıl netleştirebilirim? Nimbus'u değiştirmek için ayarlanabilen bir dizi özellik olduğunu biliyorum - kim istediğimi bilen var mı? defaul tarafındanJTable Nimbus Bak ve Hissedin - hangi hücrenin odaklanacağını temizle nasıl yapılır

UIManager.put("Table.showGrid", true); 

JTable screen shot

cevap

3
  • Eğer Renderer concept de göz,

  • için çalışır: Ekran altında çekilen

    varsayılan dışında bir şeye ayarlı tek özelliği vardır Nimbus Look and Feel,

  • bazı konu JButtons components (JCheckBox e.i.) ile olabilir, ama birkaç kez bu forumda cevap ya çözülür Sen ön plan rengini değiştirecek özel bir hücre oluşturucu sınıf oluşturmak gerekir

enter image description here

import java.awt.BorderLayout; 
import java.awt.Color; 
import java.awt.Component; 
import java.awt.Font; 
import java.awt.Graphics; 
import java.util.ArrayList; 
import java.util.List; 
import java.util.regex.Pattern; 
import javax.swing.Icon; 
import javax.swing.JComponent; 
import javax.swing.JFrame; 
import javax.swing.JScrollPane; 
import javax.swing.JTable; 
import javax.swing.RowSorter.SortKey; 
import javax.swing.SortOrder; 
import javax.swing.SwingUtilities; 
import javax.swing.UIManager; 
import javax.swing.table.DefaultTableCellRenderer; 
import javax.swing.table.TableColumn; 
import javax.swing.table.TableModel; 
import javax.swing.table.TableRowSorter; 

public class ImageChangeDemo extends JFrame { 

    private static final long serialVersionUID = 1L; 
    private JTable table = new javax.swing.JTable(); 
    private JTable table1 = new javax.swing.JTable(); 
    private static Icon ascendingSortIcon; 
    private static Icon descendingSortIcon; 

    public static void main(String args[]) { 
     //comment out the code below to try in Metal L&F 
     try { 
      for (javax.swing.UIManager.LookAndFeelInfo info : javax.swing.UIManager.getInstalledLookAndFeels()) { 
       if ("Nimbus".equals(info.getName())) { 
        javax.swing.UIManager.setLookAndFeel(info.getClassName()); 
        ascendingSortIcon = UIManager.getLookAndFeelDefaults().getIcon("Table.ascendingSortIcon"); 
        descendingSortIcon = UIManager.getLookAndFeelDefaults().getIcon("Table.descendingSortIcon"); 
        //UIManager.getLookAndFeelDefaults().put("Table.ascendingSortIcon", new BevelArrowIcon(BevelArrowIcon.UP, false, false)); 
        //UIManager.getLookAndFeelDefaults().put("Table.descendingSortIcon", new BevelArrowIcon(BevelArrowIcon.DOWN, false, false)); 
        break; 
       } 
      } 
     } catch (Exception ex) { 
      ex.printStackTrace(); 
     } 
     java.awt.EventQueue.invokeLater(new Runnable() { 

      @Override 
      public void run() { 
       new ImageChangeDemo().setVisible(true); 
      } 
     }); 
    } 

    public ImageChangeDemo() { 
     setDefaultCloseOperation(javax.swing.WindowConstants.EXIT_ON_CLOSE); 
     JScrollPane pane = new javax.swing.JScrollPane(); 
     //table.setAutoCreateRowSorter(true); 
     table.setModel(new javax.swing.table.DefaultTableModel(
       new Object[][]{ 
        {"a", "q", "h", "v"}, 
        {"b", "m", "l", "h"}, 
        {"d", "c", "a", "d"}, 
        {"j", "o", "y", "e"} 
       }, 
       new String[]{ 
        "Col 1", "Col 2", "Col 3", "Col 4" 
       }) { 

      private static final long serialVersionUID = 1L; 
      Class[] types = new Class[]{ 
       String.class, String.class, String.class, String.class 
      }; 

      @Override 
      public Class getColumnClass(int columnIndex) { 
       return types[columnIndex]; 
      } 
     }); 
     TableRowSorter<TableModel> sorter = new TableRowSorter<TableModel>(table.getModel()) { 

      @Override 
      public void toggleSortOrder(int column) { 
       if (column >= 0 && column < getModelWrapper().getColumnCount() && isSortable(column)) { 
        List<SortKey> keys = new ArrayList<SortKey>(getSortKeys()); 
        if (!keys.isEmpty()) { 

         SortKey sortKey = keys.get(0); 
         if (sortKey.getColumn() == column && sortKey.getSortOrder() == SortOrder.DESCENDING) { 
          setSortKeys(null); 
          return; 
         } 
        } 
       } 
       super.toggleSortOrder(column); 
      } 
     }; 
     table.setRowSorter(sorter); 
     table.setPreferredScrollableViewportSize(table.getPreferredSize()); 
     pane.setViewportView(table); 
     UIManager.getLookAndFeelDefaults().put("Table.ascendingSortIcon", new BevelArrowIcon(BevelArrowIcon.UP, false, false)); 
     UIManager.getLookAndFeelDefaults().put("Table.descendingSortIcon", new BevelArrowIcon(BevelArrowIcon.DOWN, false, false)); 
     SwingUtilities.updateComponentTreeUI(table); 
     add(pane, BorderLayout.NORTH); 
     JScrollPane pane1 = new javax.swing.JScrollPane(); 
     //table.setAutoCreateRowSorter(true); 
     table1.setModel(new javax.swing.table.DefaultTableModel(
       new Object[][]{ 
        {"a", "q", "h", "v"}, 
        {"b", "m", "l", "h"}, 
        {"d", "c", "a", "d"}, 
        {"j", "o", "y", "e"} 
       }, 
       new String[]{ 
        "Col 1", "Col 2", "Col 3", "Col 4" 
       }) { 

      private static final long serialVersionUID = 1L; 
      Class[] types = new Class[]{ 
       String.class, String.class, String.class, String.class 
      }; 

      @Override 
      public Class getColumnClass(int columnIndex) { 
       return types[columnIndex]; 
      } 
     }); 
     table1.setRowSorter(sorter); 
     table1.setPreferredScrollableViewportSize(table1.getPreferredSize()); 
     pane1.setViewportView(table1); 
     add(pane1, BorderLayout.SOUTH); 

     for (int i = 0; i < table1.getColumnCount(); i++) { 
      RowColorRenderer rowRenderer = new RowColorRenderer(i); 
      TableColumn column = table1.getColumnModel().getColumn(i); 
      column.setCellRenderer(rowRenderer); 
     } 
     pack(); 
    } 

    private class RowColorRenderer extends DefaultTableCellRenderer { 

     private static final long serialVersionUID = 1L; 
     private int colNo = 0; 

     RowColorRenderer(int col) { 
      colNo = col; 
     } 

     @Override 
     public Component getTableCellRendererComponent(JTable table, Object value, 
       boolean isSelected, boolean hasFocus, int row, int column) { 
      Component comp = super.getTableCellRendererComponent(table, value, 
        isSelected, hasFocus, row, column); 
      JComponent jc = (JComponent) comp; 
      if (!isSelected) { 
       if (table.getValueAt(row, colNo) != null) { 
        String str = table.getValueAt(row, colNo).toString(); 
        if (!str.isEmpty()) { 
         if (Pattern.compile("\\d").matcher(str).find()) { 
          if (((Pattern.compile("[02468]").matcher(str).find())) 
            && (!(Pattern.compile("[13579]").matcher(str).find()))) { 
           setForeground(Color.magenta); 
           setBackground(Color.orange); 
          } else if ((!(Pattern.compile("[02468]").matcher(str).find())) 
            && ((Pattern.compile("[13579]").matcher(str).find()))) { 
           setForeground(Color.blue); 
           setBackground(Color.yellow); 
          } else if (((Pattern.compile("[02468]").matcher(str).find())) 
            && ((Pattern.compile("[13579]").matcher(str).find()))) { 
           setForeground(Color.red); 
           setBackground(Color.cyan); 
          } 
          setFont(new Font("Serif", Font.BOLD, 12)); 
          setHorizontalAlignment(CENTER); 
         } else { 
          setBackground(table.getBackground()); 
          setForeground(table.getForeground()); 
          setFont(new Font("Serif", Font.PLAIN, 8)); 
          setHorizontalAlignment(CENTER); 
         } 
        } 
       } 
      } else { 
       if (hasFocus) { 
        setFont(new Font("Serif", Font.BOLD, 12)); 
        setForeground(Color.magenta); 
        setBackground(Color.orange); 
       } 
      } 
      return this; 
     } 
    } 

    static class BevelArrowIcon implements Icon { 

     public static final int UP = 0;   // direction 
     public static final int DOWN = 1; 
     private static final int DEFAULT_SIZE = 11; 
     private Color edge1; 
     private Color edge2; 
     private Color fill; 
     private int size; 
     private int direction; 

     public BevelArrowIcon(int direction, boolean isRaisedView, boolean isPressedView) { 
      if (isRaisedView) { 
       if (isPressedView) { 
        init(UIManager.getColor("controlLtHighlight"), UIManager.getColor("controlDkShadow"), UIManager.getColor("controlShadow"), DEFAULT_SIZE, direction); 
       } else { 
        init(UIManager.getColor("controlHighlight"), UIManager.getColor("controlShadow"), UIManager.getColor("control"), DEFAULT_SIZE, direction); 
       } 
      } else { 
       if (isPressedView) { 
        init(UIManager.getColor("controlDkShadow"), UIManager.getColor("controlLtHighlight"), UIManager.getColor("controlShadow"), DEFAULT_SIZE, direction); 
       } else { 
        init(UIManager.getColor("controlShadow"), UIManager.getColor("controlHighlight"), UIManager.getColor("control"), DEFAULT_SIZE, direction); 
       } 
      } 
     } 

     public BevelArrowIcon(Color edge1, Color edge2, Color fill, int size, int direction) { 
      init(edge1, edge2, fill, size, direction); 
     } 

     @Override 
     public void paintIcon(Component c, Graphics g, int x, int y) { 
      switch (direction) { 
       case DOWN: 
        drawDownArrow(g, x, y); 
        break; 
       case UP: 
        drawUpArrow(g, x, y); 
        break; 
      } 
     } 

     @Override 
     public int getIconWidth() { 
      return size; 
     } 

     @Override 
     public int getIconHeight() { 
      return size; 
     } 

     private void init(Color edge1, Color edge2, Color fill, int size, int direction) { 
      edge1 = Color.red; 
      edge2 = Color.blue; 
      this.edge1 = edge1; 
      this.edge2 = edge2; 
      this.fill = fill; 
      this.size = size; 
      this.direction = direction; 
     } 

     private void drawDownArrow(Graphics g, int xo, int yo) { 
      g.setColor(edge1); 
      g.drawLine(xo, yo, xo + size - 1, yo); 
      g.drawLine(xo, yo + 1, xo + size - 3, yo + 1); 
      g.setColor(edge2); 
      g.drawLine(xo + size - 2, yo + 1, xo + size - 1, yo + 1); 
      int x = xo + 1; 
      int y = yo + 2; 
      int dx = size - 6; 
      while (y + 1 < yo + size) { 
       g.setColor(edge1); 
       g.drawLine(x, y, x + 1, y); 
       g.drawLine(x, y + 1, x + 1, y + 1); 
       if (0 < dx) { 
        g.setColor(fill); 
        g.drawLine(x + 2, y, x + 1 + dx, y); 
        g.drawLine(x + 2, y + 1, x + 1 + dx, y + 1); 
       } 
       g.setColor(edge2); 
       g.drawLine(x + dx + 2, y, x + dx + 3, y); 
       g.drawLine(x + dx + 2, y + 1, x + dx + 3, y + 1); 
       x += 1; 
       y += 2; 
       dx -= 2; 
      } 
      g.setColor(edge1); 
      g.drawLine(xo + (size/2), yo + size - 1, xo + (size/2), yo + size - 1); 
     } 

     private void drawUpArrow(Graphics g, int xo, int yo) { 
      g.setColor(edge1); 
      int x = xo + (size/2); 
      g.drawLine(x, yo, x, yo); 
      x--; 
      int y = yo + 1; 
      int dx = 0; 
      while (y + 3 < yo + size) { 
       g.setColor(edge1); 
       g.drawLine(x, y, x + 1, y); 
       g.drawLine(x, y + 1, x + 1, y + 1); 
       if (0 < dx) { 
        g.setColor(fill); 
        g.drawLine(x + 2, y, x + 1 + dx, y); 
        g.drawLine(x + 2, y + 1, x + 1 + dx, y + 1); 
       } 
       g.setColor(edge2); 
       g.drawLine(x + dx + 2, y, x + dx + 3, y); 
       g.drawLine(x + dx + 2, y + 1, x + dx + 3, y + 1); 
       x -= 1; 
       y += 2; 
       dx += 2; 
      } 
      g.setColor(edge1); 
      g.drawLine(xo, yo + size - 3, xo + 1, yo + size - 3); 
      g.setColor(edge2); 
      g.drawLine(xo + 2, yo + size - 2, xo + size - 1, yo + size - 2); 
      g.drawLine(xo, yo + size - 1, xo + size, yo + size - 1); 
     } 
    } 
} 
+0

Teşekkür ederiz! Tam olarak aradığım şey bu ve sonra bazıları. Sadece eğlence için özel bir sıralama simgesinden bile geçebilirsiniz :) (Nimbus Varsayılanı iyidir, ancak yine de teşekkürler.) Neyin mümkün olduğunu göstermek için güzel bir örnek. – Thorn

+0

Size yardımcı olmaktan memnun oldum, dikkat edin Hala emin değilim, aynı şeyleri yapmak için gerekecek eğer TableCellEditor :-) – mKorbel

+0

Eğer ben düzenleme sırasında odak renginin kalmasını istiyorsanız TabloCellEditor ile aynı şeyleri yapmak gerekir . Bu noktada, bunu nasıl yapacağımı tamamen anlıyorum, geriye kalanlar tam olarak ne yapmalı? TableCellEditor, kullanıcının odaklanmış bir hücreyi düzenlemeye başlamasından sonra neden değiştiğini (seçilen satır renginden beyaz arkaplana) açıklar. Muhtemelen istediğim şey bu - Çok önemli olduğundan emin değilim. Bu soru gerçekten görünüşle ilgili değildi, benim kullanıcıların bazıları olduğu için masaya daha sezgisel ve kullanışlı bir hale gelmekti. "O zaman" için – Thorn

1

örneğin seçiliyse.

Kişisel sınıfı DefaultTableCellRenderer uzanır ve yöntem getTableCellRendererComponent (JTable tablo, nesne değeri, mantıksal IsSelected, Boole hasFocus int satır, int kolonu) geçersiz .

örn.

public class SpreadsheetCellRenderer extends DefaultTableCellRenderer { 
    public Component getTableCellRendererComponent(JTable table, Object value, boolean isSelected, boolean hasFocus, int row, int column) { 
     /* the following is the similar to DefaultTableCellRenderer */ 
     if (isSelected) { 
      super.setForeground(Color.red); 
     } else { 
      super.setForeground(Color.black); 
     } 
    setText(value.toString()); 
    return this; 
    } 
} 

Sonra bunu yaparak tablodaki String nesneleri söylemek için varsayılan oluşturucu olarak bu renderer ayarlamanız gerekir.

table.setDefaultRenderer(Class.forName("java.lang.String"), new SpreadsheetCellRenderer()); 
+0

önde gelen benim için inanılmaz, Nimbus dışında bir mekanizma açıkça görüyorum, Ancak bu bir JTable'ın özelliklerini değiştirmek için genel bir yoldur. – Eamonn

+0

TableCellRenderer'ın farkındayım ve daha kolay bir yol arıyordum, ama net örnek için teşekkür ederim. Düşündüğümden özel bir hücre oluşturucu oluşturmak daha kolay. Ama buradan bir şey umuyordum: http://jasperpotts.com/blogfiles/nimbusdefaults/nimbus.html – Thorn

+0

@Thorn Cevabımı burada geri alacağım, sorun yok – mKorbel