2012-07-01 28 views
5

जब JTable (Nimbus L & F) में डेटा संपादित करते समय उपयोगकर्ता सेल से सेल तक टैब करता है, तो यह स्पष्ट नहीं है कि सेल किस पर केंद्रित है। मैं इसे स्पष्ट कैसे कर सकता हूं कि सेल किस फोकस पर केंद्रित है? मुझे पता है कि कई संपत्तियां हैं जिन्हें निंबस को संशोधित करने के लिए सेट किया जा सकता है - क्या किसी को पता है कि मैं कौन सी संपत्ति चाहता हूं?जेटीबल निंबस देखो और महसूस करें - यह स्पष्ट करने के लिए कि कौन सा सेल फोकस कर रहा है

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

JTable screen shot

उत्तर

3
  • आप Renderer concept पर नजर है,

  • डिफ़ॉल्ट द्वारा के लिए काम करता है:

    स्क्रीन के नीचे गोली मार दी केवल एक ही संपत्ति डिफ़ॉल्ट के अलावा कुछ करने के लिए सेट है Nimbus Look and Feel,

  • कुछ मुद्दे JButtons components (JCheckBox e.i.) साथ हो सकता है, लेकिन कई बार जवाब या इस मंच पर हल कर रहे हैं

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

धन्यवाद! यह वही है जो मैं खोज रहा था और फिर कुछ। आप मज़ेदार के लिए एक कस्टम सॉर्टिंग आइकन में भी :) :) (निम्बस डिफॉल्ट ठीक है, लेकिन वैसे भी धन्यवाद।) यह दिखाने के लिए अच्छा उदाहरण है कि क्या संभव है। – Thorn

+0

आपकी मदद करने में प्रसन्नता है, ध्यान दें कि मुझे अभी भी यकीन नहीं है, अगर आपको TableCellEditor :-) – mKorbel

+0

के लिए एक ही चीज करने की आवश्यकता होगी, तो मुझे टेबलसेल एडिटर के साथ वही काम करने की आवश्यकता होगी यदि मैं संपादन करते समय फोकस रंग रहना चाहता हूं । इस बिंदु पर, मैं पूरी तरह से यह समझने के लिए समझता हूं कि क्या करना बाकी है इसका निर्णय क्या है। TableCellEditor बताता है कि उपयोगकर्ता एक केंद्रित सेल को संपादित करना शुरू करने के बाद, देखो बदलता है (चयनित पंक्ति रंग से सफेद पृष्ठभूमि तक)। शायद यही मैं चाहता हूं-मुझे यकीन नहीं है कि यह बहुत मायने रखता है। यह प्रश्न वास्तव में उपस्थिति के बारे में नहीं था, यह मेरे कुछ उपयोगकर्ताओं के बाद से तालिका को अधिक सहज और उपयोग करने योग्य बनाने के बारे में था, चलो समझदार नहीं कहें। "फिर कुछ" के लिए – Thorn

1

आप एक कस्टम सेल रेंडरर वर्ग जो अग्रभूमि रंग बदल जाएगा बनाने की जरूरत उदाहरण के लिए यदि चुना गया है।

आपका वर्ग DefaultTableCellRenderer का विस्तार होगा और विधि getTableCellRendererComponent (JTable मेज, वस्तु मूल्य, बूलियन isSelected, बूलियन hasFocus, पूर्णांक पंक्ति, पूर्णांक स्तंभ) ओवरराइड।

उदा।

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; 
    } 
} 

तो फिर तुम डिफ़ॉल्ट रेंडरर के रूप में आती है जिससे दाता सेट करने के लिए कहते हैं के लिए ऐसा करके तालिका में स्ट्रिंग वस्तुओं की जरूरत है।

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

वैसे, मैं स्पष्ट रूप से निंबस के बाहर एक तंत्र दिखा रहा हूं, लेकिन यह एक जेटीबल के गुणों को बदलने का एक सामान्य तरीका है। – Eamonn

+0

मुझे टेबलसेलरेंडर के बारे में पता है और एक आसान तरीका ढूंढ रहा था, लेकिन स्पष्ट उदाहरण के लिए धन्यवाद। मैंने सोचा कि एक कस्टम सेल रेंडरर बनाना आसान है। लेकिन मैं यहां से कुछ की उम्मीद कर रहा था: http://jasperpotts.com/blogfiles/nimbusdefaults/nimbus।एचटीएमएल – Thorn

+0

@ थॉर्न मैं अपना जवाब यहां मिटा दूंगा, कोई समस्या नहीं – mKorbel