Я хочу отобразить дерево. Но дерево не появляется. В чем проблема?Чертежное дерево не видно; возможно, вопрос размещения
Главная:
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);
}
}
текст "тест" появляется в консоли каждый раз, когда я масштабировать окно. Это означает, что функция вызывается, но дерево не отображается на панели содержимого. Может быть, под ним что-то? Я не понимаю, почему. Пожалуйста, помогите, если у вас есть идея.
Пожалуйста, не подвергайте вандализму вопросы. Если вы решили свою проблему, либо закройте свой вопрос как не воспроизводимый, либо напишите ответ, подробно описывающий, как это сделать. Вы также можете удалить свой ответ, нажав на серое слово «удалить» под тегами. –
Пожалуйста, не уклоняйтесь от вопроса, если вы хотите удалить сообщение, вместо этого нажмите кнопку «удалить». – Sam