我正在构建一个看起来非常简单的计算器,但我无法弄清楚这些按钮周围的填充是从哪里来的。以下是我构建流程 Pane 的方式:
private FlowPane addFlowPaneRightSide() {
FlowPane flow = new FlowPane();
//flow.setPadding(new Insets(0, 0, 0, 0));
flow.setVgap(0);
flow.setHgap(0);
flow.setPrefWrapLength(WIDTH_OF_CENTER / 3); // width of function buttons
flow.setStyle("-fx-background-color: 978c87;");
// setup arrays to hold the buttons and images for the right column
Button operatorButtons[] = new Button[NUM_OP_BUTTONS];
ImageView operatorImages[] = new ImageView[NUM_OP_BUTTONS];
for (int i=0; i < NUM_OP_BUTTONS; i++) {
operatorImages[i] = new ImageView(
new Image(Calculator.class.getResourceAsStream(
"images/orange-"+(i)+".png")));
operatorButtons[i] = new Button();
operatorButtons[i].setGraphic(operatorImages[i]);
operatorButtons[i].setId("orange-"+(i));
flow.getChildren().add(operatorButtons[i]);
}
return flow;
}
当我只是将图像放在流程 Pane 中时它工作正常但是当我开始在循环中创建按钮时它给了我这个:
我的 CSS:
/*
Document : stylesheet.css
for Calculator project in JavaFX
*/
.root{
-fx-font-size: 14pt;
-fx-font-family: "Tahoma";
}
.button{
-fx-text-fill: #006464;
-fx-skin: "com.sun.javafx.scene.control.skin.ButtonSkin";
/*-fx-background-color: -fx-shadow-highlight-color, -fx-outer-border, -fx-inner-border, -fx-body-color;*/
-fx-background-color: transparent;
-fx-background-insets: 0 0 0 0, 0, 0, 0;
-fx-background-radius: 0 0 0 0, 0, 0, 0;
-fx-border-width: 0 0 0 0, 0, 0, 0;
}
.button:focused {
-fx-color: -fx-focused-base;
/*-fx-background-color: -fx-focus-color, -fx-outer-border, -fx-inner-border, -fx-body-color;*/
-fx-background-color: transparent;
-fx-background-insets: 0 0 0 0, 0, 0, 0;
-fx-background-radius: 0 0 0 0, 0, 0, 0;
-fx-border-width: 0 0 0 0, 0, 0, 0;
}
最后是整个程序:
package calculator;
import javafx.application.Application;
import javafx.event.ActionEvent;
import javafx.event.EventHandler;
import javafx.scene.Scene;
import javafx.scene.control.Button;
import javafx.stage.Stage;
import javafx.geometry.Insets;
import javafx.geometry.Pos;
import javafx.geometry.VPos;
import javafx.scene.Scene;
import javafx.scene.image.Image;
import javafx.scene.image.ImageView;
import javafx.scene.layout.BorderPane;
import javafx.scene.layout.FlowPane;
import javafx.scene.layout.HBox;
import javafx.scene.layout.Priority;
import javafx.scene.shape.Rectangle;
import javafx.scene.text.Font;
import javafx.scene.text.FontWeight;
import javafx.scene.text.Text;
/**
*
* @author Jim Lohse
*/
public class Calculator extends Application {
public final int CALC_WIDTH = 500;
public final int CALC_HEIGHT = 642;
public final int NUM_BUTTONS = 15;
public final int NUM_OP_BUTTONS = 5;
public final int WIDTH_OF_CENTER = 354;
/**
* @param args the command line arguments
*/
public static void main(String[] args) {
launch(args);
}
@Override
public void start(Stage stage) {
// Use a border pane as the root for scene
BorderPane border = new BorderPane();
HBox hbox = addHBox();
border.setTop(hbox);
border.setRight(addFlowPaneRightSide());
border.setCenter(addFlowPaneCenter());
Scene scene = new Scene(border, CALC_WIDTH, CALC_HEIGHT);
scene.getStylesheets().add("calculator/stylesheet.css");
stage.setScene(scene);
stage.setTitle("Calculator");
stage.setResizable(false);
stage.show();
}
/*
* Creates an HBox with two buttons for the top region
*/
private HBox addHBox() {
HBox hbox = new HBox();
hbox.setPadding(new Insets(15, 12, 15, 12));
hbox.setSpacing(10); // Gap between nodes
hbox.setStyle("-fx-background-color: #336699;");
Button buttonCurrent = new Button("Current");
buttonCurrent.setPrefSize(100, 20);
Button buttonProjected = new Button("Projected");
buttonProjected.setPrefSize(100, 20);
hbox.getChildren().addAll(buttonCurrent, buttonProjected);
return hbox;
}
/*
* Creates a horizontal flow pane with the orange operations buttons
*/
private FlowPane addFlowPaneRightSide() {
FlowPane flow = new FlowPane();
//flow.setPadding(new Insets(0, 0, 0, 0));
flow.setVgap(0);
flow.setHgap(0);
flow.setPrefWrapLength(WIDTH_OF_CENTER / 3); // width of function buttons
// setup arrays to hold the buttons and images for the right column
Button operatorButtons[] = new Button[NUM_OP_BUTTONS];
ImageView operatorImages[] = new ImageView[NUM_OP_BUTTONS];
for (int i=0; i < NUM_OP_BUTTONS; i++) {
operatorImages[i] = new ImageView(
new Image(Calculator.class.getResourceAsStream(
"images/orange-"+(i)+".png")));
operatorButtons[i] = new Button();
operatorButtons[i].setGraphic(operatorImages[i]);
operatorButtons[i].setId("orange-"+(i));
flow.getChildren().add(operatorButtons[i]);
}
return flow;
}
/*
* Creates a horizontal flow pane with the orange operations buttons
*/
private FlowPane addFlowPaneCenter() {
FlowPane flow = new FlowPane();
//flow.setPadding(new Insets(0, 0, 0, 0));
flow.setVgap(0);
flow.setHgap(0);
flow.setPrefWrapLength(WIDTH_OF_CENTER); // width of function buttons
Button centerButtons[] = new Button[NUM_BUTTONS];
ImageView centerImages[] = new ImageView[NUM_BUTTONS];
for (int i=0; i < NUM_BUTTONS; i++) {
centerImages[i] = new ImageView(
new Image(Calculator.class.getResourceAsStream(
"images/button-"+(i)+".png")));
centerButtons[i] = new Button();
centerButtons[i].setGraphic(centerImages[i]);
centerButtons[i].setId("button-"+(i));
flow.getChildren().add(centerButtons[i]);
}
return flow;
}
}
最佳答案
我没有您正在使用的图像的副本,所以我看不到它应该是什么样子。但我会尝试使用正方形的图片。
这让我:
现在,根据您的描述,我所看到的按钮之间没有实际的填充。我认为您可能会说标签区域本身存在一些填充,这会导致您出现问题。这很容易修复。
我解决这个问题的方法是在制作按钮时向每个按钮添加一行代码 (blah[i].setPadding(Insets.EMPTY))。
for (int i=0; i < NUM_OP_BUTTONS; i++) {
operatorImages[i] = new ImageView(
new Image(Java.class.getResourceAsStream(
"art" + File.separator + "Square.png")));
operatorButtons[i] = new Button();
operatorButtons[i].setGraphic(operatorImages[i]);
operatorButtons[i].setPadding(Insets.EMPTY);
operatorButtons[i].setId("orange-"+(i));
flow.getChildren().add(operatorButtons[i]);
}
和
for (int i=0; i < NUM_BUTTONS; i++) {
centerImages[i] = new ImageView(
new Image(Java.class.getResourceAsStream(
"art" + File.separator + "Square.png")));
centerButtons[i] = new Button();
centerButtons[i].setGraphic(centerImages[i]);
centerButtons[i].setPadding(Insets.EMPTY);
centerButtons[i].setId("button-"+(i));
flow.getChildren().add(centerButtons[i]);
}
这应该可以解决您的小问题。
编辑:只是想提一下,您看到的一小部分空白是图像本身的一部分,而不是填充。
关于java - 删除 JavaFX 按钮填充?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/27338844/