Java 在构造函数外部添加的组件不会出现

Java 在构造函数外部添加的组件不会出现,java,swing,layout-manager,Java,Swing,Layout Manager,我有一个选项卡,在程序运行时需要使用它的类中的两个方法之一进行更新,因此我在方法中添加组件,但无法显示其中任何一个。据我所知,这是因为它们在构造函数之外,我过去常常在方法内部声明它们,但为了解决这个问题,我将其移动了。任何帮助都将不胜感激 很抱歉,这有点混乱,我一直在试图解决这个问题,有点盲目 此外,代码编译良好,并且println输出在代码中按预期显示 /* * To change this template, choose Tools | Templates * and open the

我有一个选项卡,在程序运行时需要使用它的类中的两个方法之一进行更新,因此我在方法中添加组件,但无法显示其中任何一个。据我所知,这是因为它们在构造函数之外,我过去常常在方法内部声明它们,但为了解决这个问题,我将其移动了。任何帮助都将不胜感激

很抱歉,这有点混乱,我一直在试图解决这个问题,有点盲目

此外,代码编译良好,并且println输出在代码中按预期显示

/*
 * To change this template, choose Tools | Templates
 * and open the template in the editor.
 */
package assgui;

import java.awt.*;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import javax.swing.*;
import java.io.*;
/**
 *
 * @author Hugh
 */
public class ResultPanel extends JPanel {

    static String[][] activityString = new String[31][2];
    static String[][] foodString = new String[36][2];

        String weighstr, foodstr, servstr, kjstr, actstr, hourstr, minstr, metstr;

        JLabel uw = new JLabel ("User Weight:  ");
        JLabel weigh = new JLabel (weighstr);
        JLabel kg = new JLabel("  kg");
        JLabel sel1 = new JLabel("Food:  ");
        JLabel sel2 = new JLabel(foodstr);
        JLabel sel3 = new JLabel("  -  kj  ");
        JLabel sel4 = new JLabel(kjstr);
        JLabel sel5 = new JLabel("  ,  Servings:  ");
        JLabel sel6 = new JLabel(servstr);
        JLabel sel7 = new JLabel("Activity for comparison:  ");
        JLabel sel8 = new JLabel(actstr);
        JLabel sel9 = new JLabel("  Time required to balance:  ");
        JLabel sel10 = new JLabel(hourstr);
        JLabel sel11 = new JLabel("  hours");
        JLabel sel12 = new JLabel(minstr);
        JLabel sel13 = new JLabel("  minutes");
        JLabel smlspace = new JLabel("          ");
        JLabel medspace = new JLabel("               ");
        JLabel lrgspace = new JLabel("                         ");

        JLabel auw = new JLabel("User Weight:  ");
        JLabel aweigh = new JLabel(weighstr);
        JLabel akg = new JLabel("  kg");
        JLabel asel1 = new JLabel("Activity:  ");
        JLabel asel2 = new JLabel(actstr);
        JLabel asel3 = new JLabel("  -  MET  ");
        JLabel asel4 = new JLabel(metstr);
        JLabel asel5 = new JLabel("  ,  Duration:  ");
        JLabel asel6 = new JLabel(hourstr);
        JLabel asel7 = new JLabel("  hour  ");
        JLabel asel8 = new JLabel(minstr);
        JLabel asel9 = new JLabel("  minutes  ");
        JLabel asel10 = new JLabel("Food for comparison:  ");
        JLabel asel11 = new JLabel(foodstr);
        JLabel asel12 = new JLabel("  Servings to balance:  ");
        JLabel asel13 = new JLabel(servstr);
        JLabel asmlspace = new JLabel("          ");
        JLabel amedspace = new JLabel("               ");
        JLabel alrgspace = new JLabel("                         ");

        Public ResultPanel() {
        setBackground(Color.GREEN);
        setPreferredSize(new Dimension(650, 600));
        {

    public void activityPaint (String[][] actstring, String[][] foodstring, double        weight, int activity, int hour, int min, int food, double servings) {

        System.out.println("act1");
        weighstr = Double.toString(weight);
        actstr = activityString[activity][0];
        hourstr = Integer.toString(hour);
        minstr = Integer.toString(min);
        metstr = activityString[activity][1];
        foodstr = foodString[food][0];
        servstr = Double.toString(servings);

        add(lrgspace);
        add(uw);
        add(weigh);
        add(kg);
        add(medspace);
        add(sel1);
        add(sel2);
        add(sel3);
        add(sel4);
        add(sel5);
        add(sel6);
        add(sel7);
        add(sel8);
        add(sel9);
        add(sel10);
        add(sel11);
        add(sel12);
        add(sel13);

    }

    public void foodPaint(String[][] foodstring, String[][] actstring, double weight, int food, int servings, int activity, int hour, int min) {

        System.out.println("food1");
        weighstr = Double.toString(weight);
        foodstr = foodString[food][0];
        servstr = Integer.toString(servings);
        kjstr = foodString[food][1];
        actstr = activityString[activity][0];
        hourstr = Integer.toString(hour);
        minstr = Integer.toString(min);


        add(lrgspace);
        add(uw);
        add(weigh);
        add(kg);
        add(medspace);
        add(sel1);
        add(sel2);
        add(sel3);
        add(sel4);
        add(sel5);
        add(sel6);
        add(sel7);
        add(sel8);
        add(sel9);
        add(sel10);
        add(sel11);
        add(sel12);
        add(sel13);

    }

}
创建此JPanel的主方法(或任何方法)是否也调用activityPaint(…)和foodPaint(…)方法?如果不调用这些方法,那么它们似乎永远不会被添加到面板中。如果希望在创建JPanel时添加所有内容,则必须让构造函数调用activityPaint()和foodPaint()

如果在发生其他情况(如用户输入)之前无法设置JLables的值,则可以在创建JPanel时添加组件,然后稍后调用setText(…)方法。只是要确保,如果你这样做,也设置大小,因为改变文本将影响。我更喜欢使用nameofjpanel.setSize(nameofjpanel.getPreferredSize())

希望这对你和我都有帮助。创建此JPanel的主要方法(或任何方法)是否也称为activityPaint(…)和foodPaint(…)方法?如果不调用这些方法,那么它们似乎永远不会被添加到面板中。如果希望在创建JPanel时添加所有内容,则必须让构造函数调用activityPaint()和foodPaint()

如果在发生其他情况(如用户输入)之前无法设置JLables的值,则可以在创建JPanel时添加组件,然后稍后调用setText(…)方法。只是要确保,如果你这样做,也设置大小,因为改变文本将影响。我更喜欢使用nameofjpanel.setSize(nameofjpanel.getPreferredSize())


希望这对您和我都有帮助。我没有完全错过您的目的。

使用一个
JTextArea
而不是一堆标签。结果将得到更好的格式和更可靠的结果。是我没有抓住
ResultPanel
类的构造函数在哪里,还是你没有指定它?所以问题来了,您在
问题标题中谈论的构造函数具体在哪里?
?作为旁白,行
ResultPanel a=newresultpanel()是错误的。它创建了一个从未添加到任何内容且从未显示的新面板。出于好奇,为什么这个空字符串附加了
JLabel
文本作为
JLabel sel3=new JLabel(“-kj”)
,为什么要使用这个邪恶的空格,还有更多的空格?我希望你记住这一点,@AndrewThompson和@HughBurger OP,你可以使用对齐,而不是空格,比如
JLabel.LEFT/RIGHT/CENTER
,你可以像
JLabel label=new JLabel(“我是一个JLabel”,JLabel.CENTER)
。我希望您没有忘记调用两个方法,它们负责向
JPanel
添加组件,即
foodPaint(…)和activityPaint(…)
使用单个
JTextArea
,而不是大量标签。结果将得到更好的格式和更可靠的结果。是我没有抓住
ResultPanel
类的构造函数在哪里,还是你没有指定它?所以问题来了,您在
问题标题中谈论的构造函数具体在哪里?
?作为旁白,行
ResultPanel a=newresultpanel()是错误的。它创建了一个从未添加到任何内容且从未显示的新面板。出于好奇,为什么这个空字符串附加了
JLabel
文本作为
JLabel sel3=new JLabel(“-kj”)
,为什么要使用这个邪恶的空格,还有更多的空格?我希望你记住这一点,@AndrewThompson和@HughBurger OP,你可以使用对齐,而不是空格,比如
JLabel.LEFT/RIGHT/CENTER
,你可以像
JLabel label=new JLabel(“我是一个JLabel”,JLabel.CENTER)
。我希望您没有忘记调用两个方法,它们负责将组件添加到
JPanel
中,即
foodPaint(…)和activityPaint(…)
我最终将addTab参数移动到我想要激活它们的按钮的ActionListener中,这是一个过于复杂和欠调制的方式来做,但它至少工作。感谢大家的帮助。我最终将addTab参数移动到了我想要激活它们的按钮的ActionListener,这是一种过于复杂和欠调制的方式,但至少可以工作。谢谢大家的帮助。