JavaFX GUI nachbauen

lam_tr

Top Contributor
Hallo zusammen,

ich habe hier mal eine schöne Oberfläche gefunden

Papierkram_Screenshot_1.png

Kann mir mal jemand sagen wie ich unegfähr das nachbauen kann.

Die Tabs sind ziemlich cool, wie style ich die mit CSS?
Dieser Balken in der Mitte kann ich bestimmt auch mit BarChart machen, aber wie mache ich das dann mit dem Grau dahinter?

Weiter unten sind es wieder Tabs die recht gut aussehen.

Ich glaub mein Problem hier hauptsächlich ist wieder bekannt das CSS Problem.

Sonst lässt sich alles mit JavaFX realisieren.

Wie kann man am besten Charts designen von Farben her? (Standard Farben von JavaFX sind auch nicht schön)

Hoffe ihr könnt mir da ein paar Gedankanstöße geben.

Vielen Dank
lam
 

lam_tr

Top Contributor
Hallo zusammen,

wenn wir schon dabei sind,

Papierkram_Rechnung_aus_Zeiten-770-770x516.jpg


Wie kann ich die Tabelle so stylen, dass über und unter der Datensätze eine Linie ist.
 

dzim

Top Contributor
Kann mir mal jemand sagen wie ich unegfähr das nachbauen kann.
Nicht Pauschal einfach zu beantworten, ausser: Ja, es dürfte weitestgehend machbar sein.

Die Tabs sind ziemlich cool, wie style ich die mit CSS?
Schau mal in den Thread von neulich hier: https://www.java-forum.org/thema/tab-content-area-rahmen.178648/#post-1132335
-> sollte dir ein paar Ideen liefern können!
Die Stapel könnten etwas schwierig werden. Ispirationen liefert vielleicht das hier: https://harmoniccode.blogspot.ch/2016/08/friday-fun-xxxvii.html

Dieser Balken in der Mitte kann ich bestimmt auch mit BarChart machen, aber wie mache ich das dann mit dem Grau dahinter?
Sollte einfach mit StackedBarChart machbar sein (z.B. http://tutorials.jenkov.com/javafx/stackedbarchart.html, https://docs.oracle.com/javase/8/javafx/user-interface-tutorial/bar-chart.htm#CIHJFHDE)
Mann muss aktivieren, dass sie immer auf 100% aufstocken - kennt man von Excel ja...
Einen Hintergrund wirst du nicht hinbekommen, aber ich würde immer die letzte Serie (?) über Code auf Grau umstylen - mal am besten im Netz suchen, wie man die Farben von JavaFX-Charts programmatisch ändern kann.

Ich glaub mein Problem hier hauptsächlich ist wieder bekannt das CSS Problem.
Ja... Ist so.
Sonst lässt sich alles mit JavaFX realisieren.
Ja!

Wie kann man am besten Charts designen von Farben her? (Standard Farben von JavaFX sind auch nicht schön)
modena.css (JDK default theme) studieren: https://gist.github.com/maxd/63691840fc372f22f470
Die Default-Farb-Palette findet man, wenn man nach "Chart Color Palette" sucht.
LineChart hat z.B. die Farben hier:
HTML:
.chart-series-line {
    -fx-stroke: CHART_COLOR_1;
    -fx-stroke-width: 3px;
}
.default-color0.chart-line-symbol { -fx-background-color: CHART_COLOR_1, white; }
.default-color1.chart-line-symbol { -fx-background-color: CHART_COLOR_2, white; }
.default-color2.chart-line-symbol { -fx-background-color: CHART_COLOR_3, white; }
.default-color3.chart-line-symbol { -fx-background-color: CHART_COLOR_4, white; }
.default-color4.chart-line-symbol { -fx-background-color: CHART_COLOR_5, white; }
.default-color5.chart-line-symbol { -fx-background-color: CHART_COLOR_6, white; }
.default-color6.chart-line-symbol { -fx-background-color: CHART_COLOR_7, white; }
.default-color7.chart-line-symbol { -fx-background-color: CHART_COLOR_8, white; }
.default-color0.chart-series-line { -fx-stroke: CHART_COLOR_1; }
.default-color1.chart-series-line { -fx-stroke: CHART_COLOR_2; }
.default-color2.chart-series-line { -fx-stroke: CHART_COLOR_3; }
.default-color3.chart-series-line { -fx-stroke: CHART_COLOR_4; }
.default-color4.chart-series-line { -fx-stroke: CHART_COLOR_5; }
.default-color5.chart-series-line { -fx-stroke: CHART_COLOR_6; }
.default-color6.chart-series-line { -fx-stroke: CHART_COLOR_7; }
.default-color7.chart-series-line { -fx-stroke: CHART_COLOR_8; }
BarChart diese:
HTML:
.default-color0.chart-bar { -fx-bar-fill: CHART_COLOR_1; }
.default-color1.chart-bar { -fx-bar-fill: CHART_COLOR_2; }
.default-color2.chart-bar { -fx-bar-fill: CHART_COLOR_3; }
.default-color3.chart-bar { -fx-bar-fill: CHART_COLOR_4; }
.default-color4.chart-bar { -fx-bar-fill: CHART_COLOR_5; }
.default-color5.chart-bar { -fx-bar-fill: CHART_COLOR_6; }
.default-color6.chart-bar { -fx-bar-fill: CHART_COLOR_7; }
.default-color7.chart-bar { -fx-bar-fill: CHART_COLOR_8; }

Beispiele zum CSS gab es mal zu JavaFX2, sollten aber immer noch gültig sein, schaut man sich das CSS von oben an: https://docs.oracle.com/javase/8/javafx/user-interface-tutorial/line-chart.htm#CIHGBCFI

Wie man es im Code macht, wurde schon oft auf StackOverflow diskutiert. Im folgenden Artikel wird etwas verlinkt:
https://stackoverflow.com/questions/11153370/how-to-set-specific-color-to-javafx-xychart-series
Ansehen!

Etwas Code aus unserer Speedtest-Applikation:
Java:
                        int nSeries = 0;
                        for (LineChart.Series<Number, Number> series : wlanSeries) {
                                for (String styleClass : series.getNode().getStyleClass()) {
                                        if (styleClass.startsWith("series")) {
                                                for (Node n : lineChart.lookupAll("." + styleClass)) {
                                                        StringBuilder style = new StringBuilder();
                                                        style.append(String.format(Locale.ENGLISH, "-fx-stroke: line-chart-color%d; ", nSeries));
                                                        style.append(String.format(Locale.ENGLISH, "-fx-background-color: line-chart-color%d, white; ", nSeries));
                                                        style.append("-fx-background-radius: 3; ");
                                                        style.append(String.format(Locale.ENGLISH, "-fx-border-color: line-chart-color%d; ", nSeries));
                                                        style.append("-fx-border-width: 1.0; ");
                                                        style.append("-fx-border-radius: 3; ");
               
                                                        if (connectedSeries.equals(series.getName())) {
                                                                style.append("-fx-stroke-width: 6; ");
                                                                style.append("-fx-border-width: 2.0; ");
                                                                series.getNode().toFront();
                                                        }
                       
                                                        n.setStyle(style.toString());
                                                        for (Node n2 : n.lookupAll("#label-chart-line-desc")) {
                                                                n2.setStyle(style.toString());
                                                        }
                                                }
                                                nSeries++;
                                                if (nSeries % 50 == 0) {
                                                        nSeries = 0;
                                                }
                                        }
                                }
                        }
                       
                        for (Node n : lineChart.getChildrenUnmodifiable()) {
                                for (String styleClass : n.getStyleClass()) {
                                        if (!styleClass.equals("chart-content")) {
                                                continue;
                                        }
                                        n.lookup(".chart-plot-background").setStyle("-fx-background-color: chart-plot-background-alternative;");
                                        n.lookup(".chart-alternative-column-fill").setStyle("-fx-background-color: chart-plot-background-alternative;");
                                        n.lookup(".chart-alternative-row-fill").setStyle("-fx-background-color: chart-plot-background-alternative;");
                                }
                        }
Ich hatte dazu eine grosse Zahl benannter Farben im CSS festgelegt, aber das geht auch ohne, indem du die Farbcodes direkt einfügst...

Wie kann ich die Tabelle so stylen, dass über und unter der Datensätze eine Linie ist.
Mit CSS... :D
Ernsthaft: Ich habe ziemlich viel daran herumgebastelt, bis mir etwas gefallen hat. Ich habe jetzt unterm Header eine Linie und zwischen den Spalten im Content (Header nicht!). Die Header-Linie zieht sich auch über die "nicht vorhandenen" Spalten, rechts von all deinen Spalten weiter (interessant, wenn du weniger Spalten hast, als die Tabelle breit ist). Die abwechselnden Hintergründe der Zeilen habe ich wegoptimiert. Unten drunter würde ich einfach einen Border am unteren Rand der TableView machen - wird so oder so "frikelig", da die Tabelle ja ein Scroll-Container ist - nicht wie im Web.
HTML:
/*
* List-, Tree, (Tree)TableView
*/

.table-view,
.tree-table-view {
    -fx-background-color: transparent;
    /* Constants used throughout the tableview. */
    -fx-table-header-border-color: -fx-box-border;
    -fx-table-cell-border-color: derive(-fx-color,5%);
}
.table-view:focused,
.tree-table-view:focused {
    -fx-background-color: transparent;
}

/***** ROW CELLS **************************************************************/
/* Each row in the table is a table-row-cell. Inside a table-row-cell is any
   number of table-cell. */
.table-row-cell {
    -fx-background: -fx-control-inner-background;
    -fx-background-color: -fx-table-cell-border-color, -fx-background;
    -fx-background-insets: 0, 0 0 1 0;
    -fx-padding: 0;
    -fx-text-fill: -fx-text-background-color;
}
.table-row-cell:odd {
    -fx-background: -fx-control-inner-background-alt;
}
/***** INDIVIDUAL CELLS ********************************************************/
.table-cell {
    -fx-padding: 0.166667em; /* 2px, plus border adds 1px */
    -fx-background-color: null;
    -fx-border-color: transparent -fx-table-cell-border-color transparent transparent;
    -fx-cell-size: 2.0em; /* 24 */
    -fx-text-fill: -fx-text-background-color;
}
.table-view > .virtual-flow > .clipped-container > .sheet > .table-row-cell .table-cell:selected,
.tree-table-view > .virtual-flow > .clipped-container > .sheet > .tree-table-row-cell .tree-table-cell:selected {
    -fx-background-color: -fx-table-cell-border-color, -fx-background;
    -fx-background-insets: 0, 0 0 1 0;
}
/* When in constrained resize mode, the right-most visible cell should not have
   a right-border, as it is not possible to get this cleanly out of view without
   introducing horizontal scrollbars (see RT-14886). */
.table-view:constrained-resize > .virtual-flow > .clipped-container > .sheet > .table-row-cell > .table-cell:last-visible,
.tree-table-view:constrained-resize > .virtual-flow > .clipped-container > .sheet > .tree-table-row-cell > .tree-table-cell:last-visible {
    -fx-border-color: transparent;
}
/***** HEADER **********************************************************************/
/* The column-resize-line is shown when the user is attempting to resize a column. */
.table-view .column-resize-line,
.tree-table-view .column-resize-line {
    -fx-background: -fx-accent;
    -fx-background-color: -fx-background;
    -fx-padding: 0.0em 0.0416667em 0.0em 0.0416667em; /* 0 0.571429 0 0.571429 */
}
/* This is the area behind the column headers. An ideal place to specify background
   and border colors for the whole area (not individual column-header's). */
.table-view .column-header-background,
.tree-table-view > .column-header-background {
    -fx-background-color: -fx-inner-border, -fx-body-color;
    -fx-background-insets: 0, 1;
}
/* The column header row is made up of a number of column-header, one for each
   TableColumn, and a 'filler' area that extends from the right-most column
   to the edge of the tableview, or up to the 'column control' button. */
.table-view .column-header,
.tree-table-view .column-header,
.table-view .filler,
.tree-table-view .filler,
.table-view > .column-header-background > .show-hide-columns-button,
.tree-table-view > .column-header-background > .show-hide-columns-button,
.table-view:constrained-resize .filler,
.tree-table-view:constrained-resize .filler {
    -fx-background-color: -fx-box-border, -fx-inner-border, -fx-body-color;
    -fx-background-insets: 0, 0 1 1 0, 1 2 2 1;
    -fx-font-weight: bold;
    -fx-size: 2em;
    -fx-text-fill: -fx-selection-bar-text;
    -fx-padding: 0.166667em;
}
.table-view .column-header .context-menu,
.tree-table-view .column-header .context-menu,
.table-view > .column-header-background > .show-hide-columns-button .context-menu,
.tree-table-view > .column-header-background > .show-hide-columns-button .context-menu {
    -fx-font-weight: null;
}
.table-view .filler,
.tree-table-view .filler,
.table-view:constrained-resize .filler,
.tree-table-view:constrained-resize .filler {
    -fx-background-insets: 0, 0 0 1 0, 1 1 2 1;
}
.table-view > .column-header-background > .show-hide-columns-button,
.tree-table-view > .column-header-background > .show-hide-columns-button {
    -fx-background-insets: 0, 0 0 1 1, 1 1 2 2;
}
.table-view .column-header .sort-order-dots-container,
.tree-table-view .column-header .sort-order-dots-container{
    -fx-padding: 2 0 2 0;
}
.table-view .column-header .sort-order,
.tree-table-view .column-header .sort-order{
    -fx-font-size: 0.916667em; /* 11pt - 1 less than the default font */
}
.table-view .column-header .sort-order-dot,
.tree-table-view .column-header .sort-order-dot {
    -fx-background-color: -fx-mark-color;
    -fx-padding: 0.115em;
    -fx-background-radius: 0.115em;
}
.table-view .column-header .label,
.tree-table-view .column-header .label {
    -fx-alignment: center;
}

/* Plus Symbol */
.table-view .show-hide-column-image,
.tree-table-view .show-hide-column-image {
    -fx-background-color: -fx-mark-color;
    -fx-padding: 0.25em; /* 3px */
    -fx-shape: "M398.902,298.045c0.667,0,1.333,0,2,0c0,0.667,0,1.333,0,2c0.667,0,1.333,0,2,0c0,0.667,0,1.333,0,2c-0.667,0-1.333,0-2,0c0,0.666,0,1.332,0,1.999c-0.667,0-1.333,0-2,0c0-0.667,0-1.333,0-1.999c-0.666,0-1.333,0-1.999,0c0-0.667,0-1.334,0-2c0.666,0,1.333,0,1.999,0C398.902,299.378,398.902,298.711,398.902,298.045z";
}
/* When a column is being 'dragged' to be placed in a different position, there
   is a region that follows along the column header area to indicate where the
   column will be dropped. This region can be styled using the .column-drag-header
   name. */
.table-view .column-drag-header,
.tree-table-view .column-drag-header {
    -fx-background: -fx-accent;
    -fx-background-color: -fx-selection-bar;
    -fx-border-color: transparent;
    -fx-opacity: 0.6;
}
/* Semi-transparent overlay to indicate the column that is currently being moved */
.table-view .column-overlay,
.tree-table-view .column-overlay {
    -fx-background-color: darkgray;
    -fx-opacity: 0.3;
}
/* Header Sort Arrows */
.table-view /*> column-header-background > nested-column-header >*/ .arrow,
.tree-table-view /*> column-header-background > nested-column-header >*/ .arrow {
    -fx-background-color: -fx-mark-color;
    -fx-padding: 0.25em 0.3125em 0.25em 0.3125em; /* 3 3.75 3 3.75 */
    -fx-shape: "M 0 0 h 7 l -3.5 4 z";
}
/* This is shown when the table has no rows and/or no columns. */
.table-view .empty-table,
.tree-table-view .empty-table {
    -fx-background-color: transparent;
    -fx-font-size: 1.166667em; /* 14pt - 2 more than the default font */
}

/*
* TableView style
* above: Defaults
* below: Customization
*/
.table-view,
.table-view .column-header-background,
.table-view .column-header,
.table-view .filler {
    -fx-background-color: transparent;
}

.table-view .column-header,
.table-view .filler {
    -fx-border-color: -brand-secondary;
    -fx-border-width: 0 0 1 0;
}

.table-view {
    -fx-border-color: -brand-secondary;
    -fx-border-width: 0px 0px 0px 0px;
}

.table-row-cell:empty .table-cell {
    -fx-border-width: 0px;
    -fx-background-color: transparent;
}

.table-row-cell,
.table-row-cell:odd {
    -fx-background-color: transparent;
}

.table-row-cell .text,
.table-row-cell:odd .text,
.table-row-cell:hover .text{
    -fx-fill: black;
}

.table-row-cell:selected,
.table-row-cell:odd:selected,
.table-row-cell:even:selected {
    -fx-background-color: -brand-secondary;
}

.table-row-cell:selected .text,
.table-row-cell:odd:selected .text,
.table-row-cell:even:selected .text {
    -fx-fill: white;
}

.table-row-cell:hover,
.table-row-cell:odd:hover,
.table-row-cell:even:hover {
    -fx-background-color: -brand-tertiary;
}
.table-row-cell:empty:hover {
    -fx-background-color: transparent;
}

.table-row-cell:hover .text,
.table-row-cell:odd:hover .text,
.table-row-cell:even:hover .text {
    -fx-fill: white;
}

.table-cell {
    -fx-padding: 0.166667em; /* 2px, plus border adds 1px */
    -fx-background-color: null;
    -fx-border-color: transparent -brand-secondary transparent transparent;
    -fx-border-width: 0px 1px 0px 0px;
    -fx-cell-size: 2.0em; /* 24 */
    -fx-text-fill: -fx-text-background-color;
}
.table-cell:selected {
    -fx-background-color: -fx-table-cell-border-color, -fx-background;
    -fx-background-insets: 0, 0 0 1 0;
}
.table-cell:last-visible {
    -fx-border-color: transparent;
}

Alternativ: Verwende ein GridPane und style es so, dass es wie eine Tabelle aussieht...

Generell: https://harmoniccode.blogspot.ch/ - gute Ideen, Controls, etc....
 

lam_tr

Top Contributor
Man das ist mal wieder eine super Hilfestellung.
Ich habe mir mittlerweile die TableView Style von JFoenix geklaut, macht sich gut.
Dieser Tipp mit den Tabs schaue ich mir mal an.
Du meintest man kann mit SceneView sofort Änderungen am CSS machen und die Oberfläche zeigt das an, irgendwie habe ich das nicht hinbekommen?

Grüße
lam
 

dzim

Top Contributor
Du meinst ScenicView? Nee, ich glaube, du kannst du inspizieren, leider. Aber ich habe es auch eher nur zum debuggen benötigt und meist ohne hinbekommen.
 

Ähnliche Java Themen

Neue Themen


Oben