无法使用方法中的html创建新的JLabel

时间:2015-02-20 07:35:38

标签: java swing jlabel

我正在尝试在Java中创建一个修复宽度标签,我找到了一个解决方案here。 但是每当我在标签内放置任何内容时我都会失败 - 而标签是在方法中创建的。

我的代码在这里:

public class testingGui

    JFrame myframe      = new JFrame("Some title here");
    Container pane_ctn  = myframe.getContentPane();

    public static void main(String[] args){
        testingGui gui = new testingGui();
        gui.init();
    }

    private void init(){

        myframe.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        myframe.setSize(320, 480);
        myframe.setVisible(true);
        pane_ctn.setLayout(new BoxLayout(pane_ctn, BoxLayout.PAGE_AXIS));

        JLabel lable = new JLabel("<html>Java is a general-purpose computer programming language</html>");  
        pane_ctn.add(lable);

    }

}

JLabel lable = new JLabel("<html>Java is a general-purpose computer programming language</html>");永远不会运行。 (并且即使添加了其他UI元素,也将pane_ctn变为空白)

但是我发现它可以在标签创建为字段时起作用,如下所示:

public class testingGui {

    JFrame myframe      = new JFrame("Some title here");
    Container pane_ctn  = myframe.getContentPane();
    JLabel lable = new JLabel("<html>Java is a general-purpose computer programming language</html>");  

    // I just cut the whole line and paste here, nothing else has changed.
    /* ...  */
}

所以这是我的问题: 如何在方法调用中使用html创建标签的正确方法是什么?我需要它在飞行中创建。谢谢。


编辑:

谢谢你ybanen给我一个很好的答案,还有其他帮手。

现在我可以创建看起来很好的Label。

2 个答案:

答案 0 :(得分:1)

这是因为您尝试在显示后修改GUI。在您的情况下,最好是创建整个GUI,然后显示框架:

public class TestingGui {

    public static void main(final String[] args) {
        final JLabel label = new JLabel("<html>Java is a general-purpose computer programming language</html>");

        final JFrame frame = new JFrame("Test");
        final Container contentPane = frame.getContentPane();
        contentPane.setLayout(new BoxLayout(contentPane, BoxLayout.PAGE_AXIS));
        frame.getContentPane().add(label);
        frame.setSize(320, 480);
        frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        frame.setVisible(true);
    }
}

但是,如果您确实需要在显示GUI后添加标签,则必须遵循以下几条规则:

  1. 必须在事件调度线程(EDT)中完成对GUI的任何修改。
  2. 显示容器后,已经布置好了。因此,如果要在内部添加新组件,则必须强制其内容布局(使用revalidate()然后repaint())。

答案 1 :(得分:1)

  

我需要它在飞行中创建。

为什么呢?或者更确切地说,为什么不在启动时创建和添加标签,然后在需要时设置文本?

  

我的示例是待办事项列表,我有一个存储数据的数组,标签是在for循环中创建的。

使用JList

enter image description here

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

public class EditableList {

    private JComponent ui = null;

    String[] items = {
        "Do 100 push ups.",
        "Buy a book.",
        "Find a cat.",
        "Java is a general purpose computer language that is concurrent, "
            + "class based, object oriented and specifically designed to have "
            + "as few implementation dependencies as possible.",
        "Conquer the world."
    };

    EditableList() {
        initUI();
    }

    public void initUI() {
        if (ui != null) {
            return;
        }

        ui = new JPanel(new BorderLayout(4, 4));
        ui.setBorder(new EmptyBorder(4, 4, 4, 4));

        JList<String> list = new JList<String>(items);
        list.setCellRenderer(new ToDoListRenderer());
        list.getSelectionModel().setSelectionMode(
                ListSelectionModel.SINGLE_SELECTION);
        ui.add(new JScrollPane(list));

        JPanel controls = new JPanel(new FlowLayout(FlowLayout.CENTER));
        controls.add(new JButton("Edit Selected"));
        controls.add(new JButton("Delete Selected"));

        ui.add(controls, BorderLayout.PAGE_END);
    }

    class ToDoListRenderer extends DefaultListCellRenderer {

        @Override
        public Component getListCellRendererComponent(
                JList<? extends Object> list, 
                Object value, 
                int index, 
                boolean isSelected, 
                boolean cellHasFocus) {
            Component c = super.getListCellRendererComponent(
                    list, value, index, isSelected, cellHasFocus);
            JLabel l = (JLabel)c;
            l.setText("<HTML><body style='width: 250px;'>" + value.toString());

            return l;
        }

    }

    public JComponent getUI() {
        return ui;
    }

    public static void main(String[] args) {
        Runnable r = new Runnable() {
            @Override
            public void run() {
                try {
                    UIManager.setLookAndFeel(
                            UIManager.getSystemLookAndFeelClassName());
                } catch (Exception useDefault) {
                }
                EditableList o = new EditableList();

                JFrame f = new JFrame("To Do List");
                f.setDefaultCloseOperation(JFrame.DISPOSE_ON_CLOSE);
                f.setLocationByPlatform(true);

                f.setContentPane(o.getUI());
                f.pack();
                f.setMinimumSize(f.getSize());

                f.setVisible(true);
            }
        };
        SwingUtilities.invokeLater(r);
    }
}