在我的程序中,我有一个基于向导的布局。由CardLayout实现。因此,有一组类扩展了JPanel。我想在每个面板上都有按钮来导航到其他面板。例如,当程序显示第一面板时,我想有一个按钮来显示第二面板。
我试图在main cardlayout panel holder中创建一个方法,以便任何其他类都可以通过该方法更改显示面板,但它不起作用,并且出现了stackoverflow错误。
这是我的课程
基架:
public class Base {
JFrame frame = new JFrame("Panel");
BorderLayout bl = new BorderLayout();
public Base(){
frame.setLayout(bl);
frame.setSize(800, 600);
frame.add(new LeftBar(), BorderLayout.WEST);
frame.add(new MainPanel(), BorderLayout.CENTER);
frame.setLocationRelativeTo(null);
frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
frame.setVisible(true);
}
/**
* @param args the command line arguments
*/
public static void main(String[] args) {
// TODO code application logic here
new Base();
}
}
持有子面板的主类:
public class MainPanel extends JPanel {
private CardLayout cl = new CardLayout();
private JPanel panelHolder = new JPanel(cl);
public MainPanel() {
NewSession session = new NewSession();
ChooseSource chooseSource = new ChooseSource();
panelHolder.add(session, "Session");
panelHolder.add(chooseSource, "ChooseSource");
cl.show(panelHolder, "Session");
add(panelHolder);
}
public void showPanel(String panelIdentifier){
cl.show(panelHolder, panelIdentifier);
}
}
子面板1
public class NewSession extends JPanel {
MainPanel ob2 = new MainPanel();
public NewSession(){
JButton newSessionBTN = new JButton("Create A New Session");
newSessionBTN.addActionListener(new ActionListener(){
@Override
public void actionPerformed(ActionEvent e){
System.out.println("HI");
ob2.showPanel("ChooseSource");
}
});
add(newSessionBTN);
}
}
小组2
public class ChooseSource extends JPanel {
public ChooseSource(){
JLabel showMe = new JLabel("Show Me");
JButton back = new JButton("Back");
//MainPanel ob = new MainPanel();
back.addActionListener(new ActionListener(){
@Override
public void actionPerformed(ActionEvent e){
//ob.showPanel("start");
}
});
add(back);
add(showMe);
}
}
如你所见,我在每个子面板上都有按钮,这些按钮必须在点击后显示另一个面板。稍后,他们还将把数据从一个传输到另一个。
错误:
Exception in thread "main" java.lang.StackOverflowError
at java.awt.Component.setFont(Component.java:1899)
at java.awt.Container.setFont(Container.java:1748)
at javax.swing.JComponent.setFont(JComponent.java:2751)
at javax.swing.LookAndFeel.installColorsAndFont(LookAndFeel.java:208)
at javax.swing.plaf.basic.BasicPanelUI.installDefaults(BasicPanelUI.java:66)
at javax.swing.plaf.basic.BasicPanelUI.installUI(BasicPanelUI.java:56)
at javax.swing.JComponent.setUI(JComponent.java:663)
at javax.swing.JPanel.setUI(JPanel.java:153)
at javax.swing.JPanel.updateUI(JPanel.java:126)
at javax.swing.JPanel.<init>(JPanel.java:86)
at javax.swing.JPanel.<init>(JPanel.java:109)
at javax.swing.JPanel.<init>(JPanel.java:117)
at InnerPanels.NewSession.<init>(NewSession.java:21)
at StrongBaseLayout.MainPanel.<init>(MainPanel.java:22)
通过重复最后两行,错误要比这个长。
我怎样才能让它工作?
我还有另一个想法,在页面底部有一个“下一个”和“上一个”按钮来切换面板。但我不确定哪一个是最佳的。知道吗?
每当你看到一个意外的堆栈溢出错误
时,一定要注意是否存在不经意的递归,事实上,这正是你在这里要做的,因为MainPanel创建了一个NewSession对象,然后创建了一个新的MainPanel对象,然后创建了一个新的NewSession对象,然后创建了一个新的MainPanel对象。。。。无限重复或直到堆栈内存(因此堆栈溢出)耗尽。
在这里:
public class NewSession extends JPanel {
MainPanel ob2 = new MainPanel(); // *****
这里:
public class MainPanel extends JPanel {
private CardLayout cl = new CardLayout();
private JPanel panelHolder = new JPanel(cl);
public MainPanel() {
NewSession session = new NewSession(); // *****
不要那样做。相反,要注意创建每个对象中的一个,并且只创建一个。使用setter方法或构造函数参数来帮助您实现这一点。
例如,更改为:
public class NewSession extends JPanel {
MainPanel ob2;
NewSession(MainPanel mainPanel) {
this.ob2 = mainPanel;
还有这个:
public class MainPanel extends JPanel {
private CardLayout cl = new CardLayout();
private JPanel panelHolder = new JPanel(cl);
public MainPanel() {
NewSession session = new NewSession(this);
关于:
我还有另一个想法,在页面底部有一个“下一个”和“上一个”按钮来切换面板。但我不确定哪一个是最佳的。知道吗?
我不知道你在这里是什么意思。定义“最优”。
问题内容: 我用Google搜索了很多东西,但没有找到解决方案。我认为应该有Java大师来帮助我… 这是我的初始化方法: 这是JPanel另一个步骤0的方法: 完全没有任何回应,我尝试过重新验证,重新粉刷和其他工作人员…不起作用…任何人在这里都可以得到意见! 问题答案: 这就是将正确的方法和常量String暴露给外界,以允许类交换视图本身。例如,给您的第一堂课一个私有的CardLayout字段,称
我正在创建一个代码,在那里我需要改变面板的颜色,当我通过它时,我仍然按在上面。例如,假设我按下一个绿色面板,然后拖动它到另一个面板上,这个面板应该是绿色的。然而,它并不是每次都起作用,就像有时它会改变颜色,但有时它不会。 这是Carre的代码(法语为正方形) 我不明白的是为什么它有时会起作用,我不知道问题是否来自我如何做我的拖拽事件,或者是其他地方出了问题。 谢谢你的雨篷。
我有一个CardLayout,由许多不同的JPanels组成,我可以随意显示。该GUI链接到后端,并且GUI的目的是允许用户操作存储在后端中的数据。 问题是,当用户更改后端中的一些数据时,我的JLabels没有反映该数据中的更改。我明白这是因为JLabels初始化了一次,当我更新它们初始化到的变量时,我必须再次调用setText,以便它们体验更改。 示例:我的JLabel是如何初始化的 问题是,当
问题内容: 我创建了一个框架,然后在其中创建了面板。我已经将图像放置在一个 面板中,现在我需要将该图像拖动到另一个面板中。我该怎么做。 请作为初学者逐步说明。 问题答案: 使用纯Java的快速示例DragGestureListener,DropTargetAdapter并 TransferHandler为一个面板上的图像对另一面板的DnD支持: 选择绿色形状并将其拖动到上方的空白面板后:
问题内容: 我试图用来显示两个,一个主菜单和一个控件屏幕。当我将两张卡片添加到卡中时,它只会显示两张闪烁的图像。这是我的代码: MazeGamePanel: 公共类MazeGamePanel扩展了JPanel实现Runnable { } MazeControlsPanel: 包装屏幕; 问题答案: 这是一个问题: 不要在Swing程序中使用java.util.Timer,因为您会遇到线程问题。而是
问题内容: 因此,我最近开始涉足OOP,到目前为止一切进展顺利。虽然我本身没有任何问题,但我希望有一个令人惊奇的功能,尽管我找不到关于该功能的任何文档。 在为对象分配属性时,我经常发现我必须更改依赖于他人的属性,例如光明与黑暗。这是一个例子: 现在,尽管这很酷,但我想要的是相同的过程,但是如果一个属性发生更改,则在同一对象内。如果我重置光的属性(是的),我希望黑暗相应地增加/减少。如果可以更改光的