2016-02-02 5 views
1

Я хочу автоматически задать ширину столбца, чтобы заголовок таблицы был привязан к его контенту.Как установить ширину столбца столбца каждого столбца в таблице

@Override 
public void initialize(URL url, ResourceBundle rb) { 
    TableColumn<String, String> col1 = new TableColumn<>("C1"); 
    TableColumn<String, String> col2 = new TableColumn<>("Column 2"); 
    TableColumn<String, String> col3 = new TableColumn<>("Last Column (C3)"); 
    TableColumn<String, String> col4 = new TableColumn<>("blablabla"); 
    table.getColumns().add(col1); 
    table.getColumns().add(col2); 
    table.getColumns().add(col3); 
    table.getColumns().add(col4); 
    for(int i=0;i<4;i++) { 
     System.out.println("Column width >> "+table.getColumns().get(i).getPrefWidth()); 
    } 
} 

Колонку-ширина каждого заголовка в виде таблицы всегда устанавливается в значение 80. Как я могу получить и установить значения ширины, чтобы заголовки заголовков были видны в каждом заголовке столбца?

+0

Вы пытались установить 'prefWidth' в' Control.USE_COMPUTED_SIZE'? – Itai

+0

@sillyfly это не работает. на этот раз ширина устанавливается равной 10.0 для каждого заголовка colum. – DummyTester

+0

Вы можете попробовать мой ответ. Если это не то, что вы хотели. Вам нужно вычислить ширину строки содержимого каждого столбца и установить ее ширину для самой длинной ширины строки. – Marcel

ответ

1

Вы можете использовать FontMetrics здесь:

TableColumn<String, String> column1 = new TableColumn<>("C1"); 
    TableColumn<String, String> column2 = new TableColumn<>("Column 2"); 
    TableColumn<String, String> column3 = new TableColumn<>("Last Column (C3)"); 
    TableColumn<String, String> column4 = new TableColumn<>("blablabla"); 
    table.getSelectionModel().getSelectedIndex(); 
    table.getColumns().add(column1); 
    table.getColumns().add(column2); 
    table.getColumns().add(column3); 
    table.getColumns().add(column4); 

    FontMetrics fontMetrics = Toolkit.getToolkit().getFontLoader().getFontMetrics(new Font("Arial", 12)); 

    for (int i = 0; i < 4; i++) { 
     String text = table.getColumns().get(i).getText(); 
     double textwidth =  fontMetrics.computeStringWidth(text); 
     table.getColumns().get(i).setPrefWidth(textwidth + 10); 
    } 
+0

Марсель благодарит! – DummyTester

+0

Нет проблем. Pls принимает ответ, если это вам помогло. – Marcel

0

Вы можете попробовать: Колонка Resize политика: https://docs.oracle.com/javase/8/javafx/api/javafx/scene/control/TableView.html#getColumnResizePolicy--

 table.setColumnResizePolicy(TableView.CONSTRAINED_RESIZE_POLICY); 

См Скриншоты:

UNCONSTRAINED_RESIZE_POLICY UNCONSTRAINED_RESIZE_POLICY CONSTRAINED_RESIZE_POLICY CONSTRAINED_RESIZE_POLICY

+0

Это не изменяет размер контента и не позволяет изменять размер ниже или ниже общей ширины таблицы. Я думаю, что ОП спросил о чем-то вроде того, что вы получаете, когда вы дважды щелкаете по разделителю столбцов. – Itai

+0

Да, я, вероятно, неправильно прочитал его вопрос ^^ – Marcel

+0

, о котором упоминалось как sillyfly, я пытаюсь найти решение для resizibg столбца, который автоматически соответствует ширине его содержимого. – DummyTester

0

хорошо я нашел простой способ, как изменить размер header-columns в его содержимое. Ссылаясь на FontMetrics вычисляет ширину текста и после того, как вы в состоянии установить правильную ширину

package tabledemo; 
import java.awt.Font; 
import java.awt.font.FontRenderContext; 
import java.awt.geom.AffineTransform; 
import java.net.URL; 
import java.util.ResourceBundle; 
import javafx.fxml.*; 
import javafx.scene.control.*; 

public class FXMLDocumentController implements Initializable { 
    @FXML private TableView<String> table; 
    @Override 
    public void initialize(URL url, ResourceBundle rb) { 
     TableColumn<String, String> column1 = new TableColumn<>("C1"); 
     TableColumn<String, String> column2 = new TableColumn<>("Column 2"); 
     TableColumn<String, String> column3 = new TableColumn<>("Last Column (C3)"); 
     TableColumn<String, String> column4 = new TableColumn<>("blablabla"); 
     table.getSelectionModel().getSelectedIndex(); 
     table.getColumns().add(column1); 
     table.getColumns().add(column2); 
     table.getColumns().add(column3); 
     table.getColumns().add(column4); 
     for(int i=0;i<4;i++) { 
      String text = table.getColumns().get(i).getText(); 
      AffineTransform affinetransform = new AffineTransform();  
      FontRenderContext frc = new FontRenderContext(affinetransform,true,true);  
      Font font = new Font("Arial", Font.PLAIN, 12); //assuming 'Arial' is standard font in TableView 
      double textwidth = (double)(font.getStringBounds(text, frc).getWidth()); 
      table.getColumns().get(i).setPrefWidth(textwidth+10); 
     }    
    }  
} 

Header-width fitted to its content

+0

Это правильный путь. Но я бы посоветовал использовать JavaFX api: \t \t FontMetrics fontMetrics = Toolkit.getToolkit(). GetFontLoader(). GetFontMetrics (новый шрифт («Arial», 12)); \t \t fontMetrics.computeStringWidth (текст); Но его не публичный api, поэтому будьте осторожны с его использованием. – Marcel

+0

@ Марсель благодарит вас за советы – DummyTester

0

Еще одна вещь, которую я рекомендую вам нужно сначала рассмотреть стиль текста заголовка столбца, чтобы использовать fontMetrics.

Анализатор CSS или senicView окажет большую помощь, чтобы не пропустить свойство css.

Смежные вопросы