【问题标题】:JPanel on a JPanel in a JFrame will not showJFrame 中的 JPanel 上的 JPanel 不会显示
【发布时间】:2011-05-24 21:25:30
【问题描述】:

你好 我是一名业余爱好者,试图通过编写射箭记分卡来学习/提高我对 Java 的理解。我正在尝试制作一个 GUI,到目前为止,我已经在 J​​Panel 上成功制作了一排 18 个不同大小和颜色的标签,适合打一打。
然后,我尝试将其中五个“标签面板”添加到另一个面板以构建网格,并且在某些情况下无需创建和添加多达 150 个标签。没有成功,因为原始标签面板不会显示。所有面板都显示在 JFrame 上

我已经尝试了许多不同的方法来让代码工作,使用 Java 教程和谷歌搜索互联网并在这个网站上研究类似的问题,但我正在兜圈子。我一定是在什么地方漏掉了什么,希望你能提供帮助。

我使用 Java 6 和 JGrasp v1.8.8_01 作为 IDE

标签面板的以下代码已被删减,因为其中大部分是重复的。

import javax.swing.*;  
import java.awt.*;  
public class ArrowScoreLabels extends JPanel{
  public  JPanel createContentPane(){
    JPanel panelForLabels = new JPanel();
    panelForLabels.setLayout(null);
//Code creates 18 labels, sets the size, position, background colours, border and    
//font and adds the labels to the’panelForLabels
    JLabel scorelabel1;
     scorelabel1 = new JLabel("",JLabel.CENTER);
     scorelabel1.setBorder(BorderFactory.createLineBorder(Color.black)); 
     scorelabel1.setFont(new Font("Arial", Font.ITALIC, 26));  
     scorelabel1.setLocation(0, 0);//first value differs for each label
     scorelabel1.setSize(35, 35);
     scorelabel1.setOpaque(true);

        panelForLabels.add(scorelabel1);
        panelForLabels.setOpaque(true);
    return panelForLabels;
  }
}  

运行以下类会显示面板上的 18 个标签

import javax.swing.*;
import java.awt.*; 
public class TestArrowScoreLabels {

  private static void createAndShowArrowLabels() {
 //Create and set up the window.
  JFrame frame = new JFrame("To score one dozen");
 //Create and set up the content pane.
  ArrowScoreLabels asl = new ArrowScoreLabels();
  frame.setContentPane(asl.createContentPane()); 
  frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); 
  frame.setSize(676, 73);
  frame.setVisible(true);
  }
//Main method to show the GUI/
  public static void main(String[] args) {
    SwingUtilities.invokeLater(
     new Runnable() {
      public void run() {
      createAndShowArrowLabels();
      }
    });
  }
}

第二个面板的以下代码类似,可编译但仅显示第二个绿色 JPanel 而不是带有标签的面板。

import javax.swing.*;
import java.awt.*;


public class FiveDozenScorePanel{
 public JPanel createContentPane(){
  //A bottom JPanel on which to place five dozenpanels.
  JPanel fivedozenpanel = new JPanel();
  fivedozenpanel.setLayout(null); //requires absolute spacing
  fivedozenpanel.setSize(676,185);  
  fivedozenpanel.setBackground(Color.green);
  //Label panels for five dozen
  ArrowScoreLabels dozenscorepanel1, dozenscorepanel2,
         dozenscorepanel3,dozenscorepanel4,dozenscorepanel5;   
  //Create the 5 dozenscorelabels.
  dozenscorepanel1 = new ArrowScoreLabels();         
  dozenscorepanel1.setLocation(5,5);//y value changes for each panel

  fivedozenpanel.add(dozenscorepanel1);//plus the other 4
  fivedozenpanel.setOpaque(true);
  return fivedozenpanel;
}

private static void createAndShowDozenPanels() {
 JFrame frame = new JFrame("To score five dozen");
  FiveDozenScorePanel fdsp = new FiveDozenScorePanel();
  frame.setContentPane(fdsp.createContentPane());   
  frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); 
  //Display the window  
  frame.setSize(700, 233);
  frame.setVisible(true);
 }   

public static void main(String[] args) {
 SwingUtilities.invokeLater(
  new Runnable() {
   public void run() {                     
     createAndShowDozenPanels();
   }
  });               
 }
}

我也试过 frame.getContentPane().add(fdsp); - 框架.pack();并阅读了很多关于绘画方法的信息,以至于我完全糊涂了。 我可以让 ArrowScoreLabels 图像直接出现在 JFrame 而不是 JPanel 上,但只有其中一个而不是五个。

如果能指出正确的方向,我将不胜感激。谢谢你的时间。

更新 - 2010 年 12 月 14 日 我设法在 JFrame 上的另一个 Jpanel 上显示 panelForLabels Jpanel。这是通过将以下代码添加到类 ArrowScoreLabels 来完成的。原来的 createContentPane() 方法被重命名为 createRowOne()。 panelForLabels 是红色的,而五个面板是黄色的,以确定哪个正在显示。然而,尽管进行了大量的实验和研究,我还是只能说服程序显示一行标签。

public  static JPanel createContentPane(){
   //Bottom panelto hold rows of labels
     JPanel fivedozenscorepanel = new JPanel();      
     fivedozenscorepanel.setLayout(null);//requires absolute spacing
     fivedozenscorepanel.setSize(660,180);
     fivedozenscorepanel.setBackground(Color.yellow);
     fivedozenscorepanel.add(createRowOne());

     fivedozenscorepanel.setOpaque(true);
     return fivedozenscorepanel;
  }

我显示 5 行 18 个标签的唯一方法是在 ArrowScoreLabels 类中创建所有 90 个标签,然后使用绝对间距将它们添加到一个 JPanel,然后再添加到 JFrame。 我已经注意到 pstantons 的建议 - 谢谢你 - 我正在考虑使用 MigLayout 管理器。

【问题讨论】:

  • 您是否在面板或标签上致电setVisible(true);
  • 不,我一直在调用 setOpaque(true);
  • 标签和面板上的 setVisible(true) 似乎没有什么区别。

标签: java swing


【解决方案1】:

简单的答案:使用布局管理器。不要使用绝对定位。

只需注释掉您对setLocationsetLayout 的所有调用,swing 将使用默认的FlowLayout

要对显示进行更多控制,请使用不同的布局管理器。

此外,如果您使用多个面板,您将难以在不同面板中对齐内容,除非它们包含相同数量且尺寸完全相同的组件,因此请考虑为所有标签使用一个面板。

您可以使用MigLayout 实现几乎任何您需要的布局。

编辑:在您的示例中,ArrowScoreLabels 不需要扩展 JPanel,因为您正在 createContentPane 中进行工作以构建单独的 JPanel。稍后在您的代码中调用new ArrowScoreLabels(),它将只返回一个空白的JPanel,而不是您需要调用new ArrowScoreLabels().createContentPane()

如果您希望ArrowScoreLabels 扩展JPanel,请实现public ArrowScoreLabels() 即构造函数而不是createContentPane

【讨论】:

  • 我已将标签面板的 Layout 更改为 GridLayout(1,18),它仍然会生成 18 个标签,尽管它们的大小都相同,这是我希望避免的。将 Fivedozenpanel 设置为 GridLayout(5,1) 会导致白色框架而不是绿色面板。我将面板设为绿色,看看它是否已涂漆。
  • 这可能与标签面板不在事件调度线程中有关吗?
  • 不,我认为您还不需要担心 EDT。看我的编辑^
  • 感谢您提供指向 MigLayout 的链接,我会跟进。
  • 见下面的链接...我想你搞混了你是怎么称呼ArrowScoreLabels
【解决方案2】:

我的印象是您没有为您的几十个核心面板1 设置大小。所以,设置一个大小:-)

注意布局空,因为它很痛苦;你总是忘记一些事情。自己编写,或使用现有的。

【讨论】:

  • 我已经为五打分数面板设置了一个大小,但输出没有区别。
  • 如果我将标签面板布局重置为 null 并将 Fivedozenpanel 布局重置为 null,调整打板的大小并设置 Locations 输出是一个绿色面板,其中白色条带对应于标签面板的位置,尽管对于出于某种原因,第一个不符合要求。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2014-10-02
  • 1970-01-01
  • 2013-09-22
  • 1970-01-01
  • 2011-07-18
  • 2014-03-16
相关资源
最近更新 更多