java—我无法通过jfilechooser加载图形并实际显示它

xkftehaa  于 2021-06-30  发布在  Java
关注(0)|答案(1)|浏览(417)

所以,我有一个继承自jframe的类,它有两个jsplitpane和一个菜单栏。一个jsplitpane在顶部有一个jsplitpane,在底部有一个textarea,另一个jsplitpane左右各有两个jpanel。我想解析一个通过jfilechooser选择的pnml文件(或者更多,但我现在只是想让一个工作)。我可以选择一个文件,并通过打印文件名对其进行测试,这是可行的,但我无法在左侧jpanel中实际显示图形。也许有人能帮我。这是我的课:

  1. import pnml_parsing.Parser;
  2. import java.awt.BorderLayout;
  3. import java.awt.event.MouseAdapter;
  4. import java.awt.event.MouseEvent;
  5. import java.awt.event.ActionListener;
  6. import java.awt.event.ActionEvent;
  7. import java.io.File;
  8. import java.util.Arrays;
  9. import javax.swing.JComponent;
  10. import javax.swing.JFrame;
  11. import javax.swing.JLabel;
  12. import javax.swing.JPanel;
  13. import javax.swing.JScrollPane;
  14. import javax.swing.JSplitPane;
  15. import javax.swing.JTextArea;
  16. import javax.swing.JMenuBar;
  17. import javax.swing.JToolBar;
  18. import javax.swing.JMenu;
  19. import javax.swing.JMenuItem;
  20. import javax.swing.JButton;
  21. import javax.swing.JFileChooser;
  22. import javax.swing.filechooser.FileFilter;
  23. import org.graphstream.ui.swingViewer.ViewPanel;
  24. import org.graphstream.ui.view.Viewer;
  25. import org.graphstream.ui.view.ViewerPipe;
  26. public class Fenster_test extends JFrame {
  27. /**default serial version ID */
  28. private static final long serialVersionUID = 1L;
  29. private Controller controller;
  30. private ViewPanel viewPanel1;
  31. private ViewPanel viewPanel2;
  32. private JLabel statusLabel;
  33. JTextArea textfield = new JTextArea();
  34. JSplitPane leftRight = new JSplitPane();
  35. JComponent bottom = new JScrollPane(textfield);
  36. JPanel jpnlGraph = new JPanel(new BorderLayout());
  37. JPanel resultGraph = new JPanel(new BorderLayout());
  38. JLabel label = new JLabel();
  39. JToolBar tbar = new JToolBar();
  40. JMenuBar mbar = new JMenuBar();
  41. JMenu datei = new JMenu("Datei");
  42. JButton reset = new JButton("reset");
  43. JButton markerplus = new JButton("+");
  44. JButton markerminus = new JButton("-");
  45. JButton loescheEG = new JButton("EG löschen");
  46. JMenuItem dateiwahl = new JMenuItem("Datei auswählen");
  47. JMenuItem dateienwahl = new JMenuItem("Dateien auswählen");
  48. JFileChooser jfc = new JFileChooser();
  49. File[] files;
  50. final JSplitPane topBottom = new JSplitPane(JSplitPane.VERTICAL_SPLIT);
  51. public Fenster_test(String titel) {
  52. super(titel);
  53. jfc.setMultiSelectionEnabled(true);
  54. jfc.setFileFilter(new FileFilter() {
  55. public String getDescription() {
  56. return "PNML Dateien (*.pnml)";
  57. }
  58. public boolean accept(File f) {
  59. if (f.isDirectory()) {
  60. return true;
  61. } else {
  62. String filename = f.getName().toLowerCase();
  63. return filename.endsWith(".pnml") || filename.endsWith(".pnml") ;
  64. }
  65. }
  66. });
  67. System.setProperty("org.graphstream.ui.renderer",
  68. "org.graphstream.ui.j2dviewer.J2DGraphRenderer");
  69. // Erzeuge Controllers
  70. //controller = new Controller(this);
  71. // Layout des JFrames setzen
  72. this.setLayout(new BorderLayout());
  73. // Erzeuge und initialisiere ein Panel zur Anzeige des Graphen
  74. //initPanelGraph();
  75. // Einbetten des ViewPanels ins JPanel
  76. //jpnlGraph = new JPanel(new BorderLayout());
  77. //jpnlGraph.add(BorderLayout.CENTER, viewPanel1);
  78. // Füge das JPanel zum Haupt-Frame hinzu
  79. this.add(jpnlGraph, BorderLayout.CENTER);
  80. mbar.add(datei);
  81. tbar.add(loescheEG);
  82. tbar.add(markerplus);
  83. tbar.add(markerminus);
  84. tbar.add(reset);
  85. datei.add(dateiwahl);
  86. //initPanelGraph();
  87. controller = new Controller(jpnlGraph);
  88. label.setText("<No Graph>");
  89. jpnlGraph.add(label);
  90. dateiwahl.addActionListener(new ActionListener() {
  91. @Override
  92. public void actionPerformed(ActionEvent e) {
  93. jfc.showOpenDialog(null);
  94. files = jfc.getSelectedFiles();
  95. if(files == null) {
  96. System.out.println("Keine Datei(en) ausgewählt");
  97. }else {
  98. Parser parser = new Parser(files[0]);
  99. parser.initParser();
  100. parser.parse(); //parses File
  101. initPanelGraph();
  102. }
  103. if(files.length>1) {
  104. Arrays.sort(files);
  105. //mehrere Dateien durchlaufen
  106. for(int i=0; i<files.length; i++) {
  107. System.out.println("Datei "+files[i].getPath()+"ausgewählt");
  108. }
  109. }
  110. jfc.setCurrentDirectory(files[0].getParentFile());
  111. }
  112. });
  113. mbar.add(tbar);
  114. this.setJMenuBar(mbar);
  115. this.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
  116. this.setBounds(200, 200, 400, 300);
  117. topBottom.setTopComponent(leftRight);
  118. topBottom.setBottomComponent(bottom);
  119. leftRight.setLeftComponent(jpnlGraph);
  120. leftRight.setRightComponent(resultGraph);
  121. this.add(topBottom, BorderLayout.CENTER);
  122. this.setSize(1000, 700);
  123. this.setVisible(true);
  124. topBottom.setDividerLocation(0.8);
  125. leftRight.setDividerLocation(0.5);
  126. }
  127. private void initPanelGraph() {
  128. Viewer viewer = new Viewer(controller.getGraph(), //this method actually converts my own model of my pnml-File to Nodes and Edges for graphstream
  129. Viewer.ThreadingModel.GRAPH_IN_ANOTHER_THREAD);
  130. viewer.disableAutoLayout();
  131. viewPanel1 = viewer.addDefaultView(false);
  132. ViewerPipe viewerPipe = viewer.newViewerPipe();
  133. ClickListener clickListener = new ClickListener(controller);
  134. viewerPipe.addViewerListener(clickListener);
  135. viewPanel1.addMouseListener(new MouseAdapter() {
  136. @Override
  137. public void mousePressed(MouseEvent me) {
  138. System.out.println("MyFrame - mousePressed: " + me);
  139. viewerPipe.pump();
  140. }
  141. @Override
  142. public void mouseReleased(MouseEvent me) {
  143. System.out.println("MyFrame - mouseReleased: " + me);
  144. viewerPipe.pump();
  145. }
  146. });
  147. }

在我尝试使用jfilechooser和硬编码.pnml路径之前,它工作得很好。构造器看起来像这样。现在我只需要调用new fensterètest(“我的帧的名称”);在我的main方法中,之前我也在main方法中进行解析。

  1. public Fenster_test(String titel) {
  2. super(titel);
  3. System.setProperty("org.graphstream.ui.renderer",
  4. "org.graphstream.ui.j2dviewer.J2DGraphRenderer");
  5. controller = new Controller(this);
  6. this.setLayout(new BorderLayout());
  7. initPanelGraph();
  8. jpnlGraph.add(BorderLayout.CENTER, viewPanel1);
  9. this.add(jpnlGraph, BorderLayout.CENTER);
  10. this.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
  11. this.setBounds(200, 200, 400, 300);
  12. topBottom.setTopComponent(leftRight);
  13. topBottom.setBottomComponent(bottom);
  14. leftRight.setLeftComponent(jpnlGraph);
  15. leftRight.setRightComponent(resultGraph);
  16. this.add(topBottom, BorderLayout.CENTER);
  17. this.setSize(1024, 720);
  18. this.setVisible(true);
  19. topBottom.setDividerLocation(0.8);
  20. leftRight.setDividerLocation(0.5);
  21. }
vhmi4jdf

vhmi4jdf1#

因为你没有提供一个最小的,可运行的例子,我创建了我自己的。
下面是一个简单的图像显示gui。

我创造了一个 JFrame 带着一幅画 JPanel . 创建 JFrame 是在 run 方法。图纸 JPanel 在单独的类中创建。我延伸 JPanel 因为我想覆盖 paintComponent 方法。
使用此代码可以创建一个简单的gui来显示一个医学图像。一旦你开始工作,小心地将代码添加到你的简单gui中。在添加的每一小段代码(<20行)之后测试gui。
使用空布局和绝对定位不是一个好主意。swing设计用于布局管理器。
下面是完整的可运行代码。

  1. import java.awt.BorderLayout;
  2. import java.awt.Dimension;
  3. import java.awt.Graphics;
  4. import java.awt.event.ActionEvent;
  5. import java.awt.event.ActionListener;
  6. import java.awt.image.BufferedImage;
  7. import java.io.File;
  8. import java.io.IOException;
  9. import javax.imageio.ImageIO;
  10. import javax.swing.JFileChooser;
  11. import javax.swing.JFrame;
  12. import javax.swing.JMenu;
  13. import javax.swing.JMenuBar;
  14. import javax.swing.JMenuItem;
  15. import javax.swing.JPanel;
  16. import javax.swing.SwingUtilities;
  17. import javax.swing.filechooser.FileNameExtensionFilter;
  18. public class ImageDisplay implements Runnable {
  19. public static void main(String[] args) {
  20. SwingUtilities.invokeLater(new ImageDisplay());
  21. }
  22. private ImageDisplayModel model;
  23. private ImagePanel imagePanel;
  24. private JFrame frame;
  25. public ImageDisplay() {
  26. this.model = new ImageDisplayModel();
  27. }
  28. @Override
  29. public void run() {
  30. frame = new JFrame("Image Display");
  31. frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
  32. frame.setJMenuBar(createMenuBar());
  33. imagePanel = new ImagePanel(model);
  34. frame.add(imagePanel, BorderLayout.CENTER);
  35. frame.pack();
  36. frame.setLocationByPlatform(true);
  37. frame.setVisible(true);
  38. }
  39. private JMenuBar createMenuBar() {
  40. JMenuBar menubar = new JMenuBar();
  41. JMenu filemenu = new JMenu("File");
  42. JMenuItem openitem = new JMenuItem("Open...");
  43. openitem.addActionListener(new OpenFileListener(this, model));
  44. filemenu.add(openitem);
  45. menubar.add(filemenu);
  46. return menubar;
  47. }
  48. public void updateImagePanel(int width, int height) {
  49. imagePanel.setPreferredSize(width, height);
  50. imagePanel.repaint();
  51. frame.pack();
  52. }
  53. public JFrame getFrame() {
  54. return frame;
  55. }
  56. public class ImagePanel extends JPanel {
  57. private static final long serialVersionUID = 1L;
  58. private ImageDisplayModel model;
  59. public ImagePanel(ImageDisplayModel model) {
  60. this.model = model;
  61. this.setPreferredSize(649, 480);
  62. }
  63. public void setPreferredSize(int width, int height) {
  64. this.setPreferredSize(new Dimension(width, height));
  65. }
  66. @Override
  67. protected void paintComponent(Graphics g) {
  68. super.paintComponent(g);
  69. BufferedImage image = model.getImage();
  70. if (image != null) {
  71. g.drawImage(image, 0, 0, this);
  72. }
  73. }
  74. }
  75. public class OpenFileListener implements ActionListener {
  76. private ImageDisplay frame;
  77. private ImageDisplayModel model;
  78. public OpenFileListener(ImageDisplay frame, ImageDisplayModel model) {
  79. this.frame = frame;
  80. this.model = model;
  81. }
  82. @Override
  83. public void actionPerformed(ActionEvent event) {
  84. JFileChooser chooser = new JFileChooser();
  85. FileNameExtensionFilter filter = new FileNameExtensionFilter(
  86. "JPG & PNG Images", "jpg", "png");
  87. chooser.addChoosableFileFilter(filter);
  88. chooser.setFileSelectionMode(JFileChooser.FILES_ONLY);
  89. File file = model.getFile();
  90. if (file != null) {
  91. chooser.setCurrentDirectory(file);
  92. }
  93. int result = chooser.showOpenDialog(frame.getFrame());
  94. if (result == JFileChooser.APPROVE_OPTION) {
  95. File selectedFile = chooser.getSelectedFile();
  96. model.setFile(selectedFile);
  97. BufferedImage image;
  98. try {
  99. image = ImageIO.read(selectedFile);
  100. model.setImage(image);
  101. frame.updateImagePanel(image.getWidth(),
  102. image.getHeight());
  103. } catch (IOException e) {
  104. e.printStackTrace();
  105. }
  106. }
  107. }
  108. }
  109. public class ImageDisplayModel {
  110. private BufferedImage image;
  111. private File file;
  112. public BufferedImage getImage() {
  113. return image;
  114. }
  115. public void setImage(BufferedImage image) {
  116. this.image = image;
  117. }
  118. public File getFile() {
  119. return file;
  120. }
  121. public void setFile(File file) {
  122. this.file = file;
  123. }
  124. }
  125. }
展开查看全部

相关问题