2017-01-07 5 views
0

JavaFXでテーブルを作成しています。すべての行にテキストがあります。 1つの行にグラフィックが表示されるのは、そのセルのテキストに複数の色があるためです。JavaFX - 他の行よりも大きいTableColumnグラフィック

特定の条件が真である場合のみ(一部作品)適用コード:

departTimeCol.setCellFactory(column -> new TableCell<Ride, String>() { 
      @Override 
      protected void updateItem(String item, boolean empty) { 
       super.updateItem(item, empty); 

       setText(item); 

       if(item != null && ! empty){ 
        if(item.matches("^([0-9]|0[0-9]|1[0-9]|2[0-3]):[0-5][0-9]\\s\\+[\\d]")) { 
         Text timeText = new Text(item.split(" ")[0].trim() + " "); 
         Text delayText = new Text(item.split(" ")[1].trim()); 

         delayText.setFill(Color.RED); 

         TextFlow flow = new TextFlow(timeText, delayText); 

         setText(null); 
         setGraphic(flow); 

        } 
       } 
      } 
     }); 

結果は:

Result

行赤+2では、グラフィックであります。他のすべての行にはテキストが含まれます。グラフィックを含む行を同じ高さにするにはどうすればよいですか?

答えて

0

単にテキストを格納するのに必要な高さにするには、好ましい高さを0に設定します。

Pattern pattern = Pattern.compile("((?:[0-9]|[01][0-9]|2[0-3]):[0-5][0-9]\\s)(\\+\\d)"); 

departTimeCol.setCellFactory(column -> new TableCell<Ride, String>() { 

    private final Text timeText = new Text(); 
    private final Text delayText = new Text(); 
    private final TextFlow flow = new TextFlow(timeText, delayText); 

    { 
     delayText.setFill(Color.RED); 
     flow.setPrefHeight(0); 
     flow.heightProperty().addListener((observable, oldValue, newValue) -> { 
      this.setMinHeight(newValue.doubleValue() + 4); 
     }); 
     flow.setMinHeight(Region.USE_COMPUTED_SIZE); 
     setContentDisplay(ContentDisplay.GRAPHIC_ONLY); 
     setGraphic(flow); 
    } 

    @Override 
    protected void updateItem(String item, boolean empty) { 
     super.updateItem(item, empty); 

     if (empty || item == null) { 
      timeText.setText(""); 
      delayText.setText(""); 
      delayText.setVisible(false); 
     } else { 
      Matcher m = pattern.matcher(item); 
      if (m.matches()) { 
       timeText.setText(m.group(1)); 
       delayText.setText(m.group(2)); 
       delayText.setVisible(true); 
      } else { 
       timeText.setText(item); 
       delayText.setText(""); 
       delayText.setVisible(false); 
      } 
     } 

    } 
}); 

固定する必要があるコード内のいくつかのより多くのものがあることに注意してください:

  • あなたはStringは、もはや正規表現と一致した場合でも、バックnullにグラフィックを設定しない場合、または決してセルが空になります。つまり、TableCelltextプロパティが空でなく、graphicTextFlowを含む状態にすることができます。 注:updateItemメソッドが呼び出された回数に関係なく、渡された引数とは無関係に、常にセルの外観の状態が正しいことを確認してください。
  • あるケースではgraphic + a TextFlow、別のケースではtextプロパティを使用すると、一貫性のない外観が生成されます。 (スクリーンショットのテキストの一番左の部分を見てください!それらは正しく整列されていません)。
  • Cellを使用する目的は、ノードの不要な作成を防ぐためにノードを再利用していることです。 TextFlowを作り直すことで、この試みを破壊することができます。これらのノードを再利用する代わりに、updateItemメソッドを使用します。
  • はすでに入力全体が一致しているので、正規表現は^で始まる必要はありません。さらに、splitで使用される区切り文字は、正規表現に完全には等価ではありません。タブなど、以外のスペース文字があります。ただ、次のコードは...

    System.out.println("a\tb".matches(".\\s.")); 
    System.out.println("a\tb".split(" ")[1]); 
    

    あなたはまた、入力を解析し、+ MatcherPatternを使用してグループをキャプチャすることにより、同じステップでそれを一致させることができないかどうか確認します。この方法では、上記の問題もありません。

+0

ありがとうございました。私はあなたの解決策を試しましたが、+2は赤にならない:/ – Matthijs

+0

ああ、私の悪い。 setPrefHeightを設定しました! – Matthijs

関連する問題