Подокно появляется на заднем плане главного окна? - PullRequest
0 голосов
/ 21 марта 2020

У меня проблема Когда я открываю главное окно, а затем нажимаю кнопку, которая появляется в другом подокне (еще один кадр), это подокно появляется под основным окном (на заднем плане), которое я должен скрыть сначала главное окно, а затем я нахожу подокно. Я хочу, чтобы все, что я хотел показать, отображается над главным окном, а не под ним

Frame f = new Frame();
        f.setAlwaysOnTop(true);
        f.setSize(1079, 621);
        f.setLocationRelativeTo(null);//
        f.pack();
        f.setVisible(true);

кнопка, которая отображает рисунок:

private void muBtnActionPerformed(java.awt.event.ActionEvent evt) {                                      
        XYDataset dataset = createDatasetManchester(text.getText());

        // Create chart
        JFreeChart chart = ChartFactory.createXYLineChart("Manchester codage", "", "", dataset, PlotOrientation.VERTICAL, true, true, false);
        ChartFrame frame = new ChartFrame("Manchester ", chart);
        frame.setSize(1080, 720);

        // TODO add your handling code here:
        frame.setVisible(true);
        frame.setDefaultCloseOperation(DISPOSE_ON_CLOSE);
    }              

1 Ответ

1 голос
/ 21 марта 2020

Без кода трудно угадать точную проблему, но, сказав, что подокно должно быть не другим JFrame, а JDialog, созданным на основе исходного JFrame.

Для более подробного ответа, пожалуйста, предоставьте соответствующий код.

Также прочитайте: Использование нескольких JFrames, хорошая / плохая практика?


Редактировать:

Исходя из вашего поста кода: Frame f = new Frame();
вы, похоже, используете класс java.awt.Frame и смешиваете его с классами Swing. Это приведет к катастрофе, так как при этом компоненты «тяжелого веса» (AWT) смешиваются с компонентами «легкого веса» (Swing), и вам не следует этого делать.

Например, использование диалогов. Обратите внимание, что весь код можно скопировать и вставить в один большой класс с именем TwoWindowsMain.java

. Классы включают

  • Класс TwoWindowsMain, который имеет метод main и запускает GUI в Поток событий Swing
  • Класс FirstWindow
    • Здесь есть поле JFrame, mainFrame, в котором отображается основной GUI
    • . Также имеется JButton, в котором отображается второе окно в его ActionListener
    • Имеет поле SecondWindow с именем secondWindow, которое отображается в ActionListener выше
  • Класс SecondWindow, который содержит JDialog с именем dialogWindow
    • Конструктор принимает параметр JFrame, который передается в конструктор JDialog
import java.awt.Dialog.ModalityType;
import java.awt.Dimension;
import javax.swing.*;

public class TwoWindowsMain {
    public static void main(String[] args) {
        SwingUtilities.invokeLater(() -> {
            new FirstWindow().display();
        });
    }
}
class FirstWindow {
    private JFrame mainFrame;
    private SecondWindow secondWindow;

    public FirstWindow() {
        JButton button = new JButton("Show Second Window");
        button.addActionListener(event -> {
            if (secondWindow == null) {
                secondWindow = new SecondWindow(mainFrame);
            }
            secondWindow.display();
        });

        JPanel panel = new JPanel();
        panel.setPreferredSize(new Dimension(800, 600));
        panel.add(button);

        mainFrame = new JFrame("First Window");
        mainFrame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        mainFrame.add(panel);
        mainFrame.pack();
        mainFrame.setLocationRelativeTo(null);
    }

    public void display() {
        mainFrame.setVisible(true);
    }
}
class SecondWindow {
    private JDialog dialogWindow;

    public SecondWindow(JFrame frame) {
        dialogWindow = new JDialog(frame, "Second Window", ModalityType.MODELESS);
        dialogWindow.setPreferredSize(new Dimension(300, 200));
        dialogWindow.pack();
        dialogWindow.setLocationRelativeTo(frame);
    }

    public void display() {
        dialogWindow.setVisible(true);
    }
}

Второе редактирование:
Относительно этого кода:

private void muBtnActionPerformed(java.awt.event.ActionEvent evt) {                                      
    XYDataset dataset = createDatasetManchester(text.getText());
    JFreeChart chart = ChartFactory.createXYLineChart("Manchester codage", "", "", dataset, PlotOrientation.VERTICAL, true, true, false);
    ChartFrame frame = new ChartFrame("Manchester ", chart);
    frame.setSize(1080, 720);
    frame.setVisible(true);
    frame.setDefaultCloseOperation(DISPOSE_ON_CLOSE);
}

Ваша проблема здесь ChartFrame frame = new ChartFrame("Manchester ", chart);

Вам не нужен ChartFrame объект, который выходит из JFrame, а скорее ChartPanel, который вы можете поместить в JDialog, someth Например,

private void muBtnActionPerformed(java.awt.event.ActionEvent evt) {                                      
    XYDataset dataset = createDatasetManchester(text.getText());
    JFreeChart chart = ChartFactory.createXYLineChart("Manchester codage", "", "", dataset, PlotOrientation.VERTICAL, true, true, false);
    // ChartFrame frame = new ChartFrame("Manchester ", chart);
    ChartPanel panel = new ChartPanel(chart);
    JDialog dialog = new JDialog(frame, "Manchester", ModalityType.MODELESS)
    dialog.setDefaultCloseOperation(DISPOSE_ON_CLOSE);
    dialog.add(panel);
    dialog.pack();
    dialog.setVisible(true);
}

Вопрос в том, какой объект передать в конструктор JDialog для JFrame, который выше называется frame, и это будет зависеть от того, как будет создан остальной код. Переменная может быть this, но я точно не могу сказать

...