TableView: Anzahl der sichtbaren Zeilen anpassen
Ich verwende diese Tabelle, um die Anzeige von Daten in der Tabellenansicht:
import javafx.application.Application;
import javafx.beans.property.IntegerProperty;
import javafx.beans.property.SimpleIntegerProperty;
import javafx.beans.property.SimpleStringProperty;
import javafx.beans.value.ChangeListener;
import javafx.beans.value.ObservableValue;
import javafx.collections.FXCollections;
import javafx.collections.ObservableList;
import javafx.scene.Node;
import javafx.scene.Scene;
import javafx.scene.control.ComboBox;
import javafx.scene.control.Pagination;
import javafx.scene.control.TableColumn;
import javafx.scene.control.TableView;
import javafx.scene.control.cell.PropertyValueFactory;
import javafx.scene.layout.AnchorPane;
import javafx.scene.layout.VBox;
import javafx.stage.Stage;
import javafx.util.Callback;
public class MainApp extends Application
{
IntegerProperty intP = new SimpleIntegerProperty(5);
AnchorPane anchor = new AnchorPane();
Scene scene;
ObservableList<Integer> options
= FXCollections.observableArrayList(
5,
10,
15,
20);
final ComboBox comboBox = new ComboBox(options);
final ObservableList<Person> data = FXCollections.observableArrayList(
new Person("1", "Joe", "Pesci"),
new Person("2", "Audrey", "Hepburn"),
new Person("3", "Gregory", "Peck"),
new Person("4", "Cary", "Grant"),
new Person("5", "De", "Niro"),
new Person("6", "Katharine", "Hepburn"),
new Person("7", "Jack", "Nicholson"),
new Person("8", "Morgan", "Freeman"),
new Person("9", "Elizabeth", "Taylor"),
new Person("10", "Marcello", "Mastroianni"),
new Person("11", "Innokenty", "Smoktunovsky"),
new Person("12", "Sophia", "Loren"),
new Person("13", "Alexander", "Kalyagin"),
new Person("14", "Peter", "OToole"),
new Person("15", "Gene", "Wilder"),
new Person("16", "Evgeny", "Evstegneev"),
new Person("17", "Michael", "Caine"),
new Person("18", "Jean-Paul", "Belmondo"),
new Person("19", " Julia", "Roberts"),
new Person("20", "James", "Stewart"),
new Person("21", "Sandra", "Bullock"),
new Person("22", "Paul", "Newman"),
new Person("23", "Oleg", "Tabakov"),
new Person("24", "Mary", "Steenburgen"),
new Person("25", "Jackie", "Chan"),
new Person("26", "Rodney", "Dangerfield"),
new Person("27", "Betty", "White"),
new Person("28", "Eddie", "Murphy"),
new Person("29", "Amitabh", "Bachchan"),
new Person("30", "Nicole", "Kidman"),
new Person("31", "Adriano", "Celentano"),
new Person("32", "Rhonda", " Fleming's"),
new Person("32", "Humphrey", "Bogart"));
private Pagination pagination;
public static void main(String[] args) throws Exception
{
launch(args);
}
public int itemsPerPage()
{
return 1;
}
public int rowsPerPage()
{
return intP.get();
}
public VBox createPage(int pageIndex)
{
int lastIndex = 0;
int displace = data.size() % rowsPerPage();
if (displace > 0)
{
lastIndex = data.size() / rowsPerPage();
}
else
{
lastIndex = data.size() / rowsPerPage() - 1;
}
VBox box = new VBox();
int page = pageIndex * itemsPerPage();
for (int i = page; i < page + itemsPerPage(); i++)
{
TableView<Person> table = new TableView<>();
TableColumn numCol = new TableColumn("ID");
numCol.setCellValueFactory(new PropertyValueFactory<>("num"));
numCol.setMinWidth(20);
TableColumn firstNameCol = new TableColumn("First Name");
firstNameCol.setCellValueFactory(new PropertyValueFactory<>("firstName"));
firstNameCol.setMinWidth(160);
TableColumn lastNameCol = new TableColumn("Last Name");
lastNameCol.setCellValueFactory(new PropertyValueFactory<>("lastName"));
lastNameCol.setMinWidth(160);
table.getColumns().addAll(numCol, firstNameCol, lastNameCol);
if (lastIndex == pageIndex)
{
table.setItems(FXCollections.observableArrayList(data.subList(pageIndex * rowsPerPage(), pageIndex * rowsPerPage() + displace)));
}
else
{
table.setItems(FXCollections.observableArrayList(data.subList(pageIndex * rowsPerPage(), pageIndex * rowsPerPage() + rowsPerPage())));
}
box.getChildren().addAll(table);
}
return box;
}
@Override
public void start(final Stage stage) throws Exception
{
scene = new Scene(anchor, 450, 450);
comboBox.valueProperty().addListener(new ChangeListener<Number>()
{
@Override
public void changed(ObservableValue o, Number oldVal, Number newVal)
{
//System.out.println(newVal.intValue());
intP.set(newVal.intValue());
paginate();
}
});
paginate();
stage.setScene(scene);
stage.setTitle("Table pager");
stage.show();
}
public void paginate()
{
pagination = new Pagination((data.size() / rowsPerPage() + 1), 0);
// pagination = new Pagination(20 , 0);
// pagination.setStyle("-fx-border-color:red;");
pagination.setPageFactory(new Callback<Integer, Node>()
{
@Override
public Node call(Integer pageIndex)
{
if (pageIndex > data.size() / rowsPerPage() + 1)
{
return null;
}
else
{
return createPage(pageIndex);
}
}
});
AnchorPane.setTopAnchor(pagination, 10.0);
AnchorPane.setRightAnchor(pagination, 10.0);
AnchorPane.setBottomAnchor(pagination, 10.0);
AnchorPane.setLeftAnchor(pagination, 10.0);
AnchorPane.setBottomAnchor(comboBox, 40.0);
AnchorPane.setLeftAnchor(comboBox, 12.0);
anchor.getChildren().clear();
anchor.getChildren().addAll(pagination, comboBox);
}
public static class Person
{
private final SimpleStringProperty num;
private final SimpleStringProperty firstName;
private final SimpleStringProperty lastName;
private Person(String id, String fName, String lName)
{
this.firstName = new SimpleStringProperty(fName);
this.lastName = new SimpleStringProperty(lName);
this.num = new SimpleStringProperty(id);
}
public String getFirstName()
{
return firstName.get();
}
public void setFirstName(String fName)
{
firstName.set(fName);
}
public String getLastName()
{
return lastName.get();
}
public void setLastName(String fName)
{
lastName.set(fName);
}
public String getNum()
{
return num.get();
}
public void setNum(String id)
{
num.set(id);
}
}
}
Wenn ich die Anzahl der Zeilen mit Kombinationsfeld nur die Daten in den Zeilen der Tabelle geändert wird. Tisch-Höhe wird nicht verändert.
Gibt es eine Möglichkeit, leere Zeilen entfernen?
Kommentar zu dem Problem - Öffnen
Ändern tableview Höhe und das entfernen leerer Zeilen sind zwei verschiedene Dinge. Werden bestimmte. Für das entfernen von Zeilen finden Sie unter fxexperience.com/2011/11/...
InformationsquelleAutor der Frage user1285928 | 2014-10-10
Du musst angemeldet sein, um einen Kommentar abzugeben.
Ändern tableview die Höhe und die Entfernung des "leeren" Zeilen sind zwei verschiedene Dinge. Werden bestimmte.
Für das entfernen von Zeilen finden Sie unter dieses tutorial.
Zur änderung der Höhe legen Sie zunächst die
fixedCellSizeProperty
der Tabelle anzeigen, dann verwenden Sie es in der Bindung:Hinzufügen 30px ist für tableview in die Kopfzeile.
InformationsquelleAutor der Antwort Uluk Biy
Leider Konfiguration der visiblerowcount auf den Wert nicht unterstützt wird, in TableView (Sie können prüfen, die Einreichung einer feature-Anfrage in fx' jira - keine Notwendigkeit, schon vor Jahren). Und es ist nicht ganz einfach zu lassen, der Blick zurück ein prefHeight basierend auf einer solchen Präferenz: wir müssen Messen Sie die Größe Anforderungen der "echten" Zelle, und das ist irgendwie begraben innerhalb der Därme.
Nur zum Spaß, experimentiert mit der Ausweitung der ganze Stapel der Mitarbeiter:
Code:
Beachten Sie, dass Sie möglicherweise Weg mit einem einfachen überschreiben der Tabelle prefHeight, wenn man eine Feste Zelle-Größe, nicht versuchen, dass - no risk no fun 🙂
InformationsquelleAutor der Antwort kleopatra
Hier ist meine Lösung, um nicht zu tief hängt
table.getFixedCellSize
(wir noch von ihm abhängen, während der FX-Initialisierung, während CSS ist noch nicht berechnet/angelegt werden).Beachten Sie, dass wir müssen auch hinzufügen, dass einige Pixel (verstehe nicht warum).
InformationsquelleAutor der Antwort Fred Danna
Gibt es einen Weg, es zu tun... ja, was Sie tun müssen, ist, wenn Sie die Tabelle erstellen (da Sie Sie neu erstellen jedes mal, wenn Sie eine neue Nummer), die Sie benötigen, um zu berechnen, was die Höhe des Tisches ist mit der aktuellen Anzahl der Einträge und verwenden Sie dann die
setPrefHeight()
Eigentum der TableView, um die Tabelle kleiner zu machen nur diese Zeilen.Spielte ich mit ihm ein wenig, und ich fand keine schnellen Lösungen, um diese zu berechnen, die Größe des Tisches richtig, so habe ich keinen code für Sie, aber das ist, was Sie tun müssen. Man könnte auch den 'Stil' der Tabelle nicht die abwechselnde Farbgebung, die machen würde, die Zeilen unten, auf die Daten schauen "leeren", auch wenn es einige Leerzeichen.
Glück!
InformationsquelleAutor der Antwort WillBD
Ändern Sie einfach die Hintergrundfarbe des leeren Zeilen mit css
werden und ändern der Anzahl der Zeilen, die auf der Grundlage des Kombinationsfeldes.
InformationsquelleAutor der Antwort vinay
Wenn Sie nicht verheiratet Bindungen, eine einfache Möglichkeit, dies zu tun ist, um die Berechnung der gewünschten Höhe auf der Grundlage der festen Größe der Zelle (cf. Fred Danna Antwort) und aktualisieren Sie es mit einem listener auf die Tabelle data.
In
start(Stage)
wir erstellen die Tabelle und fügen Sie eineListChangeListener
:Beachten Sie, dass die table-header-Zeile nicht vorhanden ist, bis nach
stage.show()
, so die einfachste Sache zu tun ist, zu warten, legen Sie die Tabelle Daten bis dahin.Alternativ könnten wir mit der Aufstellung der Daten in Tabelle Bauzeit, und rufen Sie dann
setTableHeightByRowCount()
ausdrücklich:InformationsquelleAutor der Antwort David Moles