0
votes

A while back I started a project that soon built up a shed load of code, most of the code was made up of components and their properties. All was going well until I hit an error. Off the top of head, the error was something on the line of exceeding the code limit of a constructor, roughly 65000 bytes.

This error has literally bought me and my project to halt. At the same time I have also found major problems in my understanding of SWING.

What I tried was to break my game code into logical sections, putting each section into a different class. For example, a jpanel which dealt with buying and selling would be its own .java file. Another jpanel that dealt with shipping would be in another .java file.

What I hoped to achieve was a JFrame that called each of these jpanels when the user requested it at the press of a jbutton. However, this didn't quite work as I wished, putting me in a position where I need help.

What I have done is simplified my problem by creating an example framework, hoping that somebody could point out what I need to be looking at, possibly even a solution.

I have created a JFrame which holds a panel called bg, which itself holds 2 JButtons (btn1 and btn2). In a different class file I have created a JPanel called panel1, and in another class again I have created another JPanel called panel2.

When the user opens the application they are presented with a frame and the option of two buttons, when any of these buttons are pressed I would like for either panel1 or panel2 to open. How would this be done?

Any help would be greatly appreciated. Thanks in advance.

////////////// frame

package panel;

import java.awt.Color;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import javax.swing.JButton;
import javax.swing.JFrame;
import javax.swing.JPanel;

public class Frame implements ActionListener {

public JPanel bg;
public static JButton btn1, btn2;

public Frame(){

    JFrame f = new JFrame();
    f.setSize(308, 205);
    f.setLayout(null);
    f.setLocationRelativeTo(null);
    f.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
    f.setVisible(true);

    bg = new JPanel();
    bg.setSize(300, 200);
    bg.setLocation(0, 0);
    bg.setLayout(null);
    bg.setBackground(Color.black);
    bg.setVisible(true);

    btn1 = new JButton("open 1");
    btn1.setSize(135, 30);
    btn1.setLocation(10, 10);
    btn1.addActionListener(this);

    btn2 = new JButton("open 2");
    btn2.setSize(135, 30);
    btn2.setLocation(155, 10);
    btn2.addActionListener(this);

    bg.add(btn1);
    bg.add(btn2);
    f.add(bg);  
}

public static void main(String[] args) {
    new Frame();
}



@Override
public void actionPerformed(ActionEvent a) {

    if (a.getSource() == btn1){

    }
    if (a.getSource() == btn2){

    }
}
}







////////////////////// panel1

package panel;

import java.awt.Color;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import javax.swing.JButton;
import javax.swing.JPanel;

public class panel1  implements ActionListener {

public JButton btn3;

public panel1(){

    JPanel a = new JPanel();
    a.setSize(280, 110);
    a.setLocation(155, 10);
    a.setBackground(Color.red);
    a.setVisible(true);

    btn3 = new JButton("open bb");
    btn3.setSize(100, 30);
    btn3.setLocation(10, 10);
    btn3.addActionListener(this);

    a.add(btn3);
}

@Override
public void actionPerformed(ActionEvent a) {
    if (a.getSource() == btn3){

    }
}
}







//////////////////////////// panel2.java

package panel;

import java.awt.Color;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import javax.swing.JButton;
import javax.swing.JPanel;

public class panel2 implements ActionListener {

public JButton btn4;

public panel2(){
    JPanel b = new JPanel();
    b.setSize(280, 110);
    b.setLocation(155, 10);
    b.setBackground(Color.blue);
    b.setVisible(true);

    btn4 = new JButton("open");
    btn4.setSize(100, 30);
    btn4.setLocation(10, 10);
    btn4.addActionListener(this);

    b.add(btn4);
}

@Override
public void actionPerformed(ActionEvent a) {
    if (a.getSource() == btn4){

    }
}
}
1
have tried adding a new instance of one of the panels to bg? what happens?Marco Bolis
I have tried many bits of code, if I remember correctly, I got a completely blank inner jframe (grey).dazbrad
What do you mean by "when any of these buttons are pressed I would like for either panel1 or panel2 to open"? Are you sure you dont want some type of JDialog implementation?Mark W
Lol, I thought someone would say that. What I meant was, if btn1 is pressed, panel1 gets displayed in jframe. When btn2 is pressed, I would.like panel2 to be displayed. Sorry, my bad.dazbrad
You want the panels to open as new windows or just inside the frame?Nikki

1 Answers

0
votes

You don't need to split your panels into different classes for something this simple. Try keeping everything together:

package panel;

import java.awt.Color;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import javax.swing.JButton;
import javax.swing.JFrame;
import javax.swing.JPanel;

public class Frame implements ActionListener {

public JPanel bg,panel1,panel2;
public static JButton btn1, btn2;

public Frame(){

JFrame f = new JFrame();
f.setSize(308, 205);
f.setLayout(null);
f.setLocationRelativeTo(null);
f.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
f.setVisible(true);

bg = new JPanel();
bg.setSize(300, 200);
bg.setLocation(0, 0);
bg.setLayout(null);
bg.setBackground(Color.black);
bg.setVisible(true);

btn1 = new JButton("open 1");
btn1.setSize(135, 30);
btn1.setLocation(10, 10);
btn1.addActionListener(this);

btn2 = new JButton("open 2");
btn2.setSize(135, 30);
btn2.setLocation(155, 10);
btn2.addActionListener(this);

bg.add(btn1);
bg.add(btn2);
f.add(bg);  

panel1 = new JPanel();
panel1.setSize(280, 110);
panel1.setLocation(155, 10);
panel1.setBackground(Color.red);
panel1.setVisible(false);
bg.add(panel1);

panel2 = new JPanel();
panel2.setSize(280, 110);
panel2.setLocation(155, 10);
panel2.setBackground(Color.blue);
panel2.setVisible(false);
bg.add(panel2);



}

public static void main(String[] args) {
new Frame();
}



@Override
public void actionPerformed(ActionEvent a) {

if (a.getSource() == btn1){
panel1.setVisible(true);panel2.setVisible(false);
}
if (a.getSource() == btn2){
panel1.setVisible(false);panel2.setVisible(true);
}
}
}