2

ブールレンダラーとブールエディターを作成してみました。

ブールレンダラーは、ブール値を色(2色)としてレンダリングする必要があります。ブールエディタはJTextFieldを返し、文字列「T」および「F」として編集できるようにする必要があります

したがって、セルをクリックして「T」または「F」と入力すると、セルの色が対応する色にシフトする必要があります。

このオラクルのチュートリアルに基づいて、レンダラーとエディターを作成し、このオラクルが提供する例に含めようとしました。

ブールレンダラーとブールエディターの下。このクラスに登録しました。

        ....
        ....

        table.setDefaultRenderer(Color.class,
                new ColorRenderer(true));
        table.setDefaultEditor(Color.class,
                new ColorEditor());


        table.setDefaultRenderer(Boolean.class, new BooleanRenderer()); // My
        table.setDefaultEditor(Boolean.class, new BooleanEditor());     // My

        //Add the scroll pane to this panel.
        add(scrollPane);
        ....
        ....

セルはまったくレンダリングされず、期待どおりに機能しません。

私のコードの何が問題になっていますか?

私のレンダラー:

import java.awt.Color;
import java.awt.Component;
import javax.swing.JLabel;
import javax.swing.JTable;
import javax.swing.JTextField;
import javax.swing.table.TableCellEditor;
import javax.swing.table.TableCellRenderer;


public class BooleanRenderer extends JLabel implements TableCellRenderer
{
    @Override
    public Component getTableCellRendererComponent(JTable table, Object value, boolean isSelected, boolean hasFocus, int row, int column)
    {
        if (hasFocus)
        {
            Boolean bol = (Boolean) value;
            if (bol == Boolean.FALSE)
            {
                this.setBackground(Color.red);
                this.setText("");
            } else if (bol == Boolean.TRUE)
            {
                this.setBackground(Color.BLACK);
            }
        }
        else
        {
            Boolean bol = (Boolean) value;
            if (bol == Boolean.FALSE)
            {
                this.setBackground(Color.red);
                this.setText("");
            } else if (bol == Boolean.TRUE)
            {
                this.setBackground(Color.BLACK);
            }
        }

        if (isSelected)
        {
            Boolean bol = (Boolean) value;
            if (bol == Boolean.FALSE)
            {
                this.setBackground(Color.red);
                this.setText("");
            } else if (bol == Boolean.TRUE)
            {
                this.setBackground(Color.BLACK);
            }
        } else
        {
            Boolean bol = (Boolean) value;
            if (bol == Boolean.FALSE)
            {
                this.setBackground(Color.red);
                this.setText("");
            } else if (bol == Boolean.TRUE)
            {
                this.setBackground(Color.BLACK);
            }
        }


        return this;
    }
}

私の編集者:

import java.awt.Component;
import javax.swing.AbstractCellEditor;
import javax.swing.JTable;
import javax.swing.JTextField;
import javax.swing.table.TableCellEditor;


public class BooleanEditor extends AbstractCellEditor
        implements TableCellEditor
{

    Boolean bool;
    JTextField tf = new JTextField();

    @Override
    public Object getCellEditorValue()
    {
        return bool;
    }

    @Override
    public Component getTableCellEditorComponent(JTable table, Object value, boolean isSelected, int row, int column)
    {


        if (isSelected)
        {
            bool = (Boolean) value;
            if (tf.getText().equals("T"))
            {
                bool = new Boolean(true);
            } else
            {
                if (tf.getText().equals("F"))
                {
                    bool = new Boolean(false);
                }
            }

        }
        return tf;
    }
}
4

1 に答える 1

4

レンダラーの場合:
コンストラクターを指定し、コンストラクター内で不透明に設定する必要があります。

public BooleanRenderer() {
  setOpaque(true);
}

それ以外の場合、JLabelは背景色をまったく表示しません。

JTableセルエディタの場合:

  • まず第一に、正しいテキストを入力するのはユーザーに任されているので、私はあなたのデザインに反対することをお勧めしなければなりません。「T」または「F」はユーザー入力エラーを起こしやすいからです。JComboBoxを使用するなど、彼に選択肢を与える方がよいでしょう。
  • 次に、if (isSelected)エディターでブロックを削除します。エディターは必要に応じて呼び出され、選択すると誤ってコードが機能しなくなる可能性があります。
  • 最も重要なのは、エディターのブールフィールドを削除することです。このgetCellEditorValue()メソッドで、コンポーネントにその値を照会し、この値に基づいて適切なブール値を返します。

例えば:

public class BooleanEditor extends AbstractCellEditor implements TableCellEditor {

   JComboBox<Boolean> combo = new JComboBox<Boolean>(new Boolean[] {
         Boolean.TRUE, Boolean.FALSE });

   public BooleanEditor() {
      combo.setRenderer(new DefaultListCellRenderer() {
         @Override
         public Component getListCellRendererComponent(JList<?> list,
               Object value, int index, boolean isSelected, boolean cellHasFocus) {
            Boolean boolValue = (Boolean) value;
            String displayString = "";
            if (boolValue == null) {
               displayString = "";
            } else if (boolValue) {
               displayString = "T";
            } else {
               displayString = "F";
            }
            return super.getListCellRendererComponent(list, displayString,
                  index, isSelected, cellHasFocus);
         }
      });
   }

   @Override
   public Object getCellEditorValue() {
      return combo.getSelectedItem();
   }

   @Override
   public Component getTableCellEditorComponent(JTable table, Object value,
         boolean isSelected, int row, int column) {
      if (value == null) {
         combo.setSelectedIndex(-1);
      } else {
         combo.setSelectedItem((Boolean) value);
      }
      return combo;
   }
}

私のSSCCE全体:

import java.awt.*;
import javax.swing.*;
import javax.swing.table.*;

public class BoolColorTable {
   @SuppressWarnings("serial")
   private static void createAndShowGui() {
      // null just to test how code will react to this situation
      // that hopefully won't occur
      Boolean[][] data = { null, { true }, { false }, { true }, { false },
            { false }, { true } };
      String[] colNames = { "Data" };
      DefaultTableModel model = new DefaultTableModel(data, colNames);
      JTable table = new JTable(model) {
         @Override
         public Class<?> getColumnClass(int column) {
            if (column == 0) {
               return Boolean.class;
            }
            return super.getColumnClass(column);
         }
      };

      table.setDefaultRenderer(Boolean.class, new BooleanRenderer());
      table.setDefaultEditor(Boolean.class, new BooleanEditor());

      JScrollPane mainPanel = new JScrollPane(table);

      JFrame frame = new JFrame("BoolColorTable");
      frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
      frame.getContentPane().add(mainPanel);
      frame.pack();
      frame.setLocationByPlatform(true);
      frame.setVisible(true);
   }

   public static void main(String[] args) {
      SwingUtilities.invokeLater(new Runnable() {
         public void run() {
            createAndShowGui();
         }
      });
   }
}

@SuppressWarnings("serial")
class BooleanRenderer extends JLabel implements TableCellRenderer {
   public BooleanRenderer() {
      setOpaque(true);
   }

   @Override
   public Component getTableCellRendererComponent(JTable table, Object value,
         boolean isSelected, boolean hasFocus, int row, int column) {
      Boolean boolValue = (Boolean) value;
      if (boolValue == null) {
         setBackground(null);
      } else {
         if (!boolValue) {
            this.setBackground(Color.red);
         } else {
            this.setBackground(Color.BLACK);
         }
      }
      return this;
   }
}

@SuppressWarnings("serial")
class BooleanEditor extends AbstractCellEditor implements TableCellEditor {

   JComboBox<Boolean> combo = new JComboBox<Boolean>(new Boolean[] {
         Boolean.TRUE, Boolean.FALSE });

   public BooleanEditor() {
      combo.setRenderer(new DefaultListCellRenderer() {
         @Override
         public Component getListCellRendererComponent(JList<?> list,
               Object value, int index, boolean isSelected, boolean cellHasFocus) {
            Boolean boolValue = (Boolean) value;
            String displayString = "";
            if (boolValue == null) {
               displayString = "";
            } else if (boolValue) {
               displayString = "T";
            } else {
               displayString = "F";
            }
            return super.getListCellRendererComponent(list, displayString,
                  index, isSelected, cellHasFocus);
         }
      });
   }

   @Override
   public Object getCellEditorValue() {
      return combo.getSelectedItem();
   }

   @Override
   public Component getTableCellEditorComponent(JTable table, Object value,
         boolean isSelected, int row, int column) {
      if (value == null) {
         combo.setSelectedIndex(-1);
      } else {
         combo.setSelectedItem((Boolean) value);
      }
      return combo;
   }
}

編集ユーザーが「T」または「F」を入力できるようにする必要がある場合は、これを実行して、大文字と小文字を区別しない3つのテキストのみを許可するDocumentFilterをエディターのJTextFieldに追加することで、ほとんどばかげた証拠にすることができます
。フィールドエントリ:「t」、「f」、または空。

例えば:

@SuppressWarnings("serial")
class BooleanStringEditor extends AbstractCellEditor implements TableCellEditor {
   private JTextField textField = new JTextField();

   public BooleanStringEditor() {
      PlainDocument doc = (PlainDocument) textField.getDocument();
      doc.setDocumentFilter(new MyDocFilter());
   }

   @Override
   public Object getCellEditorValue() {
      if (textField.getText().equalsIgnoreCase("t")) {
         return Boolean.TRUE;
      } else if (textField.getText().equalsIgnoreCase("f")) {
         return Boolean.FALSE;
      }
      // default if user messes up
      return null;
   }

   @Override
   public Component getTableCellEditorComponent(JTable table, Object value,
         boolean isSelected, int row, int column) {
      Boolean boolValue = (Boolean) value;
      if (boolValue == null) {
         textField.setText("");
      } else if (boolValue) {
         textField.setText("T");
      } else {
         textField.setText("F");
      }
      return textField;
   }

}

class MyDocFilter extends DocumentFilter {

   private boolean test(String text) {
      if (text.isEmpty()) {
         return true;
      }
      if (text.equalsIgnoreCase("t") || text.equalsIgnoreCase("f")) {
         return true;
      }
      return false;
   }

   @Override
   public void insertString(FilterBypass fb, int offset, String string,
         AttributeSet attr) throws BadLocationException {

      Document doc = fb.getDocument();
      StringBuilder sb = new StringBuilder();
      sb.append(doc.getText(0, doc.getLength()));
      sb.insert(offset, string);

      if (test(sb.toString())) {
         super.insertString(fb, offset, string, attr);
      } else {
         // warn the user and don't allow the insert
      }
   }

   @Override
   public void replace(FilterBypass fb, int offset, int length, String text,
         AttributeSet attrs) throws BadLocationException {

      Document doc = fb.getDocument();
      StringBuilder sb = new StringBuilder();
      sb.append(doc.getText(0, doc.getLength()));
      sb.replace(offset, offset + length, text);

      if (test(sb.toString())) {
         super.replace(fb, offset, length, text, attrs);
      } else {
         // warn the user and don't allow the insert
      }

   }

   @Override
   public void remove(FilterBypass fb, int offset, int length)
         throws BadLocationException {
      Document doc = fb.getDocument();
      StringBuilder sb = new StringBuilder();
      sb.append(doc.getText(0, doc.getLength()));
      sb.delete(offset, offset + length);

      if (test(sb.toString())) {
         super.remove(fb, offset, length);
      } else {
         // warn the user and don't allow the insert
      }

   }
}
于 2013-01-02T22:21:03.387 に答える