JLabels没有露面

时间:2015-12-10 19:44:00

标签: java swing user-interface

我想弄清楚为什么我看不到我的标签就像当我试图将2个标签放入1个面板中时它们消失了,我唯一可以看到让它起作用的方法就是如果我将所有内容添加到{{1没有任何类型的层次结构。

override func viewDidLoad() {
  super.viewDidLoad()

  let tableView = self.tableView
  let containerView = UIView(frame: self.view.bounds)
  containerView.addSubview(tableView)
  containerView.addSubview(spinner)      
  view = containerView

  spinner.translatesAutoresizingMaskIntoConstraints = false
  view.addConstraint(NSLayoutConstraint(item: spinner, attribute: .CenterX, relatedBy: .Equal, toItem: view, attribute: .CenterX, multiplier: 1, constant: 0))
  view.addConstraint(NSLayoutConstraint(item: spinner, attribute: .CenterY, relatedBy: .Equal, toItem: view, attribute: .CenterY, multiplier: 1, constant: 0))

  spinner.startAnimating()
}

2 个答案:

答案 0 :(得分:4)

由于您发布了大量代码而且我不确定您要实现的目标,因此我修改了代码,在JLabel添加了3 topPane s。在JRadioButtons上有3 ButtonGroup(我没有添加JPanel),我评论了如何使它们在垂直和水平对齐上显示。

你应该考虑的事情是:

  • 不要从JFrame扩展和创建对象(一个或另一个,不是两个,我建议您创建对象)。

  • 您在向添加组件后给JPanel布局,应该之前

  • 从上述观点来看,您还将布局提供给JLabel而不是JPanel

  • 您正在JList添加JLabel

  • 你也错过了一个类构造函数。

  • 多了JFrames多了The use of multiple JFrames, Good / Bad practice

  • 下次发布没有依赖关系的代码,例如TruckCarMotorcycle类(即Runnable example)。并使用纯文本,以便我们可以复制粘贴代码并查看问题。也尝试发布图像(或链接,我们可以编辑添加它)。

现在,我自己的计划的结果是:

enter image description here enter image description here

使用以下代码完成。

import javax.swing.*;
import java.awt.*;
public class GUIExample {
    JFrame frame;
    JLabel label1, label2, label3;
    JPanel topPane, radioPane;
    JRadioButton radio1, radio2, radio3;
    public static void main(String[] args) {
        new GUIExample();
    }

    GUIExample () {
        frame = new JFrame();

        topPane = new JPanel();
        radioPane = new JPanel();
        topPane.setLayout(new FlowLayout());
        // radioPane.setLayout(new BoxLayout(radioPane, BoxLayout.PAGE_AXIS)); //Vertical align
        radioPane.setLayout(new FlowLayout()); //Horizontal align

        label1 = new JLabel("Car");
        label2 = new JLabel("Motorcycle");
        label3 = new JLabel("Truck");

        radio1 = new JRadioButton("Radio1");
        radio2 = new JRadioButton("Radio2");
        radio3 = new JRadioButton("Radio3");

        topPane.add(label1);
        topPane.add(label2);
        topPane.add(label3);

        radioPane.add(radio1);
        radioPane.add(radio2);
        radioPane.add(radio3);

        frame.add(topPane, BorderLayout.PAGE_START);
        frame.add(radioPane, BorderLayout.CENTER);
        frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        frame.pack();
        frame.setVisible(true);
    }
}

答案 1 :(得分:3)

您的代码有几个问题,但您没有看到tireLabel或tbuttons组件的原因是因为您使用的是JLabel。了解JLabel不是为了充当其他组件的容器而构建的。关键概念是它根据它所持有的文本和/或它所拥有的图标计算其首选大小(这是关键)不是它可能包含的任何组件的大小或首选大小

解决方案是不要将JLabel用于其不打算使用的目的,而是使用JPanel,它根据其所保持的组件的大小及其布局调整其自己的首选大小。

其他无关的问题:

  • 您的程序扩展了JFrame,但从未将自己用作JFrame,这会让任何读取代码的人感到困惑。如果您不打算将该类的实例用作JFrame,则不要扩展该类。
  • 你的程序不是一个符合OOP的程序,一个带有实例字段,公共方法等等,而只是一个大的静态main方法,这将导致一个大的上帝方法,一个责任太大,而且很难调试和维护。不要用洗澡水扔掉OOP宝宝 - 以符合OOP标准的方式创建Swing GUI。
  • 您尝试将背景颜色设置为不透明的组件(JLabel),将组件从未添加到GUI(label1),或者未完全显示(JFrame)。
  • 你正在使用FlowLayout,并且在其他布局可能会更好地为你服务的地方。这就好像它是您知道如何使用的唯一布局,因此您使用它。尝试分支并使用其他布局,包括用于JRadioButton容器的GridLayout,以及主容器(JPanel)的BorderLayout。