2012-07-01 4 views
5

JTable (Nimbus L & F)에서 데이터를 편집 할 때 사용자가 셀에서 셀로 탭할 때 포커스가있는 셀이 명확하지 않습니다. 어느 셀에 포커스가 있는지 명확하게 할 수 있습니까? Nimbus를 수정할 수있는 많은 속성이 있다는 것을 알고 있습니다. 원하는 속성을 알고있는 사람이 있습니까? 가 기본으로하여JTable Nimbus Look and Feel - 어떤 셀에 포커스가 있는지 명확하게하는 방법

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

고마워요! 이것은 정확히 제가 찾고 있던 것입니다. 당신은 재미를 위해 커스텀 정렬 아이콘을 통해서조차도 :) (Nimbus Default는 괜찮지 만 어쨌든 고마워요.) 가능한 것을 설명하기위한 좋은 예입니다. – Thorn

+0

TableCellEditor에 대해 동일한 작업을 수행해야하는 경우 여전히 잘 모르겠 음을 알아 두십시오. – mKorbel

+0

편집하는 동안 포커스 색상을 유지하려면 TableCellEditor와 동일한 작업을 수행해야합니다. . 이 시점에서, 나는 이것을 어떻게하는지 완전히 이해하고 있으며, 남은 것은 정확히 무엇을 할 것인가의 결정입니다. TableCellEditor는 사용자가 포커스가있는 셀을 편집하기 시작한 후 모양이 변경되는 이유를 설명합니다 (선택한 행 색상에서 흰색 배경으로 변경). 그게 아마 내가 원하는 것일거야. 나는별로 중요하지 않다. 이 질문은 외관에 관한 것이 아니 었습니다. 내 사용자 중 일부는 익숙하지 않았기 때문에 테이블을 더 직관적으로 사용할 수있게 만드는 것이 었습니다. – Thorn

1

예를 들어 선택된 경우.

클래스는 하는 DefaultTableCellRenderer을 확장하고 방법 getTableCellRendererComponent (JTable의 테이블, 개체 값, 부울에 isSelected, 부울 hasFocus, INT 행, INT 열)를 오버라이드 (override) .

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

그런 다음이를 통해 테이블의 String 개체에 대한 렌더러를 기본 렌더러로 설정해야합니다.

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

그런데, 저는 분명히 Nimbus 외부의 메커니즘을 보여주고 있습니다. 그러나 이것은 JTable의 속성을 변경하는 일반적인 방법입니다. – Eamonn

+0

TableCellRenderer에 대해 알고 있고 쉬운 방법을 찾고 있었지만 명확한 예를 들어 주셔서 감사합니다. 생각보다 맞춤형 셀 렌더러를 만드는 것이 더 쉽습니다. 그러나 나는 여기에서 무엇인가를 기대하고 있었다 : http://jasperpotts.com/blogfiles/nimbusdefaults/nimbus.html – Thorn

+0

@ 꼬인 여기에 내 대답을 취소 할 것입니다. – mKorbel

관련 문제