在paint(g)中设置JLabel的文本 - 这是错的吗?

时间:2012-11-15 03:05:30

标签: java applet

代码片段在这里:

        int area;
        int[] xcoords = new int[3];
        xcoords[0] = coordsAX;
        xcoords[1] = coordsBX;
        xcoords[2] = coordsCX;
        sortArray(xcoords);
        int[] ycoords = new int[3];
        ycoords[0] = coordsAY;
        ycoords[1] = coordsBY;
        ycoords[2] = coordsCY;
        sortArray(ycoords);
        //Remember, array[0] is the biggest and array[2] is the smallest!
        int rectWidth = xcoords[0] - xcoords[2];
        int rectHeight = ycoords[0] - ycoords[2];

        area = (rectWidth * rectHeight);
        System.out.println(area);
        lblArea.setText("Area: " + area);

整个代码都在我的applet的paint(g)方法中。我的目标是让用户能够看到JLabel。计算完全没问题。但是当我运行时,applet看起来像:

enter image description here

我已经知道setText行不应该在paint(g)中,但是,在这种情况下,它应该去哪里以使JLabel保持不变,直到生成一个新的三角形(通过单击“点击我“按钮”?

请注意,我是一名高中生,自学Java,因此,我对该语言的了解看起来像是一块瑞士奶酪。我很感激解释不能解释太多高于基本applet制作水平的主题。 :)

感谢任何帮助!谢谢!

1 个答案:

答案 0 :(得分:2)

大概你有一个动作监听器附加到“点击我”按钮。

当触发动作时,我会在那时更新标签和UI。

您可能希望阅读How to Write an Action Listener

(我也有点担心看起来你使用的是AWT而不是Swing,但我可能会弄错;)

更新示例

enter image description here

public class TestArea {

    public static void main(String[] args) {
        new TestArea();
    }

    public TestArea() {
        EventQueue.invokeLater(new Runnable() {
            @Override
            public void run() {
                try {
                    UIManager.setLookAndFeel(UIManager.getSystemLookAndFeelClassName());
                } catch (ClassNotFoundException | InstantiationException | IllegalAccessException | UnsupportedLookAndFeelException ex) {
                }

                JFrame frame = new JFrame();
                frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
                frame.setLayout(new BorderLayout());
                frame.add(new AreaPane());
                frame.pack();
                frame.setLocationRelativeTo(null);
                frame.setVisible(true);
            }
        });
    }

    public class AreaPane extends JPanel {

        private JLabel areaLabel;

        public AreaPane() {
            areaLabel = new JLabel("Area: ...");
            JButton clickMe = new JButton("Click Me");
            clickMe.addActionListener(new ActionListener() {

                @Override
                public void actionPerformed(ActionEvent e) {
                    areaLabel.setText("Area: " + NumberFormat.getNumberInstance().format(Math.random() * 1000));
                    // update UI as required
                }

            });

            add(areaLabel);
            add(clickMe);
        }
    }
}