2012-12-05 3 views
9

나는 JEditorPane를 사용하여 스윙 일하고 있지만 자바 스크립트 또는 <object> 등을하지 등의 색상, 글꼴 스타일 크기JEditorPane로

을 지원하는 등의 일부 고급 태그를 지원하지 않는, 그래서 모든 솔루션이 있습니까 해당 편집기 창은 일반 HTML 브라우저에 표시되는 HTML 파일을 표시 할 수 있습니까?

전용 (개까지)를 지원

답변

10
  • 현재 Java6/7css에 대한 감소 된 지원 Html 3.2,

    Html5에 대한
  • 꽤 전체가 css supportJavaFx Components를 사용하는,

  • (전체와 사용자 정의 Java 라이브러리가있다? ??) Html4/5, css 및 js 지원하지만 대신 JavaFX을 사용하는 것이 좋습니다.

+0

선생님 –

22

+1 mKorbel.

HTML5를 스윙과 통합하여 지원하는 JavaFXWebView을 사용하십시오.

  • :
    import java.awt.*; 
    import java.awt.event.*; 
    import java.net.MalformedURLException; 
    import java.net.URL; 
    import javafx.application.Platform; 
    import javafx.beans.value.ChangeListener; 
    import javafx.beans.value.ObservableValue; 
    import static javafx.concurrent.Worker.State.FAILED; 
    import javafx.embed.swing.JFXPanel; 
    import javafx.event.EventHandler; 
    import javafx.scene.Scene; 
    import javafx.scene.web.WebEngine; 
    import javafx.scene.web.WebEvent; 
    import javafx.scene.web.WebView; 
    import javax.swing.*; 
    
    public class SimpleSwingBrowser implements Runnable { 
        private JFXPanel jfxPanel; 
        private WebEngine engine; 
    
        private JFrame frame = new JFrame(); 
        private JPanel panel = new JPanel(new BorderLayout()); 
        private JLabel lblStatus = new JLabel(); 
    
        private JButton btnGo = new JButton("Go"); 
        private JTextField txtURL = new JTextField(); 
        private JProgressBar progressBar = new JProgressBar(); 
    
        private void initComponents() { 
         jfxPanel = new JFXPanel(); 
    
         createScene(); 
    
         ActionListener al = new ActionListener() { 
          @Override public void actionPerformed(ActionEvent e) { 
           loadURL(txtURL.getText()); 
          } 
         }; 
    
         btnGo.addActionListener(al); 
         txtURL.addActionListener(al); 
    
         progressBar.setPreferredSize(new Dimension(150, 18)); 
         progressBar.setStringPainted(true); 
    
         JPanel topBar = new JPanel(new BorderLayout(5, 0)); 
         topBar.setBorder(BorderFactory.createEmptyBorder(3, 5, 3, 5)); 
         topBar.add(txtURL, BorderLayout.CENTER); 
         topBar.add(btnGo, BorderLayout.EAST); 
    
    
         JPanel statusBar = new JPanel(new BorderLayout(5, 0)); 
         statusBar.setBorder(BorderFactory.createEmptyBorder(3, 5, 3, 5)); 
         statusBar.add(lblStatus, BorderLayout.CENTER); 
         statusBar.add(progressBar, BorderLayout.EAST); 
    
         panel.add(topBar, BorderLayout.NORTH); 
         panel.add(jfxPanel, BorderLayout.CENTER); 
         panel.add(statusBar, BorderLayout.SOUTH); 
    
         frame.getContentPane().add(panel); 
        } 
    
        private void createScene() { 
    
         Platform.runLater(new Runnable() { 
          @Override public void run() { 
    
           WebView view = new WebView(); 
           engine = view.getEngine(); 
    
           engine.titleProperty().addListener(new ChangeListener<String>() { 
            @Override 
            public void changed(ObservableValue<? extends String> observable, String oldValue, final String newValue) { 
             SwingUtilities.invokeLater(new Runnable() { 
              @Override public void run() { 
               frame.setTitle(newValue); 
              } 
             }); 
            } 
           }); 
    
           engine.setOnStatusChanged(new EventHandler<WebEvent<String>>() { 
            @Override public void handle(final WebEvent<String> event) { 
             SwingUtilities.invokeLater(new Runnable() { 
              @Override public void run() { 
               lblStatus.setText(event.getData()); 
              } 
             }); 
            } 
           }); 
    
           engine.locationProperty().addListener(new ChangeListener<String>() { 
            @Override 
            public void changed(ObservableValue<? extends String> ov, String oldValue, final String newValue) { 
             SwingUtilities.invokeLater(new Runnable() { 
              @Override public void run() { 
               txtURL.setText(newValue); 
              } 
             }); 
            } 
           }); 
    
           engine.getLoadWorker().workDoneProperty().addListener(new ChangeListener<Number>() { 
            @Override 
            public void changed(ObservableValue<? extends Number> observableValue, Number oldValue, final Number newValue) { 
             SwingUtilities.invokeLater(new Runnable() { 
              @Override public void run() { 
               progressBar.setValue(newValue.intValue()); 
              } 
             }); 
            } 
           }); 
    
           engine.getLoadWorker() 
             .exceptionProperty() 
             .addListener(new ChangeListener<Throwable>() { 
    
              public void changed(ObservableValue<? extends Throwable> o, Throwable old, final Throwable value) { 
               if (engine.getLoadWorker().getState() == FAILED) { 
                SwingUtilities.invokeLater(new Runnable() { 
                 @Override public void run() { 
                  JOptionPane.showMessageDialog(
                    panel, 
                    (value != null) ? 
                    engine.getLocation() + "\n" + value.getMessage() : 
                    engine.getLocation() + "\nUnexpected error.", 
                    "Loading error...", 
                    JOptionPane.ERROR_MESSAGE); 
                 } 
                }); 
               } 
              } 
             }); 
    
           jfxPanel.setScene(new Scene(view)); 
          } 
         }); 
        } 
    
        public void loadURL(final String url) { 
         Platform.runLater(new Runnable() { 
          @Override public void run() { 
           String tmp = toURL(url); 
    
           if (tmp == null) { 
            tmp = toURL("http://" + url); 
           } 
    
           engine.load(tmp); 
          } 
         }); 
        } 
    
        private static String toURL(String str) { 
         try { 
          return new URL(str).toExternalForm(); 
         } catch (MalformedURLException exception) { 
           return null; 
         } 
        } 
    
        @Override public void run() { 
    
         frame.setPreferredSize(new Dimension(1024, 600)); 
         frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); 
    
         initComponents(); 
    
         loadURL("http://oracle.com"); 
    
         frame.pack(); 
         frame.setVisible(true); 
        } 
    
        public static void main(String[] args) { 
         SwingUtilities.invokeLater(new SimpleSwingBrowser()); 
        } 
    } 
    

    This link

    enter image description here

    는 자바 스크립트

    참조를 사용 of을 보여주는 포함 WebView의 몇 가지 유용한 예제를 제공합니다 : 여기

    은 예입니다 내가 JFXPanel가 다시 컨테이너 창에 추가 할 기운을 제거 할 때 추가하고 스윙 창에서 자바 FX 컨트롤을 제거하는 데
  • Add Java FX 2.0 to existing Netbeans project
+2

+1 아주 좋은, 수치 난 단지까지 한 번 – MadProgrammer

+0

투표 수 @MadProgrammer +1 코드에 대한 크레딧을 받기를 원하지만 참조에서 찢어졌습니다. P –

+2

네,하지만 어디에서 찾을 수 있는지 알았습니다.) – MadProgrammer