Без кода трудно угадать точную проблему, но, сказав, что подокно должно быть не другим 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
, но я точно не могу сказать