Я программирую что-то, что открывает начальный JFrame. Этот JFrame имеет контейнер, который содержит панель. На этой панели я запрограммировал некоторую простую анимацию, которая работает с несколькими кнопками. Когда я нажимаю кнопку, открывается второй JFrame, содержащий компоненты Swing (комбинированные поля; текстовые поля и т. Д. c), которые будут служить формой.
То, чего я намерен достичь, - это простая вещь: Первоначальный JFrame закрывается, и только второй JFrame остается открытым (видимым).
Я постараюсь показать основную структуру кода, которая у меня уже есть, просто для простоты:
public class DBLauncher extends JFrame
{
//Constructor
public DBLauncher() throws IOException
{
super("Database Launcher v1.0");
setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
setSize(706, 768);
setLocation(350, 50);
setResizable(false);
DBPanel panel = new DBPanel();
Container container = getContentPane();
container.setLayout(new BorderLayout()); //Use BorderLayout
container.add(panel, BorderLayout.CENTER); //Insert e center panel on BorderLayout
}
private class DBPanel extends JPanel implements MouseListener, MouseMotionListener
{
//Constants...
//Variables...
//Constructor
private DBPanel() throws IOException
{
//Panel constants...
//Panel variables...
...
...
this.setOpaque(false);
this.setFocusable(true);
this.addMouseListener(this);
this.addMouseMotionListener(this);
Thread thread = new Thread(() -> animate());
thread.start();
}
public void delay(int milliseconds)
{
try
{
Thread.sleep(milliseconds);
}
catch (InterruptedException e)
{
}
}
@Override
protected void paintComponent(Graphics g)
{
super.paintComponent(g);
Graphics2D g2 = (Graphics2D) g;
g2.setRenderingHint(RenderingHints.KEY_ANTIALIASING, RenderingHints.VALUE_ANTIALIAS_ON);
g2.setColor(new Color(100, 100, 100, 230)); //Define panel's transparent background using Color(r, g, b, a) where the "a" value = alpha channel
g2.fillRect(0, 0, getWidth(), getHeight());
for (CustomShapeButton mainShapeButton : shapeButtons)
{
mainShapeButton.paintComponent(g2);
}
for (CustomShapeButton mainShapeWireFrame : shapeWireFrames)
{
mainShapeWireFrame.paintComponent(g2);
}
}
@Override
public void mouseClicked(MouseEvent me)
{
for (int i = 0; i < shapeButtons.size(); i++)
{
Shape shape = shapeButtons.get(i);
if (shape.contains(me.getPoint()))
{
switch (i)
{
case 0:
...
...
...
case 11:
{
musicButtonPressed = false;
tvButtonPressed = false;
gamesButtonPressed = true;
booksButtonPressed = false;
techButtonPressed = false;
try
{
CardInsert ci = new CardInsert();
ci.setVisible(true);
//É aqui que estou a criar a nova instância do segundo JFrame que aparece no ecrã (formulário).
//É também aqui que deveria fechar a instância do JFrame inicial onde estão os botões, certo? Não estou conseguindo aceder à instância aqui para fazer dispose() ou setVisible(false), por exemplo.
}
catch (InstantiationException | IllegalAccessException | UnsupportedLookAndFeelException | ClassNotFoundException ex)
{
Logger.getLogger(DBPanel.class.getName()).log(Level.SEVERE, null, ex);
}
System.out.println("Clicked on shape number " + i + " that represents the cards button!");
break;
}
}
}
}
}
public synchronized void animate()
{
while (true)
{
if (musicButtonPressed == true)
{
animateShapeButtonMusic();
...
...
delay(35);
repaint();
}
}
}
//Animate methods
...
...
//Método main
public static void main(String args[]) throws IOException
{
//Aqui estou a criar uma instância da classe inicial DBLauncher (JFrame inicial)
DBLauncher dbl = new DBLauncher();
//Aqui digo que essa instância tem que estar visivel, por defeito, sempre que executo o programa pela primeira vez
dbl.setVisible(true);
}
}
}
В отчаянии я даже пытался создать экземпляр не-stati c объекта внутри метода main, но на самом деле я ожидал ошибку "Невозможно сослаться на методы stati c от не-stati c ... ", потому что основной метод - stati c. Как вы можете себе представить, я хотел бы сделать то же самое во втором JFrame: закрыть его, когда я нажму кнопку Главного меню, и go вернуться к исходному JFrame ...
Но я также думаю, что может усложнить это. Есть ли для меня простой способ сделать это только с одним JFrame и, таким образом, показать / скрыть несколько панелей внутри уже созданного контейнера?
Спасибо всем, J Amorim