2014-09-25 10 views
0

의심의 여지가 쉽게 해결할 수 있지만 평소와 같이, 나는 혼란 스럽다.

JCheckBox를 사용하여 JTable에서 렌더링 할 수없는 글꼴 패밀리 이름을 필터링하려고합니다. JTable에는, 인스톨 된 폰트 패밀리 명 (열 0), 샘플 알파벳 (열 1) 및 샘플 자리수 (열 2)가 포함됩니다.

1과 2의 열은 대응하는 폰트로 렌더링되어 셀의 텍스트를 렌더링 할 수없는 경우, 텍스트는 JTable.setValueAt (Object, int, int)를 사용해 「렌더링 불가능」으로 옮겨 놓을 수 있습니다.

그런 다음 "렌더링 할 수없는"필터를 사용하십시오. 그러나 표시되는 행만 필터링됩니다. 테이블의 맨 아래로 스크롤하여 필터를 적용하면 전체 테이블이 원하는대로 필터링됩니다.

가로 분할자를 움직이면 분배 자 자체가 변경된 셀 위로 이동할 때 자체를 다시 칠하지 않는다는 것을 알았습니다. 이것에 대한 어떤 도움도 인정 될 것입니다.

JTable RowFilter가 초기 호출을 필터링하지 않음

import java.awt.*; 
import java.awt.event.*; 

import java.util.*; 

import javax.swing.*; 
import javax.swing.border.*; 
import javax.swing.table.*; 

class run 
{ 
    public static void main(String args[]) 
    { 
     SwingUtilities.invokeLater(new Runnable() 
     { 
      public void run() 
      { 
       Viewer viewer = new Viewer(); 

       JFrame jframe = new JFrame(); 
       jframe.add(viewer); 
       jframe.createBufferStrategy(1); 
       jframe.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); 
       jframe.setLocation(50,50); 
       jframe.pack(); 
       jframe.setVisible(true); 
      } 
     }); 
    } 
} 

//---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- 

class Viewer extends JPanel 
{ 
    final static long serialVersionUID = 0; 

    String string_alphabet = "abcdefghijklmnopqrstuvwxyz"; 
    String string_digits = ""; 
    String string_punctuation = "`!:\";\',.-/(){}[]<>?"; 
    String string_symbols = "[email protected]#$%^&*_+=|\\"; 

    String string_installedFontsColumnNames[] = {"installed fonts","sample","sample"}; 
    String string_installedFonts[]; 

    DefaultTableModel defaultTableModel_installedFonts; 
    JTable jtable_installedFonts; 

    JSplitPane jsplitPane_horizontal; 
    JSplitPane jsplitPane_vertical; 

    JCheckBox jcheckBox_nonRenderable; 

    TableRowSorter<TableModel> tableRowSorter; 

    public Viewer() 
    { 
     this.setLayout(new BorderLayout()); 

     JPanel jpanel_installedFonts = new JPanel(new BorderLayout()); 

     GraphicsEnvironment graphicsEnvironment = GraphicsEnvironment.getLocalGraphicsEnvironment(); 

     string_installedFonts = graphicsEnvironment.getAvailableFontFamilyNames(); 

     Object object_tableData[][] = new Object[string_installedFonts.length][string_installedFontsColumnNames.length]; 

     for (int row = 0; row < object_tableData.length; row++) 
     { 
      Object object_columnData[] = new Object[string_installedFontsColumnNames.length]; 

      object_columnData[0] = string_installedFonts[row]; 
      object_columnData[1] = string_alphabet; 
      object_columnData[2] = string_digits; 

      object_tableData[row] = object_columnData; 
     } 

     defaultTableModel_installedFonts = new DefaultTableModel(object_tableData,string_installedFontsColumnNames); 

     tableRowSorter = new TableRowSorter<TableModel>(defaultTableModel_installedFonts); 

     jtable_installedFonts = new JTable(defaultTableModel_installedFonts); 
     jtable_installedFonts.setRowSorter(tableRowSorter); 

     jtable_installedFonts.getColumnModel().getColumn(0).setCellRenderer(new ColumnRenderer0()); 
     jtable_installedFonts.getColumnModel().getColumn(1).setCellRenderer(new ColumnRenderer1()); 
     jtable_installedFonts.getColumnModel().getColumn(2).setCellRenderer(new ColumnRenderer1()); 

     JScrollPane jscrollPane_installedFonts = new JScrollPane(jtable_installedFonts); 

     jpanel_installedFonts.add(jscrollPane_installedFonts,BorderLayout.CENTER); 

     JPanel jpanel_visibilityOptions = new JPanel(new GridLayout(1,2)); 
     jpanel_visibilityOptions.setBackground(Color.gray); 

     JPanel jpanel_nonRenderable = new JPanel(); 
     jpanel_nonRenderable.setBackground(Color.lightGray); 

     jcheckBox_nonRenderable = new JCheckBox("hide non-renderable fonts",false); 
     jcheckBox_nonRenderable.addActionListener(new ActionListener() 
     { 
      public void actionPerformed(ActionEvent actionEvent) 
      { 
       RowFilter<Object,Object> filter = null; 

       if (jcheckBox_nonRenderable.isSelected()) 
       { 
        filter = RowFilter.notFilter(RowFilter.regexFilter("non-renderable")); 
       } 

       tableRowSorter.setRowFilter(filter); 
      } 
     }); 

     jpanel_nonRenderable.add(jcheckBox_nonRenderable,BorderLayout.CENTER); 

     jpanel_visibilityOptions.add(new JPanel()); 
     jpanel_visibilityOptions.add(jpanel_nonRenderable); 

     jpanel_installedFonts.add(jpanel_visibilityOptions,BorderLayout.SOUTH); 

     jsplitPane_horizontal = new JSplitPane(JSplitPane.HORIZONTAL_SPLIT,jpanel_installedFonts,new JPanel()); 
     jsplitPane_horizontal.setBorder(new EmptyBorder(0,0,0,0)); 

     jsplitPane_vertical = new JSplitPane(JSplitPane.VERTICAL_SPLIT,jsplitPane_horizontal,new JPanel()); 
     jsplitPane_vertical.setBorder(new EmptyBorder(0,0,0,0)); 

     this.add(jsplitPane_vertical,BorderLayout.CENTER); 
    } 
} 

//---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- 

class ColumnRenderer0 implements TableCellRenderer 
{ 
    JLabel jlabel; 

    Color color_background; 
    Color color_foreground; 

    String string_cellText; 

    public ColumnRenderer0() 
    { 
     jlabel = new JLabel(); 
     jlabel.setBorder(new EmptyBorder(0,2,0,2)); 
     jlabel.setHorizontalAlignment(JLabel.LEFT); 
     jlabel.setOpaque(true); 
    } 

    public Component getTableCellRendererComponent(JTable jtable, Object object, boolean selected, boolean focus, int row, int column) 
    { 
     string_cellText = (String)object; 

     if (selected) 
     { 
      color_background = jtable.getSelectionBackground(); 
      color_foreground = jtable.getSelectionForeground(); 
     } 
     else 
     { 
      color_background = jtable.getBackground(); 
      color_foreground = jtable.getForeground(); 
     } 

     jlabel.setText(string_cellText); 
     jlabel.setBackground(color_background); 
     jlabel.setForeground(color_foreground); 

     return jlabel; 
    } 
} 

//---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- 

class ColumnRenderer1 implements TableCellRenderer 
{ 
    JLabel jlabel; 

    Color color_background; 
    Color color_foreground; 

    String string_cellText; 
    String string_fontFamily; 

    Font font; 
    Font font_jtable; 

    public ColumnRenderer1() 
    { 
     jlabel = new JLabel(); 
     jlabel.setBorder(new EmptyBorder(0,5,0,5)); 
     jlabel.setHorizontalAlignment(JLabel.CENTER); 
     jlabel.setOpaque(true); 
    } 

    public Component getTableCellRendererComponent(JTable jtable, Object object, boolean selected, boolean focus, int row, int column) 
    { 
     string_cellText = (String)object; 

     if (selected) 
     { 
      color_background = jtable.getSelectionBackground(); 
      color_foreground = jtable.getSelectionForeground(); 
     } 
     else 
     { 
      color_background = jtable.getBackground(); 
      color_foreground = jtable.getForeground(); 
     } 

     string_fontFamily = (String)jtable.getValueAt(row,0); 

     font_jtable = jtable.getFont(); 

     font = new Font(string_fontFamily,Font.PLAIN,font_jtable.getSize()); 

     if (font.canDisplayUpTo(string_cellText) != -1) 
     { 
      font = new Font(font_jtable.getFamily(),Font.BOLD,font_jtable.getSize()); 
      string_cellText = "non-renderable"; 
      jtable.setValueAt(string_cellText,row,column); 
      color_foreground = Color.red; 

     } 

     jlabel.setFont(font); 
     jlabel.setText(string_cellText); 
     jlabel.setBackground(color_background); 
     jlabel.setForeground(color_foreground); 

     return jlabel; 
    } 
} 
+1

문제는 셀이 렌더링 될 때까지 텍스트가 처음에 설정된 것으로 유지되고 보이지 않는 셀은 렌더링되지 않습니다. 렌더러 내에서 모델의 상태를 수정해서는 안되며, 대신 테이블 모델 – MadProgrammer

+0

@MadProgrammer를 작성할 때 폰트가 렌더링 가능한지 여부를 사전에 결정해야합니다. 렌더링하기 전에 검사하는 것과 관련하여 정확합니다. 그것은 또한 문제를 그리지 않는 분배기를 고쳤다. 나는 물어야한다, 당신이 모르는 어떤 것이 있는가? – johnny

+0

내가 알지 못하는 것은 내가 비가 내리는 것을 채울 수 없다는 것을 알고있는 것에 비해 우주를 채울 수있다. 나는 알고있다. 나는 실수도했다.) – MadProgrammer

답변

1

문제는 셀이 렌더링 될 때까지 텍스트가 처음이에 설정 무엇 남아있다. 표시되지 않는 셀은 렌더링되지 않으므로 모델이 업데이트되지 않습니다. 필터링은 다른 이유로 다른 시간에 발생합니다.

렌더러 내에서 모델의 상태를 수정하면 안되며, 대신 테이블 모델을 구성하고 이에 따라 셀 값을 설정할 때 글꼴이 렌더링 가능한지 여부를 미리 결정해야합니다.