Где разместить код JOptionPaneShowInputDialog? - PullRequest
0 голосов
/ 16 января 2019

Где разместить код JOptionPaneShowInputDialog? Где разместить код JOptionPaneShowInputDialog? Где разместить код JOptionPaneShowInputDialog? Где разместить код JOptionPaneShowInputDialog? Где разместить код JOptionPaneShowInputDialog? Я хотел бы добавить JoptionPaneShowInputDialog () (еще не в коде) внутри кода ниже.

Я могу сделать, но не могу сделать диалоговое окно, появившееся на черной панели, до рекурсии.

Диалог появляется после рисования ...

public class FractalTree extends JPanel implements ActionListener
     {

      int x1=350;  
      int y1=600;
      int angle=-90;
      int depth=11;          
      int k=10;

      JLabel label_1;

      private void drawTree(Graphics g, int x1, int y1, double angle, int depth, int k)
         {
          if(depth==11)

          g.setColor(Color.GRAY);
          g.fillRect(100, 600, 1160, 10);
          g.setColor(Color.white);
          if (depth == 0) return;

          ((Graphics2D) g).setStroke(new BasicStroke((float) (k*0.9)));
          int x2 = x1 + (int) (Math.cos(Math.toRadians(angle)) * depth * 11*Math.random()+1);
          int y2 = y1 + (int) (Math.sin(Math.toRadians(angle)) * depth * 11*Math.random()+1);
          if(depth<3)
           {
             g.setColor(Color.green);
           }

          g.drawLine(x1, y1, x2, y2);
          drawTree(g, x2, y2, angle - 19, depth-1,k-1);
          drawTree(g, x2, y2, angle + 19, depth-1,k-1);

         }


    public void paintComponent(Graphics g)
     {       
            super.paintComponent(g);
            g.setColor(Color.white);

            drawTree(g,x1,y1,angle,depth,k);
            drawTree(g,x1+600,y1,angle,depth,k);    
     }


    public FractalTree()
     {      
       this.setBackground(Color.black);  
     }

    public static void gui()
          {
           JFrame f=new JFrame("fractal tree");
           JLabel label_1=new JLabel("<html>RANDOM TREE<br><center>FRACTAL");
           label_1.setForeground(Color.red);
           Font font = new Font("Courier", Font.BOLD,25);
           label_1.setFont(font);
           FractalTree ft=new FractalTree();
           f.getContentPane().add(ft);
           f.setSize(1500, 1000);
           JButton button = new JButton("Close Me");
           button.addActionListener(ft);    
           f.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);         
           ft.add(label_1);
           ft.add(button);
           f.setUndecorated(true);
           f.setVisible(true);
          }

    public static void main(String[] args)
        {               
        gui();      
        }
    @Override
    public void actionPerformed(ActionEvent e)
        {
        System.exit(0);     
        }
}

Могу ли я попросить помощи? Спасибо

1 Ответ

0 голосов
/ 16 января 2019

Вопрос и намерение не совсем ясны. Какова цель диалога?

Я предполагаю, что вы хотите собрать некоторую информацию, которая затем может быть передана в FractalTree для изменения ее рендеринга

Вопрос и намерение не совсем ясны. Какова цель диалога?

Я предполагаю, что вы хотите собрать некоторую информацию, которая затем может быть передана в FractalTree для изменения ее рендеринга, в этом случае вам, вероятно, нужно будет поместить диалоговое окно до создания FractalTree

public static void gui()
{
    // You can put the dialog here...
    JFrame f=new JFrame("fractal tree");
    //...

Если вы хотите изменить свойства FractalTree после его отображения, то вам, вероятно, нужно использовать JButton и ActionListener и поместить туда диалог ... или предоставить второй вид для сбора свойства напрямую

Фактически, цель диалогового окна - задать уровень рекурсии. Если я размещу его так, как вы предлагаете, все в порядке, но диалоговое окно появляется само по себе, а не на черной панели, и мне бы хотелось, чтобы оно появилось на панели ...

Давайте просто проясним, ТАК НЕ сайт обучения или наставничества. Ваша проблема не техническая, а опытная. Вы должны тратить больше времени на чтение учебников, таких как Создание графического интерфейса с Swing и пробование вещей. Так вы станете лучшим разработчиком и научитесь решать свои собственные проблемы.

Судя по вашим отзывам, JOptionPane не то, что вам нужно.

Вместо этого вам нужно использовать немного другой подход и указать собственный компонент ввода.

Во-первых, вам нужно изменить FractalTree, чтобы вы могли легче изменять свойство depth (и установить начальную глубину на 0, чтобы он прекратил рисовать)

public class FractalTree extends JPanel implements ActionListener {
    private int depth = 0; // set to 0 to stop it from rendering

    public void setDepth(int depth) {
        this.depth = depth;
        repaint();
    }

    public int getDepth() {
        return depth;
    }

Далее необходимо создать собственный компонент ввода, который может принимать ввод от пользователя и обновлять дерево

public class InputPane extends JPanel {
    private FractalTree fractalTree;

    private JTextField depthField;

    public InputPane(FractalTree fractalTree) {
        this.fractalTree = fractalTree;
        depthField = new JTextField(10);
        depthField.addActionListener(new ActionListener() {
            @Override
            public void actionPerformed(ActionEvent evt) {
                String text = depthField.getText().trim();
                try {
                    int value = Integer.parseInt(text);
                    fractalTree.setDepth(value);
                } catch (NumberFormatException exp) {
                    JOptionPane.showMessageDialog(InputPane.this, text + " is not a valid numerical value");
                }
            }
        });
    }

}

Затем вы хотите создать новую точку входа, которая может объединить два ...

import java.awt.EventQueue;
import javax.swing.JFrame;

public class Main {

    public static void main(String[] args) {
        EventQueue.invokeLater(new Runnable() {
            @Override
            public void run() {
                FractalTree tree = new FractalTree();
                InputPane input = new InputPane(tree);
                JFrame frame = new JFrame();
                frame.add(tree);
                frame.add(input, BorderLayout.SOUTH);
                frame.pack();
                frame.setLocationRelativeTo(null);
                frame.setVisible(true);
            }
        });
    }
}

Да, это приведет к появлению небольшого окна, потому что FractalTree не определяет никаких подсказок по размеру, которые можно решить, переопределив его метод getPreferredSize и вернув более подходящий размер.

Это создаст вам «лучший путь», есть еще проблемы, которые вам придется решать, потому что выполнение всего этого для вас не поможет вам

...