【问题标题】:External JPanels called from a JFrame从 JFrame 调用的外部 JPanel
【发布时间】:2014-02-27 20:09:16
【问题描述】:

不久前,我开始了一个项目,该项目很快就构建了大量代码,大部分代码都是由组件及其属性组成的。一切都很顺利,直到我遇到错误。头顶上,错误是超出了构造函数的代码限制,大约 65000 字节。

这个错误确实让我和我的项目停止了。同时我也发现自己对 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){

    }
}
}

【问题讨论】:

  • 已尝试将其中一个面板的新实例添加到bg?会发生什么?
  • 我尝试了很多代码,如果我没记错的话,我得到了一个完全空白的内部jframe(灰色)。
  • “当按下这些按钮中的任何一个时,我希望 panel1 或 panel2 打开”是什么意思?你确定你不想要某种类型的 JDialog 实现吗?
  • 大声笑,我以为有人会这么说。我的意思是,如果按下 btn1,panel1 会显示在 jframe 中。当按下 btn2 时,我希望 panel2 被显示。对不起,我的错。
  • 您希望面板作为新窗口打开还是仅在框架内打开?

标签: java swing jframe jpanel add


【解决方案1】:

对于这么简单的事情,您不需要将面板分成不同的类。尝试将所有内容放在一起:

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

【讨论】:

  • 我试图在这里简化我的问题。最初我有更多的代码,但我的代码吐出错误,告诉我我已经超出了构造函数的限制。我最初的项目接近 30,000 行代码。
  • 为什么在构造函数中需要这么多?它的作用是创建对象,而不是设置一切单一属性。使用其他方法。
  • 我实际上试图减少构造函数中的代码量,因为我意识到它太多了。我需要通过将我拥有的内容分成逻辑部分来减少它。我无法消除我需要的所有代码,因此我需要尝试将其分解为单独的区域。
  • @dazbrad 不做构造函数中的工作,而是将创建分解为一系列方法调用和内部类
  • 理想的疯狂程序员,我喜欢将它完全分解成单独的文件。我想做的是为每个页面创建一个 .java 文件。我的意思是我想要一个 jpanel 让我们说航运。在该面板上,我希望所有相关组件都能发货。与运输有关的一切都放在一个 .java 文件中,可以在需要时调用。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2011-10-03
  • 2013-06-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多