有 Java 编程相关的问题?

你可以在下面搜索框中键入要查询的问题!

选项卡中的java JavaFX窗格

我想从窗格扩展一个类,然后从TabPane的选项卡使用setContent()方法在该选项卡内显示窗格。当我从JPanel扩展时,它在Swing中工作,但是如果我在JavaFX中尝试类似的操作,它只显示选项卡本身,并且在下面保持为空

Image of the tab

我想在单独的类中处理选项卡的内容,我是否在这里做了一些完全错误的事情

Swing版本:

import java.awt.*;
import javax.swing.*;
import java.util.*;

public class Home extends JFrame{
  private JTabbedPane jTabbedPane1 = new JTabbedPane();
  private Example ex = new Example();

  public static void main(String[] args) {
    Home h1 = new Home();
    h1.ex= new Example();
    h1.jTabbedPane1.add("test",h1.ex);
  } // end of main

  public Home() { 
    // Frame-Initialisierung
    super();

    setDefaultCloseOperation(WindowConstants.DISPOSE_ON_CLOSE);

    setSize(200,200);
    Dimension d = Toolkit.getDefaultToolkit().getScreenSize();
    int x = (d.width - getSize().width) / 2;
    int y = (d.height - getSize().height) / 2;
    setLocation(x, y);
    setResizable(false);

    Container cp = getContentPane();
    cp.setLayout(null);
    // Anfang Komponenten

    jTabbedPane1.setBounds(0, 0, 100, 100);
    cp.add(jTabbedPane1);

    setVisible(true);
  } // end of public home
} // end of class Home

import java.awt.*;
import javax.swing.*;
import java.util.*;

public class Example extends JPanel {
  private JList jList1 = new JList();
  private DefaultListModel jList1Model = new DefaultListModel();
  private JScrollPane jList1ScrollPane = new JScrollPane(jList1);

  public Example(){
    super();
    setLayout(null);
    jList1.setModel(jList1Model);
    jList1ScrollPane.setBounds(0, 0, 100, 100);

    add(jList1ScrollPane);

    }

} // end of class Example

在JavaFX版本中不工作:

import javafx.application.Application;
import static javafx.application.Application.launch;
import javafx.scene.Scene;
import javafx.scene.control.Tab;
import javafx.scene.control.TabPane;
import javafx.scene.control.TabPane.TabClosingPolicy;
import javafx.scene.layout.Pane;
import javafx.scene.shape.Rectangle;
import javafx.stage.Stage;

public class Home extends Application {


  private TabPane tabpane = new TabPane();
  private Example ex;

    @Override
    public void start(Stage primaryStage) {

     primaryStage.setTitle("TEST");

     Pane layout = new Pane();

     tabpane.setLayoutX(-8);
     tabpane.setLayoutY(24);
     tabpane.setTabClosingPolicy(TabClosingPolicy.UNAVAILABLE);

      Tab tab = new Tab();
      tab.setText("new tab");
      tab.setContent(new Rectangle(200,200));
      this.ex = new Example();
      tab.setContent(ex);
      tabpane.getTabs().add(tab);

     layout.getChildren().add(tabpane);

     Scene scene = new Scene(layout, 500, 500);


     scene.getStylesheets().clear();
     scene.getStylesheets().add(Home.class.getResource("style.css").toExternalForm());

     primaryStage.setScene(scene);
     primaryStage.setResizable(false);


     primaryStage.show();

    }

    public static void main(String[] args) {
        launch(args);
    }
}



import java.util.ArrayList;
import javafx.collections.FXCollections;
import javafx.collections.ObservableList;
import javafx.scene.control.ListView;
import javafx.scene.layout.Pane;
import javafx.stage.Stage;



public class Example extends Pane{

     ListView<String> list = new ListView<String>();


    public void start(Stage primaryStage) {


     ArrayList<String> arraytest = new ArrayList<String>();
     arraytest.add("test1");
     arraytest.add("test2");

    ObservableList<String> test = FXCollections.observableArrayList(arraytest);

    list.setItems(test);
    list.setLayoutX(10);
    list.setLayoutY(10);
    list.setPrefWidth(270);
    list.setPrefHeight(270); 

     getChildren().add(list);

    }    
}

共 (1) 个答案

  1. # 1 楼答案

    您的Swing示例同步不正确,并且存在inflexible layout having absolute positioning错误。应放弃该示例,但要注意的是^{}“可直接用于需要儿童绝对定位的情况。”在本例中,您的JavaFX示例没有

    在下面的JavaFX变体中,Example构造所需的ListView,并通过getContent()方法使其可用Home然后将该内容用于选项卡。调整封闭舞台的大小以查看效果

    tab.setContent(example.getContent());
    

    另一方面,private static class Example在语义上等同于具有package-private访问权限的类,这使得在中进行原位测试和随后重构为单独的类变得容易

    image

    import javafx.application.Application;
    import static javafx.application.Application.launch;
    import javafx.collections.FXCollections;
    import javafx.collections.ObservableList;
    import javafx.scene.Scene;
    import javafx.scene.control.ListView;
    import javafx.scene.control.Tab;
    import javafx.scene.control.TabPane;
    import javafx.scene.control.TabPane.TabClosingPolicy;
    import javafx.stage.Stage;
    
    /** @see https://stackoverflow.com/a/44102580/230513 */
    public class Home extends Application {
    
        private TabPane tabpane = new TabPane();
        private Example example = new Example();
    
        @Override
        public void start(Stage primaryStage) {
            primaryStage.setTitle("Test");
            tabpane.setTabClosingPolicy(TabClosingPolicy.UNAVAILABLE);
            Tab tab = new Tab();
            tab.setText("Tab One");
            tab.setContent(example.getContent());
            tabpane.getTabs().add(tab);
            Scene scene = new Scene(tabpane);
            primaryStage.setScene(scene);
            primaryStage.show();
        }
    
        private static class Example {
    
            ListView<String> view = new ListView<>();
    
            public Example() {
                ObservableList<String> list = FXCollections.observableArrayList(
                    "Test 1", "Test 2", "Test 3");
                view.setItems(list);
            }
    
            public ListView getContent() {
                return view;
            }
        }
    
        public static void main(String[] args) {
            launch(args);
        }
    }