2014-02-27 41 views
0

回過頭來,我開始了一個項目,很快就建立了一個大量的代碼,大部分代碼都是由組件及其屬性組成的。一切都很順利,直到我遇到了錯誤。在頭頂上,錯誤是超出構造函數的代碼限制的行,大約65000字節。從JFrame調用的外部JPanels

這個錯誤實際上是給我和我的項目停下來的。同時我也發現了我對SWING的理解方面的主要問題。

我試過的是把我的遊戲代碼分成邏輯部分,把每個部分放到不同的類中。例如,處理購買和銷售的jpanel將是它自己的.java文件。處理髮貨的另一個jpanel將在另一個.java文件中。

我希望實現的是一個JFrame,當用戶在按下jbutton時請求它時,會調用這些jpanel中的每一個。然而,這並沒有按照我的意願行事,讓我處於需要幫助的位置。

我所做的是通過創建一個示例框架來簡化我的問題,希望有人能指出我需要看什麼,甚至可能是一個解決方案。

我創建了一個JFrame,它包含一個名爲bg的面板,該面板本身擁有2個JButton(btn1和btn2)。在另一個類文件中,我創建了一個名爲panel1的JPanel,並在另一個類中再次創建了另一個名爲panel2的JPanel。

當用戶打開應用程序時,他們會看到一個框架和兩個按鈕的選項,當按下其中任何一個按鈕時,我想要打開panel1或 panel2。這將如何完成?

任何幫助將不勝感激。提前致謝。

////////////// 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){ 

    } 
} 
} 
+0

已嘗試添加一個面板的新實例到'bg'?怎麼了? –

+0

我已經嘗試了許多代碼,如果我沒有記錯,我有一個完全空白的內部jframe(灰色)。 – dazbrad

+0

你是什麼意思的「當任何這些按鈕被按下我想爲panel1或panel2打開」?你確定你不想要某種類型的JDialog實現嗎? –

回答

0

您不需要將面板拆分爲不同的類就可以實現這種簡單的功能。儘量保持在一起:

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); 
} 
} 
} 
+0

我試圖在這裏簡化我的問題。最初我有更多的代碼在一起,但我的代碼吐出錯誤告訴我,我已經超過了構造函數的限制。我原來的項目接近30,000行代碼。 – dazbrad

+0

爲什麼你需要這麼多的構造函數?它的作用是創建對象,而不是設置所有的單個屬性。使用其他方法。 – Nikki

+0

我實際上試圖減少構造函數中的代碼量,因爲我意識到它太多了。我需要通過將我的邏輯分成幾部分來減少它。我無法消除我所需要的代碼,因此我需要嘗試將其分解爲單獨的區域。 – dazbrad