2014-04-02 13 views
14

मैं वर्तमान में मूल्यांकन कर रहा हूं कि स्विंगनोड का उपयोग करके मेरे वर्तमान स्विंग एप्लिकेशन को जावाएफएक्स 8 में परिवर्तित करना संभव होगा या फिर धीरे-धीरे जावाफ़ैक्स घटकों में सब कुछ बदल दें। मैंने दो समस्याओं पर ठोकर खाई है, जो जावाएफएक्स 8 में बिंगरिंग बग हो सकती है, लेकिन मुझे यकीन नहीं है।जावाएफएक्स 8 स्विंग संगतता

  1. (ज्यादातर समय) SwingNode JavaFX मेनू ठीक से चित्रित नहीं किया गया है करने के लिए सामग्री जोड़ने, एक काले रंग की बार में प्रदर्शित करने के बाद
  2. JScrollBars गैर अपारदर्शी बनाने

    काम करने के लिए प्रतीत नहीं होता
    import java.awt.Color; 
    import java.awt.GridLayout; 
    
    import javafx.application.Application; 
    import javafx.embed.swing.SwingNode; 
    import javafx.scene.Scene; 
    import javafx.scene.control.Menu; 
    import javafx.scene.control.MenuBar; 
    import javafx.scene.layout.StackPane; 
    import javafx.scene.layout.VBox; 
    import javafx.stage.Stage; 
    
    import javax.swing.JPanel; 
    import javax.swing.JScrollPane; 
    
    
    public class Test extends Application {  
    
        @Override 
        public void start(Stage stage) throws Exception { 
         stage.setMaximized(true); 
    
         VBox vbox = new VBox(); 
         MenuBar menuBar = new MenuBar(); 
         menuBar.getMenus().add(new Menu("bla")); 
         vbox.getChildren().add(menuBar); 
    
         StackPane mainPane = new StackPane();   
         mainPane.setPrefSize(9999, 9999); //Better way to ensure all space used? 
         vbox.getChildren().add(mainPane); 
         vbox.setVisible(true); 
    
         Scene scene = new Scene(vbox, 9999, 9999); //Better way to ensure all space used? 
         stage.setScene(scene); 
    
         SwingNode swingNode = new SwingNode(); 
         mainPane.getChildren().add(swingNode); 
    
         JPanel jPanel = new JPanel(); 
         swingNode.setContent(jPanel); //Seems to interfere with painting of menu 
    
         jPanel.setBackground(Color.WHITE); 
         jPanel.setLayout(new GridLayout(2, 1)); 
         jPanel.add(new JPanel()); 
    
         JPanel nonOpaquePanel = new JPanel(); 
         nonOpaquePanel.setOpaque(false); 
         JScrollPane scrollPane = new JScrollPane(nonOpaquePanel); 
         scrollPane.setOpaque(false); 
         scrollPane.getViewport().setOpaque(false); //Black background -> Bug? 
         jPanel.add(scrollPane); 
    
         stage.show(); 
        } 
    
        /** 
        * Main method launching the application. 
        */ 
        public static void main(String[] args) { 
         launch(args); 
        } 
    } 
    

    Executable jar

संपादित करें: मैं मीटर संपादित स्विंग घटकों को बनाने के लिए ईडीटी का उपयोग करने के लिए वाई उदाहरण। उसने कुछ भी नहीं बदला। या मुझ से कुछ गलत हो रहा है?

import java.awt.Color; 
import java.awt.Dimension; 
import java.awt.GridLayout; 

import javafx.application.Application; 
import javafx.application.Platform; 
import javafx.embed.swing.SwingNode; 
import javafx.scene.Scene; 
import javafx.scene.control.Menu; 
import javafx.scene.control.MenuBar; 
import javafx.scene.layout.StackPane; 
import javafx.scene.layout.VBox; 
import javafx.stage.Stage; 

import javax.swing.JLabel; 
import javax.swing.JPanel; 
import javax.swing.JScrollPane; 
import javax.swing.SwingUtilities; 


public class Test extends Application { 
    private JPanel jPanel = null; 

    @Override 
    public void start(Stage stage) throws Exception { 
     if (Platform.isFxApplicationThread()) { // all of this happens on the fx application thread 
      stage.setMaximized(true); 

      VBox vbox = new VBox(); 
      MenuBar menuBar = new MenuBar(); 
      menuBar.getMenus().add(new Menu("bla")); 
      vbox.getChildren().add(menuBar); 

      StackPane mainPane = new StackPane();   
      mainPane.setPrefSize(9999, 9999); //Better way to ensure all space used? 
      vbox.getChildren().add(mainPane); 
      vbox.setVisible(true); 

      Scene scene = new Scene(vbox, 9999, 9999); //Better way to ensure all space used? 
      stage.setScene(scene); 

      SwingNode swingNode = new SwingNode(); 
      mainPane.getChildren().add(swingNode);      

      SwingUtilities.invokeLater(new Runnable() { //Use EDT to build swing components    
       @Override 
       public void run() { 
        jPanel = new JPanel(); 

        jPanel.setBackground(Color.WHITE); 
        jPanel.setLayout(new GridLayout(2, 1)); 
        jPanel.add(new JPanel()); 

        JLabel nonOpaquePanel = new JLabel("Bla"); 
        nonOpaquePanel.setPreferredSize(new Dimension(5000, 5000)); 
        nonOpaquePanel.setOpaque(false); 
        JScrollPane scrollPane = new JScrollPane(nonOpaquePanel); 
        scrollPane.setOpaque(false); 
        scrollPane.getViewport().setOpaque(false); //Black background -> Bug? 
        jPanel.add(scrollPane); 
       } 
      }); 

      Thread.sleep(1000); //terrible way to wait for the EDT, I know 
      swingNode.setContent(jPanel); //Seems to interfere with painting of menu    
      stage.show(); 

      SwingUtilities.invokeLater(new Runnable() { //I am pretty sure this isn't necessary, but whatever      
       @Override 
       public void run() { 
        jPanel.repaint();  
       } 
      }); 
     } 
    } 

    /** 
    * Main method launching the application. 
    */ 
    public static void main(String[] args) { 
     launch(args); 
    } 
} 
+3

मैंने जावाएफएक्स बग रिपोर्ट आरटी -36285 में इस प्रश्न के बारे में पूछा और सुना: "... कृपया अपने कोड में थ्रेडिंग की जांच करें। नमूना जो आप स्टैक ओवरफ्लो पर प्रदान करते हैं, जावाफैक्स उपयोगकर्ता थ्रेड पर स्विंग एपीआई कॉल करता है। यह बुरा है स्विंग और एफएक्स दोनों। स्विंग एपीआई केवल ईडीटी, और एफएक्स एपीआई पर ही लागू की जानी चाहिए - जावाएफएक्स उपयोगकर्ता थ्रेड पर संगत रूप से। कृपया पहले थ्रेडिंग को ठीक करें और देखें कि यह चीजों को कैसे बदलता है। फिर यदि कोई समस्या अभी भी शेष है तो नई बग दर्ज करें। " –

+0

आप 'JScrollBar' को गैर-अपारदर्शी लेकिन संपूर्ण 'JScrollPane' पर सेट नहीं करते हैं। हालांकि, दोनों काम नहीं करेंगे। यह स्पष्ट नहीं है कि आप 'जेएसक्रोलपैन' से गैर-अपारदर्शी 'जेएसक्रॉलबार' के साथ क्या व्यवहार करते हैं, लेकिन यह बहुत संभावना है कि यह इस तरह से काम नहीं करेगा (* सिद्धांत * में)। – Holger

+0

जब मैं आपके कोड की तुलना [ओरेकल से ट्यूटोरियल] (http://docs.oracle.com/javase/8/javafx/interoperability-tutorial/embed-swing.htm) के साथ करता हूं, ऐसा लगता है कि आपको इसकी आवश्यकता है स्विंग सामग्री के निर्माण के बजाय 'स्विंगउडियंस.invokeLater (...)' में 'swingNode.setContent (...)' कॉल करें। @Dashy से सिंगल-थ्रेड सिस्टम प्रॉपर्टी के साथ संयुक्त आपको इसे सबसे अच्छा देना चाहिए था। लेकिन वर्तमान में आपका कोड मुझे गलत लगता है। – dzim

उत्तर

1

JavaFX में एक बग किया गया है चाहिए, यह बहुत ही उदाहरण अब ठीक काम कर रहा है।

4

जब आप अपडेट कॉल करते हैं तो अपने अपडेट कोड को लपेटने का प्रयास करें। इस कोड ने मुझे अन्य परियोजनाओं पर पहले मदद की है।

Platform.runLater(new Runnable() { 
      @Override 
      public void run() { 
       // Update the text node with calculated results 
      } 
     }); 

Source

+1

चूंकि यह Java8 'Platform.runLater (() -> ...) 'का उपयोग किया जा सकता है। – ggovan

+0

आपने अपना दिन –

1

आप -Djavafx.embed.singleThread=true उपयोग कर सकते हैं, तो आप न घटना अपने दम पर भेजने करना है।

JavaFx APIDesign

+0

हम्म बचाया ... जहां तक ​​मैं ब्लॉग को समझता हूं, यह केवल मैकोज़ के लिए उपलब्ध है? – kleopatra

+0

विंडोज पर बिल्कुल सही काम करता है, इसे मेरे वर्तमान प्रोजेक्ट में परीक्षण किया जाता है। – Dashy

+0

जानकारी के लिए धन्यवाद :-) – kleopatra

संबंधित मुद्दे