2016-07-05 10 views
0

Я хочу отобразить дерево. Но дерево не появляется. В чем проблема?Чертежное дерево не видно; возможно, вопрос размещения

Главная:

package scanner_parser; 
public class Main { 
    public static void main(String[] args) { 
     Oberflaeche gui = new Oberflaeche(); 
     gui.setVisible(true); 
    } 
} 

GUI:

import java.awt.BorderLayout; 
import java.awt.Color; 
import java.awt.event.*; 
import javax.swing.*; 

public class Oberflaeche extends JFrame implements ActionListener { 

    private JPanel cp, top, bottom; 
    private JTextField eingabefeld = new JTextField(); 
    private JButton button = new JButton("Darstellen"); 
    private JMenuBar menubar = new JMenuBar(); 
    private JMenu menu; 
    private JMenuItem anleitung, beenden, bEins, bZwei, bDrei, bVier; 
    private Baum baum = new Baum(); 

    public Oberflaeche() { 
     this.setTitle("Funktionsparser"); 
     this.setSize(900, 700); 
     this.setLocation(300, 100); 
     this.setResizable(true); 
     this.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); 

     initMenu(); 

     cp = (JPanel) this.getContentPane(); 
     cp.setLayout(new BorderLayout(2, 1)); 
     top = new JPanel(); 
     top.setLayout(null); 
     top.setBounds(0, 0, getWidth(), 50); 
     top.setBackground(Color.white); 

     bottom = new JPanel(); 
     bottom.setBounds(0, 50, getWidth(), getHeight() - 50); 
     bottom.setBackground(Color.white); 

     eingabefeld.setBounds(10, 10, getWidth() - 120, 30); 
     button.setBounds(getWidth() - 110, 10, 100, 30); 
     button.addActionListener(this); 

     top.add(button); 
     top.add(eingabefeld); 
     cp.add(top); 
     cp.add(bottom); 
    } 

    // Initialise Menu 

    private void initMenu() { 
     menu = new JMenu("Datei"); 
     anleitung = new JMenuItem("Anleitung"); 
     anleitung.addActionListener(this); 

     menu.add(anleitung); 
     beenden = new JMenuItem("Beenden"); 
     beenden.addActionListener(this); 

     menu.add(beenden); 
     menubar.add(menu); 

     menu = new JMenu("Beispiele"); 

     // Load some example functions into the textfield 

     bEins = new JMenuItem("<html>3 * x</html>"); 
     bEins.addActionListener(this); 
     menu.add(bEins); 

     bZwei = new JMenuItem("<html>3 * x<sup>2</sup></html>"); 
     bZwei.addActionListener(this); 
     menu.add(bZwei); 

     bDrei = new JMenuItem("<html>3 * (x<sup>2</sup> + 1)</html>"); 
     bDrei.addActionListener(this); 
     menu.add(bDrei); 

     bVier = new JMenuItem("<html>3 * (x<sup>2</sup> + x<sup>4</sup> + 1)</html>"); 
     bVier.addActionListener(this); 
     menu.add(bVier); 

     menubar.add(menu); 

     this.setJMenuBar(menubar); 
    } 

    @Override 
    public void actionPerformed(ActionEvent e) { 
     Object s = e.getSource(); 

     if (s == anleitung) { 

     } 

     // This should add the tree (baum) but it does not appear. 


     if (s == button) { 
      FuncParser.theParser().parse(eingabefeld.getText()); 
      FuncParser.theParser().getWurzel().print(); 
      bottom.add(baum); 
     } 
     if (s == beenden) { 
      System.exit(0); 
     } 
     if (s == bEins) { 
      eingabefeld.setText("3*x"); 
     } 
     if (s == bZwei) { 
      eingabefeld.setText("3*x^2"); 
     } 
     if (s == bDrei) { 
      eingabefeld.setText("3*(x^2+1)"); 
     } 
     if (s == bVier) { 
      eingabefeld.setText("3*(x^2+x^4+1)"); 
     } 
    } 
} 

Класс дерева:

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

public class Baum extends JPanel { 

    private final int radius = 20; 
    private final int paddingY = 75; 

    @Override 
    public void paintComponent(Graphics g) { 
     super.paintComponent(g); 
     System.out.println("test"); 
     displayBaum(g, FuncParser.theParser().getWurzel(), getWidth()/2, 100, 20 + getWidth()/4); 
    } 

    private void displayBaum(Graphics g, Knoten k, int x, int y, int paddingX) { 
     g.drawOval(x - radius, y - radius, 2 * radius, 2 * radius); 
     g.drawString(k.getDaten(), x - 4, y + 4); 

     if (k.getLinks() != null) { 
      displayKante(g, x - paddingX, y + paddingY, x, y); 
      displayBaum(g, k.getLinks(), x - paddingX, y + paddingY, 10 + paddingX/2); 
      displayKante(g, x + paddingX, y + paddingY, x, y); 
      displayBaum(g, k.getLinks(), x + paddingX, y + paddingY, 10 + paddingX/2); 
     } 
    } 

    private void displayKante(Graphics g, int x1, int y1, int x2, int y2) { 
     double d = Math.sqrt(paddingY * paddingY + (x2 - x1) * (x2 - x1)); 
     int x11 = (int) (x1 - radius * (x1 - x2)/d); 
     int y11 = (int) (y1 - radius * (y1 - y2)/d); 
     int x21 = (int) (x2 + radius * (x1 - x2)/d); 
     int y21 = (int) (y2 + radius * (y1 - y2)/d); 
     g.drawLine(x11, y11, x21, y21); 
    } 
} 

текст "тест" появляется в консоли каждый раз, когда я масштабировать окно. Это означает, что функция вызывается, но дерево не отображается на панели содержимого. Может быть, под ним что-то? Я не понимаю, почему. Пожалуйста, помогите, если у вас есть идея.

+0

Пожалуйста, не подвергайте вандализму вопросы. Если вы решили свою проблему, либо закройте свой вопрос как не воспроизводимый, либо напишите ответ, подробно описывающий, как это сделать. Вы также можете удалить свой ответ, нажав на серое слово «удалить» под тегами. –

+0

Пожалуйста, не уклоняйтесь от вопроса, если вы хотите удалить сообщение, вместо этого нажмите кнопку «удалить». – Sam

ответ

2

Уменьшение количества фрагментов в компилируемом состоянии, я получаю следующие результаты. В частности,

  • Не используйте чертеж null; в примере используется значение по умолчанию BorderLayout для JFrame и FlowLayout для Panel.

  • Используйте конструктор JTextField, который позволяет указать ширину поля в столбцах.

  • Переопределить getPreferredSize(), чтобы установить начальную геометрию области чертежа и провести по его текущим размерам.

  • Построить и управлять объектами GUI Swing только на event dispatch thread.

  • Использовать equals() в качестве == в вашем ActionListener.

image

import java.awt.BorderLayout; 
import java.awt.Color; 
import java.awt.Dimension; 
import java.awt.EventQueue; 
import java.awt.Graphics; 
import java.awt.event.ActionEvent; 
import java.awt.event.ActionListener; 
import javax.swing.JButton; 
import javax.swing.JFrame; 
import javax.swing.JLabel; 
import javax.swing.JMenu; 
import javax.swing.JMenuBar; 
import javax.swing.JMenuItem; 
import javax.swing.JPanel; 
import javax.swing.JTextField; 

/** 
* @See https://stackoverflow.com/a/38215252/230513 
*/ 
public class Main { 

    public static void main(String[] args) { 
     EventQueue.invokeLater(() -> { 
      Oberflaeche gui = new Oberflaeche(); 
      gui.setVisible(true); 
     }); 
    } 

    private static class Baum extends JPanel { 

     private final int radius = 20; 
     private final int paddingY = 75; 

     @Override 
     public void paintComponent(Graphics g) { 
      super.paintComponent(g); 
      g.drawString("Hello", 16, 16); 
      displayKante(g, 0, 0, getWidth(), getHeight()); 
     } 

     @Override 
     public Dimension getPreferredSize() { 
      return new Dimension(329, 240); 
     } 

     private void displayKante(Graphics g, int x1, int y1, int x2, int y2) { 
      double d = Math.sqrt(paddingY * paddingY + (x2 - x1) * (x2 - x1)); 
      int x11 = (int) (x1 - radius * (x1 - x2)/d); 
      int y11 = (int) (y1 - radius * (y1 - y2)/d); 
      int x21 = (int) (x2 + radius * (x1 - x2)/d); 
      int y21 = (int) (y2 + radius * (y1 - y2)/d); 
      g.drawLine(x11, y11, x21, y21); 
     } 
    } 

    private static class Oberflaeche extends JFrame implements ActionListener { 

     private JPanel top, bottom; 
     private JTextField eingabefeld = new JTextField(20); 
     private JButton button = new JButton("Darstellen"); 
     private JMenuBar menubar = new JMenuBar(); 
     private JMenu menu; 
     private JMenuItem anleitung, beenden, bEins, bZwei, bDrei, bVier; 
     private Baum baum = new Baum(); 

     public Oberflaeche() { 
      this.setDefaultCloseOperation(EXIT_ON_CLOSE); 
      this.setTitle("Funktionsparser"); 
      initMenu(); 
      top = new JPanel(); 
      top.setBackground(Color.white); 
      top.add(button); 
      top.add(eingabefeld); 
      button.addActionListener(this); 
      bottom = new JPanel(); 
      bottom.setBackground(Color.white); 
      bottom.add(new JLabel("Label text.")); 
      this.add(top, BorderLayout.NORTH); 
      this.add(baum); 
      this.add(bottom, BorderLayout.SOUTH); 
      this.pack(); 
      this.setLocationRelativeTo(null); 
     } 

     // Initialise Menu 
     private void initMenu() { 
      menu = new JMenu("Datei"); 
      anleitung = new JMenuItem("Anleitung"); 
      anleitung.addActionListener(this); 
      menu.add(anleitung); 
      beenden = new JMenuItem("Beenden"); 
      beenden.addActionListener(this); 
      menu.add(beenden); 
      menubar.add(menu); 
      menu = new JMenu("Beispiele"); 
      // Load some example functions into the textfield 
      bEins = new JMenuItem("<html>3 * x</html>"); 
      bEins.addActionListener(this); 
      menu.add(bEins); 
      bZwei = new JMenuItem("<html>3 * x<sup>2</sup></html>"); 
      bZwei.addActionListener(this); 
      menu.add(bZwei); 
      bDrei = new JMenuItem("<html>3 * (x<sup>2</sup> + 1)</html>"); 
      bDrei.addActionListener(this); 
      menu.add(bDrei); 
      bVier = new JMenuItem("<html>3 * (x<sup>2</sup> + x<sup>4</sup> + 1)</html>"); 
      bVier.addActionListener(this); 
      menu.add(bVier); 
      menubar.add(menu); 
      this.setJMenuBar(menubar); 
     } 

     @Override 
     public void actionPerformed(ActionEvent e) { 
      Object s = e.getSource(); 
      if (s == anleitung) { 
       System.out.println(anleitung); 
      } 
      if (s == button) { 
       System.out.println(button); 
      } 
      if (s == beenden) { 
       System.exit(0); 
      } 
      if (s == bEins) { 
       eingabefeld.setText("3*x"); 
      } 
      if (s == bZwei) { 
       eingabefeld.setText("3*x^2"); 
      } 
      if (s == bDrei) { 
       eingabefeld.setText("3*(x^2+1)"); 
      } 
      if (s == bVier) { 
       eingabefeld.setText("3*(x^2+x^4+1)"); 
      } 
     } 
    } 
} 
1

Вы добавляете обе панели к центру панели содержимого, cp, и вы никогда не добавить baum. Используйте ограничения для таких панелей:

cp.add(top, BorderLayout.NORTH); 
cp.add(baum, BorderLayout.CENTER); 
cp.add(bottom, BorderLayout.SOUTH);