【问题标题】:GridBagLayout putting all objects in the same cellGridBagLayout 将所有对象放在同一个单元格中
【发布时间】:2026-02-17 02:50:01
【问题描述】:

我正在为布局管理器使用 gridbaglayout 编写一个快速天气应用程序。然而 gridbag 拒绝将 JLabel 对象放入定义的单独单元格中,而是将它们全部放入一个单元格中。

public class WeatherApp extends JFrame {

private JLabel jDayOfTheWeek;
RSSReader rss = null;
private JLabel jWindDirectionToday;
private JLabel jWindSpeed1;
private JLabel jMaxTemp1;
private JLabel jMinTemp1;
private JLabel jVisibility1;
private JLabel jPressure1;
private JLabel jHumidity1;
private JLabel jWindSpeed2;
private JLabel jMaxTemp2;
private JLabel jMinTemp2;
private JLabel jVisibility2;
private JLabel jPressure2;
private JLabel jHumidity2;
private JLabel jWindSpeed3;
private JLabel jMaxTemp3;
private JLabel jMinTemp3;
private JLabel jVisibility3;
private JLabel jPressure3;
private JLabel jHumidity3;

public WeatherApp() {


    this.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
    this.setTitle("Detailed weather");
    this.setSize(320,480);
    GridBagLayout myLayout = new GridBagLayout();
    JPanel mainFrame = new JPanel(myLayout);
    rss = new RSSReader();
    GridBagConstraints c = new GridBagConstraints();



    c.gridwidth = 4;
    c.gridheight = 10;

    jDayOfTheWeek = new JLabel("lelel");
    jDayOfTheWeek.setText(this.getDayOfTheWeek());
    c.anchor = GridBagConstraints.FIRST_LINE_START;
    c.gridx = 0;
    c.gridy = 0;

    c.weightx = 1;
    c.weighty = 1;


    mainFrame.add(jDayOfTheWeek, c);



    jWindDirectionToday = new JLabel(rss.getFirstDay().getWindDirection());
     c.anchor = GridBagConstraints.CENTER;
    c.gridx = 2;
    c.gridy = 2;
     c.weightx = 1;
    c.weighty = 1;
    mainFrame.add(jWindDirectionToday, c);


    jWindSpeed1 = new JLabel(Integer.toString(rss.getFirstDay().getWindSpeed()) + "mph");
    c.gridx = 3;
    c.gridy = 3;
     c.weightx = 1;
    c.weighty = 1;
    mainFrame.add(jWindSpeed1, c);


    jMaxTemp1 = new JLabel(Integer.toString(rss.getFirstDay().getMaxTemp()) + "C");
    c.gridx = 4;
    c.gridy = 4;
     c.weightx = 1;
    c.weighty = 1;
    mainFrame.add(jMaxTemp1, c);



    this.add(mainFrame);



}

public String getDayOfTheWeek() {
    Calendar c = Calendar.getInstance(TimeZone.getDefault());

    Date currentDate = c.getTime();
    return new SimpleDateFormat("EEEE").format(currentDate);



}

public static void main(String[] args) {
    WeatherApp myapp = new WeatherApp();
    myapp.setVisible(true);

}

现在,如果您查看代码,JLabels 已分配到不同的网格位置:0,0 2,2 3,3 和 4,4 但是当我编译和执行所有网格位置时的结果被忽略,但是如果在锚定这些常量时,我​​使用了 gridbagconstraints 的常量。

【问题讨论】:

  • 你必须 1.(GBC 是基于列的)将不可见的(几个空的 JLabel)放到第一行,2.第一行的 JLabel 将占据所需的列数

标签: java swing gridbaglayout


【解决方案1】:

删除下一行,您的标签将位于正确的位置:

c.gridwidth = 4;
c.gridheight = 10;

【讨论】:

    【解决方案2】:

    我也遇到了这个问题,但是选择的解决方案并没有解决我的问题。经过大量研究和艰苦的反复试验,我还发现这可能是由于将同一个对象放在多个单元格中造成的。

    显然,GridBagLayout 要求每个单元格都有自己的单独对象。否则,只会填充第一个单元格(因为该对象当时是 GridBagLayout 的新对象)。

    【讨论】:

      最近更新 更多