选项卡内的JavaFX窗格

时间:2017-05-21 11:11:47

标签: java swing javafx

我想从窗格扩展一个类,然后使用setContent()标签中的TabPane方法显示此标签内的窗格。当我从Swing扩展时它在JPanel中工作但是如果我在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 个答案:

答案 0 :(得分:2)

您的Swing示例未正确同步,并且遇到inflexible layout having absolute positioning。除了观察Pane“可以在需要绝对定位儿童的情况下直接使用时,应该丢弃该示例。”在这种情况下,您的JavaFX示例不会。

在下面的JavaFX变体中,b构建了所需的[1, 2],并通过Example方法使其可用。然后ListView将该内容用于标签。调整封闭阶段的大小以查看效果。

getContent()

顺便说一句,Home在语义上等同于具有package-private访问权限的类,这样可以轻松地测试 in situ ,然后重构为一个单独的类。< / p>

image

tab.setContent(example.getContent());