java - 使用方法在 Jpanel 内添加 JButton 时,如何保持最后添加的按钮在 View 中?

标签 java swing jpanel

每当我调用 add corePanel 或 add electivePanel 方法时,它们只是替换添加的最后一个按钮,而不是在我在 Jpanel 中设置的 4 列中并排添加一个新按钮。

我知道当变量实际上是按钮时我已将它们命名为“Panel”,但这无关紧要。

我真的需要一些帮助。

谢谢

编辑: 现在,当我将鼠标悬停在按钮上时,其中的所有信息(Jpanels)都会消失?

package Assignment2.view;

import java.awt.Color;
import java.awt.GridLayout;
import javax.swing.BorderFactory;
import javax.swing.JButton;
import javax.swing.JFrame;
import javax.swing.JLabel;
import javax.swing.JPanel;
import javax.swing.border.Border;

import ams.model.Course;

public class CoursePanel extends JPanel 
{
private JButton corePanel = new JButton();
private JButton electivePanel = new JButton();
private JLabel ccLabel = new JLabel("Code: ");
private JLabel titleLabel = new JLabel("Title: ");
private JLabel cpLabel = new JLabel("Credit Points: ");
private JLabel prLabel = new JLabel("Prereqs: ");
private Border blackline;


public CoursePanel()
{   
    setLayout(new GridLayout(0,4));
}



public void addcorePanel(Course createcourse)
{
    // core panel properties
    blackline = BorderFactory.createLineBorder(Color.black,10);

    corePanel.setLayout(new GridLayout(4,1));
    corePanel.setBackground(Color.GRAY);
    corePanel.setBorder(blackline);
    corePanel.add(ccLabel);
    corePanel.add(titleLabel);
    corePanel.add(cpLabel);
    corePanel.add(prLabel);
    corePanel.setAlignmentX(LEFT_ALIGNMENT);
    corePanel.setAlignmentY(TOP_ALIGNMENT);

    //Needed to rebuild the prerequisites for display.
    String[] prereqs = null;
    String result = null;
    prereqs = createcourse.getPreReqs();

    if (prereqs != null)
    {
    StringBuilder builder = new StringBuilder();
    for(String s : prereqs) 
    {
        builder.append(s);
        builder.append("\n");
    }
    result = builder.toString();
    }
    ccLabel.setText("Code: " + createcourse.getCode());
    titleLabel.setText("Title: " + createcourse.getTitle());
    cpLabel.setText("Credit points: " + Integer.toString(createcourse.getCreditPoints()));
    prLabel.setText("Prereqs: " + result);

    add(corePanel);

}


public void addelectivePanel(Course createcourseE)
{


    //elective panel properties
    electivePanel.setLayout(new GridLayout(4,1));
    electivePanel.setBackground(Color.GRAY);
    electivePanel.add(ccLabel);
    electivePanel.add(titleLabel);
    electivePanel.add(cpLabel);
    electivePanel.add(prLabel);
    electivePanel.setAlignmentX(LEFT_ALIGNMENT);
    electivePanel.setAlignmentY(TOP_ALIGNMENT);

    //Needed to rebuild the prerequisites for display.
    String[] prereqs = null;
    String result = null;
    prereqs = createcourseE.getPreReqs();

    if (prereqs != null)
    {
    StringBuilder builder = new StringBuilder();
    for(String s : prereqs) 
    {
        builder.append(s);
        builder.append("\n");
    }
    result = builder.toString();
    }

    ccLabel.setText("Code: " + createcourseE.getCode());
    titleLabel.setText("Title: " + createcourseE.getTitle());
    cpLabel.setText("Credit points: " + Integer.toString(createcourseE.getCreditPoints()));
    prLabel.setText("Prereqs: " + result);


    add(electivePanel);


}

}

最佳答案

发生这种情况是因为您的标签和按钮(corePanelelectivePanel)是类变量,因此当您调用例如 addcorePanel 时,而不是创建一个新的 JButton 时,您正在操作相同的 corePanel 按钮。您应该将变量移到方法体内,如下所示:

public void addcorePanel(Course createcourse)
{
    JButton corePanel = new JButton();
    JLabel ccLabel = new JLabel("Code: ");
    JLabel titleLabel = new JLabel("Title: ");
    JLabel cpLabel = new JLabel("Credit Points: ");
    JLabel prLabel = new JLabel("Prereqs: ");

// ....

// ....
}

JLabelsJButtons 无法共享,因此每次调用方法时都必须创建新实例。

关于java - 使用方法在 Jpanel 内添加 JButton 时,如何保持最后添加的按钮在 View 中?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/12883762/

相关文章:

Java 数组被覆盖

java - 为什么当日期在 1970-01-01 之后时 java.sql.Timestamp 返回负值

java - 如何在 Storm 中发射和收集数组列表?

java - 来自另一个类的 JButton Action 监听器

java - 似乎无法让现有的 JPanel 添加更多的 JPanel

java - 如何在 JFrame 关闭后显示另一个 JFrame?

Java Swing 将 JPanel 添加到 JPanel

java - 如何在JPanel上使用GridLayout显示图像?

java - AlarmManager 在第二个间隔完成之前触发

java - 当应用程序关闭或在后台时,Admob 仍在发出请求?